要获取轮廓,可对一张图像做先膨胀后腐蚀的操作,然后膨胀后的结果减去腐蚀的结果。
1. Sobel
算子
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
ddepth
:图像的深度dx
核dy
分别表示水平和垂直方向ksize
是Sobel
算子大小
image1 = cv2.imread('./ro.png')
plt.imshow(image1);
image1 = cv2.imread('./ro.png')
plt.imshow(image1);
image2 = cv2.Sobel(image1, cv2.CV_64F, 1, 0, ksize=3)
plt.imshow(image2);
白到黑的卷积计算是正数,黑到白的卷积计算就是负值了,所有的负数会被截断为0
,所以要取绝对值
计算x
方向梯度
image2 = cv2.Sobel(image1, cv2.CV_64F, 1, 0, ksize=3)
image2 = cv2.convertScaleAbs(image2)
plt.imshow(image2);
计算x
方向梯度
image3 = cv2.Sobel(image1, cv2.CV_64F, 0, 1, ksize=3)
image3 = cv2.convertScaleAbs(image3)
plt.imshow(image3);
获得图像的轮廓
image4 = cv2.addWeighted(image2, 0.5, image3, 0.5, 0)
plt.imshow(image4);
换一张图试试
import cv2
import matplotlib.pyplot as plt
image = cv2.imread('image.png')
image2 = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
image2 = cv2.convertScaleAbs(image2)
image3 = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
image3 = cv2.convertScaleAbs(image3)
image4 = cv2.addWeighted(image2, 0.5, image3, 0.5, 0)
image4 = cv2.cvtColor(image4, cv2.COLOR_BGR2RGB)
plt.imshow(image4);
2. Scharr
算子
用法相同,只是计算的值会比较大,会更敏感些