我正在计算机视觉课程中完成我的任务。子任务之一是基于图像亮度的梯度方向计算。我制作了一个明亮[宽度][高度]矩阵,其中包含图像每个像素的亮度值。我有两个这样的功能:
double Image::grad_x(int x,int y){
if(x==width-1 || x==0) return bright[x][y];
return bright[x+1][y]-bright[x-1][y];
}
double Image::grad_y(int x,int y){
if(y==height-1 || y==0) return bright[x][y];
return bright[x][y+1]-bright[x][y-1];
}
编辑:边界检查已修复
我正在使用简单的导数,而不使用索贝尔运算符,因为简单的导数足以满足我的需求。
问题是,我是否正确地进行了这个梯度计算,以及我到底与边界像素有什么关系(现在函数返回像素本身的值,我不确定它是否准确)?顺便问一下,计算图像的梯度有什么用处吗?我想确保我的程序运行良好。
你的计算是正确的。这是您正在使用的一种简单的渐变方法,但如果这适合您的使用,那就没有问题。
极端情况是一个问题,因为您没有足够的数据来以与其他像素相同的方式计算梯度。处理这些问题的一种方法是简单地不计算极端情况并使用稍小的图像。
如果这不是一个选项,您也可以推断丢失的数据。如果你假设梯度变化平滑,它的工作原理如下:
在 x 梯度计算中,您可能计算了像素 1 的导数 A 和像素 2 的导数 B。如果您想推断像素 0(极端情况)的值,则可以使用值 a-(b-a)。
数值示例:
pixel1: gradient = 100
pixel2: gradient = 80
extrapolate using a-(b-a):
pixel0: gradient = 100 - (80-100)) = 120
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)