rambo

matlab和opencv计算图像梯度

1、Matlab gradient函数

Gradient(F)函数求的是数值上的梯度,假设F为矩阵.

计算规则: [Fx,Fy]=gradient(F),其中Fx为其水平方向上的梯度,Fy为其垂直方向上的梯度,Fx的第一列元素为原矩阵第二列与第一列元素之差,Fx的第二列元素为原矩阵第三列与第一列元素之差除以2,以此类推:Fx(i,j)=(F(i,j+1)-F(i,j-1))/2。最后一列则为最后两列之差。同理,可以得到Fy。
  • 如果F是一维矩阵,则FX=gradient(F,H)返回F的一维数值梯度。H是F中相邻两点间的间距。
  • 如果F是二维矩阵,返回F的二维数值梯度。  [FX,FY]=gradient(F,HX,HY)。HX,HY参数表示各方向相邻两点的距离,默认参数分别为1,1。 [z1,z2]=gradient(x,2,2);
  • 如果F是三维矩阵,返回F的三维数值梯度。[FX,FY,FZ]=gradient(F,HX,HY,HZ)。HX,HY,HZ参数表示各方向相邻两点的距离。

注意:Sobel算子计算的是像素值的二阶微分 (f(i+1,j) + f(i-1,j) - 2f(i,j)) / 2。

2、Matlab conv2函数及opencv实现

matlab conv2函数

1)前一节我们学习了图像的卷积操作。一个很自然的问题是如何处理卷积边缘。当卷积点在图像边界时会发生什么,如何处理这个问题?

2)大多数用到卷积操作的OpenCV函数都是将给定图像拷贝到另一个轻微变大的图像中,然后自动填充图像边界(通过下面示例代码中的各种方式)。这样卷积操作就可以在边界像素安全执行了(填充边界在操作完成后会自动删除)。

3)图像边界的两种方法:

BORDER_CONSTANT: 使用常数填充边界 (i.e. 黑色或者 0)

BORDER_REPLICATE: 复制原图中最临近的行或者列。

 opencv实现

输出数据到文件中,来验证是否处理正确

参考资料:
1、http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/copyMakeBorder/copyMakeBorder.html
2、http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/
3、http://blog.163.com/yuyang_tech/blog/static/216050083201352594630749/