机器视觉学习-day04-形态学变换
1 形态学变化
形态学变换(Morphological Transformations)是一种基于形状的简单变换,它的处理对象通常是二值化后(白色前景,黑色背景)的图像。
形态学变换需要两个输入:
源图像(二值化)
核(结构化元素)
输出为形态学变换后的图像:
腐蚀(白色像素减少,黑色像素增多)
膨胀(白色像素增多,黑色像素减少)
上面两种形态学变换的处理结果是相反的,腐蚀会让较亮的元素变少,膨胀会让较亮的元素变多。
腐蚀: 膨胀:
核实际上就是一个小区域,通常为3*3、5*5、7*7等
核结构分为:矩形结构、椭圆结构、十字形结构
代码运行步骤:图片输入→灰度化→二值化→形态操作→图片输出
代码中节点参数:
morph_op_type 形态学操作类型
erode 腐蚀
dilate 膨胀
shape 核的形状
MORPH_RECT 矩形
MORPH_ELLIPSE 椭圆
MORPH_CROSS 十字形
ksize 核尺寸
图片名称:1.png
1.1 腐蚀使用erode函数
import cv2
import numpy as npcv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('morph_image', 800, 600)
# 设置图片大小if __name__ == '__main__':# 1.图片输入path = '1.jpg'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY # 正阈值)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 核的形状(3, 3) # 核的尺寸)print(kernel)# 腐蚀使用erode函数,膨胀使用dilate函数# 返回值是形态处理之后的图像morph_image = cv2.erode( # 腐蚀image_np_thresh, # 二值化图像kernel # 核)# 5. 图像输出cv2.imshow('morph_image', morph_image)cv2.waitKey(0)cv2.imwrite('erode.png', morph_image)
1.2 膨胀使用dilate函数
import cv2
import numpy as npcv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('morph_image', 800, 600)if __name__ == '__main__':# 1.图片输入path = 'image.jpg'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY # 正阈值)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 核的形状(3, 3) # 核的尺寸)print(kernel)# 腐蚀使用erode函数,膨胀使用dilate函数# 返回值是形态处理之后的图像morph_image = cv2.dilate( # 膨胀image_np_thresh, # 二值化图像kernel # 核)# 5. 图像输出cv2.imshow('morph_image', morph_image)cv2.waitKey(0)cv2.imwrite('dilate.png', morph_image)
练习:
下面是星星图案,腐蚀掉空心星星,尽量让实心星星形状保持原样。
"""腐蚀掉空心星星,尽量让实心星星形状保持原样(颜色无所谓)。"""
import cv2cv2.namedWindow('morph_image', cv2.WINDOW_NORMAL)
# 创建一个名为'morph_image'的显示窗口
# cv2.WINDOW_NORMAL:表示窗口大小可调整(区别于固定大小的窗口)
cv2.resizeWindow('morph_image', 800, 600)
# 设置窗口大小为宽800像素,高600像素if __name__ == '__main__':# 1.图片输入path = 'xingxing.png'image_np = cv2.imread(path)# 灰度化image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)# 3.二值化ret, image_np_thresh = cv2.threshold(image_np_gray,127,255,cv2.THRESH_BINARY # 正阈值)cv2.imshow('image_np_thresh', image_np_thresh)cv2.imwrite('image_np_thresh.png', image_np_thresh)# 4.图片矫正.形态操作# 创建一个核kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, # 核的形状(9, 9) # 核的尺寸)print(kernel)""" 腐蚀:erode函数,膨胀:dilate函数腐蚀(白色像素减少,黑色像素增多)膨胀(白色像素增多,黑色像素减少)"""# 返回值是形态处理之后的图像"""这个代码中先膨胀,再腐蚀"""dilate = cv2.dilate( # 膨胀image_np_thresh, # 二值化图像kernel # 核)# 腐蚀kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))erodede = cv2.erode(dilate,kernel)# 5. 图像输出cv2.imshow('morph_image', erodede)cv2.waitKey(0)cv2.imwrite('xingxing_eroded.png', erodede)
二值化后:
腐蚀再膨胀后的最终结果