作者:FPGA入门到精通
今天介绍一下图像形态学处理中的开运算、闭运算和梯度运算,这三个运算都是以图像腐蚀和图像膨胀为基础的。
一、开运算、闭运算、梯度运算
1、开运算
开运算 = 先腐蚀运算,再膨胀运算,用公式表示如下:
A○B = (A ⊖ B) ⊕ B
从视觉上看仿佛将原本有细微连接的物体“分开”了一样。
开运算的作用:有效地去除图像中的噪声和细节,同时保留物体的主要轮廓。
2、闭运算
闭运算 = 先膨胀运算,再腐蚀运算,用公式表示如下:
A●B = (A ⊕ B) ⊖ B
从视觉上看仿佛将原本分开的部分连接起来。
闭运算的作用:能有效填平小孔,弥合缝隙。
3、梯度运算
图像梯度运算是图像膨胀处理减去图像腐蚀处理后的结果,从而得到图像的轮廓,可以表示为:
G = (A ⊕ B) ⊖ (A ⊖ B)
梯度运算的结果可以用于边缘检测、图像分割、特征提取等任务。
三、Python实现
1、函数介绍
dst = morphologyEx(src,op,kernel,dst = None,anchor = None,iterations = None,borderType = None,borderValue = None)
这个函数支持高级形态转换。
参数说明:
(1)src:输入图像
(2)op:形态操作的类型
cv2.MORPH_ERODE腐蚀
cv2.MORPH_DILATE膨胀
cv2.MORPH_OPEN开运算
cv2.MORPH_CLOSE闭运算
MORPH_GRADIENT梯度运算
MORPH_TOPHAT顶帽运算
MORPH_BLACKHAT 底帽运算
(3)kernel:操作核,是一个数组,结构化元素
(4)anchor:操作核的锚点位置,负值(Point(-1,-1))说明该锚点位于核中心。默认为核中心。
(5)iterations:迭代次数。默认为None。
(6)borderType:像素边界扩展类型
(7)borderValue:边界为常量时的边界值。默认值为None
2、源代码
import cv2 import numpy as np img = cv2.imread('1280_720.bmp') img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 图像开运算 open_img = cv2.morphologyEx( img, cv2.MORPH_OPEN, kernel=np.ones((5, 5), np.uint8)) # 图像开运算 close_img = cv2.morphologyEx( img, cv2.MORPH_CLOSE, kernel=np.ones((5, 5), np.uint8)) # 图像梯度开运算 grad_img = cv2.morphologyEx( img, cv2.MORPH_GRADIENT, kernel=np.ones((5, 5), np.uint8)) cv2.namedWindow("orignal", 0) cv2.resizeWindow("orignal", 300, 180) # 设置窗口大小 cv2.namedWindow("open", 0) cv2.resizeWindow("open", 300, 180) # 设置窗口大小 cv2.namedWindow("close", 0) cv2.resizeWindow("close", 300, 180) # 设置窗口大小 cv2.namedWindow("gradient", 0) cv2.resizeWindow("gradient", 300, 180) # 设置窗口大小 cv2.imshow('orignal', img) cv2.imshow('open', open_img) cv2.imshow('close', close_img) cv2.imshow('gradient', grad_img) cv2.waitKey(0) cv2.destroyAllWindows()
3、运行结果图
注意,这里前景色是白色。
四、FPGA实现
开运算、闭运算与梯度预算,都是基于图像和腐蚀操作来实现的,只需更改图像处理流程算法模块的顺序即可。
1、开运算
开运算,先腐蚀,再膨胀。实现的系统框图如下:
2、闭运算
闭运算,先膨胀,再腐蚀。实现的系统框图如下:
3、梯度运算
梯度运算,膨胀减去腐蚀。实现的系统框图如下:
4、FPGA实现效果
注意,这里前景色是黑色。
文章来源:FPGA入门到精通