立即学习:https://edu.csdn.net/course/play/26281/327078?utm_source=blogtoedu
本节内容应该与下一节内容交换一下,本节内容涉及的形态学变换的介绍在下一节才会讲到。
OpenCV边缘检测可以使用基本的边缘检测算子也可以使用形态学变换来实现:
1.边缘检测算子:
2.形态学滤波:腐蚀,膨胀,开运算,闭运算,梯度,顶帽,黑帽(底帽),击中击不中变换。
import cv2 as cv
import numpy as np
def gauss_noise(image, mean=0, var=0.001):
image=np.array(image/255, dtype=float)
noise=np.random.normal(mean, var ** 0.5, image.shape)
out=image+noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out=np.clip(out, low_clip, 1.0)
out=np.uint8(out*255)
return out
def edge_detection():
filename= "d:/lena.jpg"
img=cv.imread(filename, 0)
#img=gauss_noise(img)
#sobel边缘检测算子
sobel_y=cv.Sobel(img, cv.CV_16S, 0, 1, ksize=3)
sobel_x=cv.Sobel(img, cv.CV_16S, 1, 0, ksize=3)
#拉普拉斯边缘检测算子
laplacian=cv.Laplacian(img, cv.CV_16S)
#canny边缘检测,最小阈值50,最大阈值120
canny=cv.Canny(img, 50, 120)
sobel_x_show=cv.convertScaleAbs(sobel_x)
sobel_y_show=cv.convertScaleAbs(sobel_y)
laplacian_show=cv.convertScaleAbs(laplacian)
cv.imshow("image", img)
cv.imshow("soble_x", sobel_x_show)
cv.imshow("soble_y", sobel_y_show)
cv.imshow("laplacian", laplacian_show)
cv.imshow("canny", canny)
cv.waitKey()
cv.destroyAllWindows()
def morphology_convert():
filename= "d:/lena.jpg"
img=cv.imread(filename, 0)
nimg=gauss_noise(img)
kernel=cv.getStructuringElement(cv.MORPH_CROSS, (3,3))
#腐蚀
eroded=cv.erode(img, kernel)
#膨胀
dilated=cv.dilate(img, kernel)
#先开后闭去噪
opened=cv.morphologyEx(nimg, cv.MORPH_OPEN, kernel)
closed=cv.morphologyEx(opened, cv.MORPH_CLOSE, kernel)
#梯度变换
gradient=cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
#顶帽变换
tophat=cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
#底帽变换
bottomhat=cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
#增强
enhance=img + tophat - bottomhat
#击中击不中变换
kernel_hmt=np.array(([0,1,0],[1,-1,1],[0,1,0]), dtype='int')
hmt=cv.morphologyEx(img, cv.MORPH_HITMISS, kernel_hmt)
cv.imshow("image", img)
cv.imshow("noised image", nimg)
cv.imshow("eroded image", eroded)
cv.imshow("dilated image", dilated)
cv.imshow("opened", opened)
cv.imshow("closed", closed)
cv.imshow("gradient image", gradient)
cv.imshow("tophat image", tophat)
cv.imshow("bottomhat image", bottomhat)
cv.imshow("enhance image", enhance)
cv.imshow("hit or miss image", hmt)
cv.waitKey()
cv.destroyAllWindows()
if __name__ == '__main__':
morphology_convert()
效果如图: