一、开运算
开运算:对图像先进行腐蚀,然后对腐蚀后的图进行膨胀
开操作=腐蚀+膨胀
主要应用在二值图像,灰度 图像也可以。
可以消除背景噪声
morphologyEx
运算结果=cv2.morphologyEx(源图像img,cv2.MORPH_OPEN,卷积核k)
cv2.MORPH_OPEN:开运算
import cv2 as cv
import numpy as np
def open_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (15, 15))#cv.MORPH_ELLIPSE椭圆形,可以选择其他形状
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
cv.imshow("open-result", binary)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png") #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图:
消除了背景小白点噪声
二、闭运算
对图像进行先膨胀,再腐蚀。
有助于关闭前景物体上的小孔,或者小黑点。
morphologyEx
运算结果=cv2.morphologyEx(源图像img,cv2.MORPH_CLOSE,卷积核k)
cv2.MORPH_CLOSE:闭运算
合理选择卷积核大小,太小了无法去除前景图的黑点
主要应用在二值图像,灰度 图像也可以。
import cv2 as cv
import numpy as np
def close_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 15))
binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
cv.imshow("close_demo", binary)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi.png") #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
close_demo(src)
cv.waitKey(0)
运行截图:
消除了前景色小黑点
三、 水平或垂直线的提取
提取图像中的水平线和垂直线属于基础的形态学操作的应用,原理:根据要提取图形来定义一个特定的结构元素,然后以这个结构相素去遍历图像,进行一系列形态学操作,以此过滤掉其他特征的图形,达到提取的效果。
操作过程:
-
读取原图;
-
转为灰度图像;
-
转为二值图像;
-
定义结构元素;
-
开操作。
3.1 开操作提取水平线
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1))#开操作提取水平线
代码如下:
import cv2 as cv
import numpy as np
def open_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1))#开操作提取水平线
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
cv.imshow("open_demo", binary)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi1.png") #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图:
3.2 开操作提取竖直线
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 15))#开操作提取竖直线
代码如下:
import cv2 as cv
import numpy as np
def open_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 15))#开操作提取竖直线
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
cv.imshow("open_demo", binary)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi1.png") #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图:
3.3 开操作提取斜线段
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 开操作去斜线
代码如下:
import cv2 as cv
import numpy as np
def open_demo(image):
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#线段去除
cv.imshow("binary", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5)) # 开操作去斜线
binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)
cv.imshow("open_demo", binary)
src = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/kaibi2.png") #读取图片位置
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
open_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行截图: