图像处理中的开闭运算是两个很重要的形态学操作,它们两个从基本的腐蚀与膨胀操作演变而来的,这些操作主要应用在二值图像的处理上,灰度图像也可以。
开操作是先腐蚀,后膨胀,作用是用来消除小物体和噪点、平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线。
闭操作是显膨胀,后腐蚀,作用是用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积
其代码为:
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_image", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 获取结构元素
dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开操作
cv.imshow("open_result", dst)
原图为:
可以看出原图像中有一些白色的噪点,结果开操作后:
由上图可以看出,小的白色噪点被消除了。
其代码为:
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_image", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
cv.imshow("close_result", dst)
原图为:
图中有很多小黑点,此时我们可以通过闭操作,将其黑色的噪声点给填充掉:
开闭操作还可以被用于提取物体的一些特征,如提取图像中的横线,
其代码如下:
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_image", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1)) # 获取结构元素
dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开操作
cv.imshow("open_result", dst)
获取结构元素时,我们可以改变内核大小来达到目的。
原图为:
经过相应的操作后:
除此之外,我们还可以利用开操作来提取图像中的字母,
原图为:
我们可以改变结构元素的内核大小,改为(3,3),得到的结果为:
import cv2 as cv # 导入opencv模块
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_image", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # 获取结构元素
dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开操作
cv.imshow("open_result", dst)
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_image", binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
cv.imshow("close_result", dst)
print("------------hello python!------------")
src = cv.imread("D:/opencv3/image/chars.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
open_demo(src)
# close_demo(src)
cv.waitKey(0)
cv.destroyAllWindows() # 释放所有窗口