目录:
开闭操作的作用
(一)开操作
(二)闭操作
(三)开操作完成其他任务
(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