Python-OpenCV 图像处理(二十三):开闭操作
开操作:
图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;
主要是应用在二值图像分析中,灰度图像亦可;
开操作 = 腐蚀+膨胀 ,输入图像 + 结构元素
作用:用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.提取水平或竖直的线
闭操作:
图像形态学的重要操纵之一,基于膨胀与腐蚀操作组合形成的;
主要是应用在二值图像分析中,灰度图像亦可;
开操作 = 膨胀+腐蚀 ,输入图像 + 结构元素
作用:用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积.
import cv2
import numpy as np
from matplotlib import pyplot as plt
__author__ = "zxsuperstar"
__email__ = "[email protected]"
"""
开闭操作
"""
def open_demo(image):
cv2.imshow("image", image)
# plt.subplot(131), plt.imshow(image), plt.title("image")
gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
cv2.imshow("binary", binary)
# plt.subplot(132), plt.imshow(binary), plt.title("binary")
"""
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) # 十字结构
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 矩形结构
"""
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 定义 kernel 矩阵
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,1)) #定义 kernel 矩阵 提取横线
binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
# dst = cv2.erode(binary,kernel) #腐蚀
# # dst = cv2.dilate(binary, kernel) # 膨胀
cv2.imshow("open",binary)
# plt.subplot(133), plt.imshow(binary), plt.title("open")
# plt.show()
def close_demo(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
cv2.imshow("binary", binary)
"""
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 椭圆结构
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) # 十字结构
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 矩形结构
"""
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) #定义 kernel 矩阵
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
# dst = cv2.erode(binary,kernel) #腐蚀
# # dst = cv2.dilate(binary, kernel) # 膨胀
cv2.imshow("close",binary)
if __name__ == "__main__":
image = cv2.imread("slant1.jpg") #blue green red
image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)
open_demo(image)
# close_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
开操作: 闭操作:
开操作:提取水平或竖直的线
说明:
cv2.morphologyEx()
看前三个参数就行了,后面的就用默认值
第一个参数 输入
第二个参数 操作类型
MORTH_OPEN 函数做开运算
MORTH_CLOSE 函数做闭运算
MORTH_GRADIENT 函数做形态学梯度运算
MORTH_TOPHAT 函数做顶帽运算
MORTH_BLACKHAT 函数做黑帽运算
MORTH_DILATE 函数做膨胀运算
MORTH_ERODE 函数做腐蚀运算
第三个参数 内核类型 用getStructuringElement函数得到