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

 

posted @ 2020-09-16 10:05  山那边不是山  阅读(361)  评论(0编辑  收藏  举报