OpenCV学习笔记(6)--Image Gradients图像梯度

opencv提供了三种梯度过滤器或高通过滤器Sobel、Scharr、Laplacian.(高通滤波器high-pass fliter(HPF) 寻找图片的边界)

1.Sobel and Scharr Derivatives(衍生)

    Sobel operators是Gaussian Smoothing 加上differentian(变异/分化) operation。所以它对噪音更有抵抗。你可以指明衍生物(derivatives)的方向,垂直或者是水平的(分别对应是yorder、xorder)。

Python: cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]) → dst

        你也可以在参数ksize中指明kernel 的大小。其中ksize=-1时,会使用3x3的Charr filter(在这个情况下,结果会更好)

2.Laplacian Derivatives 拉普拉斯衍生

  Python: cv2.Laplacian(src, ddepth,corder) → dst¶   

      用以下公式计算图像的laplacion:

          这里找每个衍生式运用了Sobel derivations.

       当ksize = 1 时,使用以下的kernel进行过滤:

                                                     

 补充其中有个参数值深度:

代码实现:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("k.jpg",0)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 5)#也可以x,y也都设为1,那么出来的效果是x,y方向上的线都没有啦

plt.subplot(2,2,1),plt.imshow(img,cmap ="gray")
plt.title("Orignal"),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,2),plt.imshow(laplacian,cmap="gray")
plt.title("Laplacian"),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,3),plt.imshow(sobelx,cmap ="gray")
plt.title("Sobelx"),plt.xticks([]),plt.yticks([])

plt.subplot(2,2,4),plt.imshow(sobely,cmap ="gray")
plt.title("Sobely"),plt.xticks([]),plt.yticks([])
plt.show()

实现效果:

     强调一点:

       当输出的值为cv2.CV_8U或者是np.uint8时:

         Black- to -White transition 是positive slope(正数);反过来White- to - Black transition取negative slope(负数)。所以当输出时转化数据为unit8时,所有的negative slope 都会被置为0,这种情况都会丢失了一部分的边缘。

          更好的处理方式是,让输出的数据类型保存到更高的形式,例如cv2.CV_16S,cv2.CV_64F等。取它的绝对值,然后再把值转化回cv2.CV_8U。以下演示一遍:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("bw.png",0)

sobel_8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)
sobel_64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobel_64f)
sobel_8u_1 = np.uint8(abs_sobel64f)

plt.subplot(1,3,1),plt.imshow(img,cmap ="gray")
plt.title("Orignal"),plt.xticks([]),plt.yticks([])

plt.subplot(1,3,2),plt.imshow(sobel_8u,cmap="gray")
plt.title("Sobel CV_8U"),plt.xticks([]),plt.yticks([])

plt.subplot(1,3,3),plt.imshow(sobel_8u_1,cmap ="gray")
plt.title("Sobel abs(CV_64F"),plt.xticks([]),plt.yticks([])

plt.show()

实现效果:

猜你喜欢

转载自blog.csdn.net/kathrynlala/article/details/82894984