python实现开闭操作

 

目录:

 开闭操作的作用

(一)开操作

(二)闭操作 

(三)开操作完成其他任务 

(1)提取水平垂直线

(2)消除干扰线

(3)提取满足要求的形状

 

 

 开闭操作的作用:

 

(一)开操作(特点作用:消除噪点-----去除小的干扰块,而不影响原来的图像。先腐蚀后膨胀)

 1 import cv2 as cv
 2 import numpy as np
 3 
 4 def camp(val1,val2):
 5     pv = val1 + val2
 6     if pv > 255:
 7         return 255
 8     if pv < 0:
 9         return 0
10     return pv
11 
12 def open_demo(image):
13     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
14     for i in range(1000):  #为灰度图像加一些噪点
15         h = np.random.random_integers(0,gray.shape[0]-1)
16         w = np.random.random_integers(0, gray.shape[1]-1)
17         val = np.random.random_integers(0, 255)
18         gray[h,w] = camp(gray[h,w],val)
19 
20     ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)  #生成二值化图像
21     cv.imshow("binary",binary)
22     kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))#结构元素,矩形大小3*3
23     binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)  #支持形态学的函数,此参数为开操作,先腐蚀后膨胀,会消除一些为1的白色噪点
24     cv.imshow("open_demo",binary)
25 
26 
27 src = cv.imread("./o.png")  #读取图片
28 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
29 cv.imshow("input image",src)    #通过名字将图像和窗口联系
30 
31 open_demo(src)
32 
33 cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
34 cv.destroyAllWindows()  #销毁所有窗口

 

(二)闭操作(特点:可以填充闭合区域。先膨胀后腐蚀)

 1 def close_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     binary = cv.morphologyEx(binary,cv.MORPH_CLOSE,kernel)
 7     cv.imshow("close_demo",binary)
 8 
 9 
10 src = cv.imread("./o.png")  #读取图片
11 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
12 cv.imshow("input image",src)    #通过名字将图像和窗口联系

(三)开操作完成其他任务

(1)提取水平垂直线

1 def open_demo(image):
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
4     cv.imshow("binary",binary)
5     kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15))  #修改内核为(15,1)可以提起横线,水平-竖直。
6     binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
7     cv.imshow("open_demo",binary)

 原理:

 

  1 kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,15)) 

 (2)消除干扰线

1 def open_demo(image):
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
4     cv.imshow("binary",binary)
5     kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))  #因为干扰线很细,小于我们想要的字母,先腐蚀后膨胀对字母无影响,但是对于细线在腐蚀的时候就处理掉了
6     binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
7     cv.imshow("open_demo",binary)

 (3)提取满足要求的形状

getStructuringElement我们设置的内核形状为矩形,是可以设置其他形状

矩形:MORPH_RECT;
交叉形:MORPH_CORSS;
椭圆形:MORPH_ELLIPSE;
1 def open_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_ELLIPSE,(5,5))
6     binary = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel)
7     cv.imshow("open_demo",binary)

 参考:

https://www.cnblogs.com/ssyfj/p/9277688.html

posted @ 2020-09-15 22:24  山那边不是山  阅读(1096)  评论(0编辑  收藏  举报