opencv-python(八):边缘检测

边缘检测即检测图像中亮度明显变化的区域,一般采用一阶或二阶差分方式,常见边缘检测算子有Sobel,Laplacian,Scharr等。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('building.jpg', 0)

laplacian = cv.Laplacian(img, cv.CV_64F)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)

plt.subplot(2, 2, 1), plt.imshow(img, cmap = 'gray')
plt.title('Original'), 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('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])

plt.show()

效果如下:


计算边缘即对x,y方向的边缘进行合成,这里采用的方式是直接绝对值求和,需要注意的是,亮度从白到黑的变化视为正方向,亮度从黑到白的变化视为负方向,当边缘采用CV_8U时,所有负方向边缘为0,因此,当进行边缘检测时,数据类型应该采用CV_64F,CV_16S。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('T.png', 0)

# dtype = cv.CV_8U
sobelx8u = cv.Sobel(img, cv.CV_8U, 1, 0, ksize=5)

# dtype = cv.CV_64F
sobelx64f = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)

# absolute
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.absolute(sobelx8u)

plt.subplot(2, 3, 1), plt.imshow(img, cmap = 'gray')
plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 2), plt.imshow(sobelx8u, cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 3), plt.imshow(sobel_8u, cmap = 'gray')
plt.title('sobel abs(CV_8U)'), plt.xticks([]), plt.yticks([])

plt.subplot(2, 3, 4), plt.imshow(img, cmap = 'gray')
plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 5), plt.imshow(sobelx64f, cmap = 'gray')
plt.title('Sobel CV_64f'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 6), plt.imshow(abs_sobel64f, cmap = 'gray')
plt.title('sobel abs(CV_64f)'), plt.xticks([]), plt.yticks([])

plt.show()

效果如下:


还有最常用的边缘检测算子:Canny

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread('messi5.jpg', 0)
edges = cv.Canny(img, 100, 200)

plt.subplot(1, 2, 1), plt.imshow(img, cmap = 'gray')
plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(edges, cmap = 'gray')
plt.title('Edges'), plt.xticks([]), plt.yticks([])

plt.show()

效果如下:



猜你喜欢

转载自blog.csdn.net/sinat_31425585/article/details/80247343