python实现其它形态学操作
目录:
(一) 顶帽(原图像与开操作图像的差值)
(二) 黑帽(原图像与闭操作图像的差值)
(三) 形态学梯度
(1)基本梯度(膨胀后的图像与腐蚀后的图像差值)
(2)内部梯度(原图像减去腐蚀后的图像差值)
(3)外部梯度(膨胀后图像与原图差值)
(一) 顶帽(原图像与开操作图像的差值)
1 import cv2 as cv 2 import numpy as np 3 4 def top_hat_demo(image): 5 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) 6 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) 7 cv.imshow("binary",binary) #这里的二值化图像就可以看作是原图像(注意:基于腐蚀膨胀是可以直接对彩色图像操作的)) 8 kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5)) 9 dst = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel) #查看开操作图像 10 cv.imshow("open_demo",dst) 11 dst = cv.morphologyEx(binary,cv.MORPH_TOPHAT,kernel) #查看顶帽图像 12 cv.imshow("top_hat_demo",dst) 13 14 15 src = cv.imread("./cir.png") #读取图片 16 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应 17 cv.imshow("input image",src) #通过名字将图像和窗口联系 18 19 top_hat_demo(src) 20 21 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作 22 cv.destroyAllWindows() #销毁所有窗口
(二) 黑帽(原图像与闭操作图像的差值,提取点)
1 def black_hat_demo(image): 2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) 3 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) 4 cv.imshow("binary",binary) 5 kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15)) 6 dst = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel) 7 cv.imshow("close_demo",dst) 8 dst = cv.morphologyEx(binary,cv.MORPH_BLACKHAT,kernel) 9 cv.imshow("black_hat_demo",dst)
(三) 形态学梯度
(1)基本梯度(膨胀后的图像与腐蚀后的图像差值)
1 def graditent_demo(image): 2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) 3 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) 4 cv.imshow("binary",binary) 5 kernel = cv.getStructuringElement(cv.MORPH_RECT,(15,15)) 6 dst = cv.dilate(binary, kernel) 7 cv.imshow("dilate_demo", dst) 8 dst = cv.erode(binary, kernel) 9 cv.imshow("erode_demo", dst) 10 dst = cv.morphologyEx(binary,cv.MORPH_GRADIENT,kernel) 11 cv.imshow("graditent_demo",dst)
(2)内部梯度(原图像减去腐蚀后的图像差值)
(3)外部梯度(膨胀后图像与原图差值)
1 def gradient2_demo(image): 2 kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) 3 dm = cv.dilate(image, kernel) 4 em = cv.erode(image, kernel) 5 dst1 = cv.subtract(image, em) # internal gradient 6 dst2 = cv.subtract(dm, image) # external gradient 7 cv.imshow("internal", dst1) 8 cv.imshow("external", dst2) 9 10 11 print("--------- Python OpenCV Tutorial ---------") 12 src = cv.imread("D:/vcprojects/images/test.png") 13 cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) 14 cv.imshow("input image", src) 15 gradient2_demo(src) 16 cv.waitKey(0) 17 cv.destroyAllWindows()
参考:
https://www.cnblogs.com/ssyfj/p/9277891.html