目錄:
開閉操作的作用
(一)開操作
(二)閉操作
(三)開操作完成其他任務
(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