图像处理Opencv

Posted LateNight_LL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理Opencv相关的知识,希望对你有一定的参考价值。

图像梯度

梯度:
对于图像,我们选定一定范围(可能是点边界,线边界,闭合边界),对于边界到边界图像像素点像素值的变化我们称之为梯度。

Sobel算子

概念:
Sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。Sobel算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
Sobel算子不但产生较好的检测效果,而且对噪声具有平滑抑制作用,但是得到的边缘较粗,且可能出现伪边缘。

核心公式
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像, G x G_x Gx G y G_y Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

前者 G x G_x Gx用于计算水平梯度,而后者 G y G_y Gy则用于计算垂直梯度。
注意:这里并不是矩阵的乘法,而是卷积即对应位置相乘运算。
图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

然后可用以下公式计算梯度方向。

下面介绍Sobel算子的语法:

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

参数:src就是计算的图像,ddepth为图像的深度,dx,dy表示是水平方向还是竖直方向,ksize表示Sobel算子的大小即上述进行矩阵卷积运算的矩阵规格大小。
这里给大家展示以下图像经过梯度运算的效果:
原图像:

经过梯度运算

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)

得到的图像:

这里我们可以看到dx我们取为1dy取0表示进行的是进行水平梯度运算,而我们发现运算过后的图像“边缘”,好像仅有原图的一半。那是因为通过Sobel算子的公式我们可以看到,对于水平梯度计算简单的看做右边减左边,对于原图的左边缘,边缘左边为黑即像素值为0,右边为白即像素值为255,进行运算得到边缘的像素值为正,而对于右边边缘,右边边缘的左边为255右边为0,进行运算得到的像素值为负,而在Opencv中会默认做一个截断,即凡小于0的像素值均取0,所以右半边边缘经过梯度计算后全部为0即为黑色不做显示。

我们可以通过Opencv中取绝对值的方法来得到完整边缘,下面展示竖直方向取过绝对值之后的计算结果

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#竖直方向梯度计算
sobely = cv2.convertScaleAbs(sobely)  #取绝对值


这里是不建议dx与dy即水平与垂直同时进行计算,因为这两种计算的计算结果都会影响彼此,从而使进行梯度运算变得模糊,在直观上好像是水平梯度与竖直梯度“融合的不太好”。

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy) 


如果有需要我们可以直接通过Opencv自带的加权加法进行合并两图。

Scharr算子和laplacian算子

Scharr算子
Scharr算子整体思路与Sobel算子没有区别,但是在计算上Scharr算子公式中数值更大,更加注重规定方向的影响,弱化了边缘(矩阵边缘不是图像边缘)的影响。
Scharr算子的计算公式

laplacian算子
laplacian算子具体思想与推导比较复杂就不给大家做演示了,它与前面提到的算子主要区别是前面算子都停留在一阶导的层面,而laplacian算子中提到了二阶导,所以laplacian算子相比于前面的算子会对“变化”会更加敏感,展现出来“变化”较大的地方会更加明显,但是因为对变化过于敏感,所以对于噪音点laplacian算子处理就不是很好,所以laplacian算子通常不会单独使用。
由公式也可以看出laplacian算子更注重于变化而不是强调方位。
laplacian算子的计算公式

以上是关于图像处理Opencv的主要内容,如果未能解决你的问题,请参考以下文章

opencv图像旋转,该怎么解决

图片处理-opencv-2.图像平滑

c++结合opencv能给载入图像并处理,我想知道,c++结合啥,可以实现处理gif图像

opencv 图像拉伸怎么做????

Python 图像处理 OpenCV :图像平滑(滤波)处理

Python 图像处理 OpenCV :图像平滑(滤波)处理