经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。 |
图像的腐蚀过程与图像的卷积操作类似,都需要模板矩阵来控制运算的结果,在图像的腐蚀和膨胀中这个模板矩阵被称为结构元素。与图像卷积相同,结构元素可以任意指定图像的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己定义。定义结构元素之后,将结构元素的中心点依次放到图像中每一个非0元素处,如果此时结构元素内所有的元素所覆盖的图像像素值均不为0,则保留结构元素中心点对应的图像像素,否则将删除结构元素中心点对应的像素。图像的腐蚀过程示意图如图6-12所示,图6-12中左侧为待腐蚀的原图像,中间为结构元素,首先将结构元素的中心与原图像中的A像素重合,此时结构元素中心点的左侧和上方元素所覆盖的图像像素值均为0,因此需要将原图像中的A像素删除;当把结构元素的中心点与B像素重合时,此时结构元素中所有的元素所覆盖的图像像素值均为1,因此保留原图像中的B像素。将结构元素中心点依次与原图像中的每个像素重合,判断每一个像素点是否保留或者删除,最终原图像腐蚀的结果如图6-12中右侧图像所示。
图像腐蚀可以用“ Θ \Theta Θ”表示,其数学表示形式如式(6.4)所示,通过公式可以发现,其实对图像A的腐蚀运算就是寻找图像中能够将结构元素B全部包含的像素点。
A Θ B = { z ∣ ( B ) z ⊂ A } (6.4) A\Theta B = \left\{ {z|{
{(B)}_z} \subset A} \right\} \tag{6.4} AΘB={
z∣(B)z⊂A}(6.4)
图像腐蚀过程中使用的结构元素可以根据需求自己生成,但是为了研究人员的使用方便,OpenCV 4提供了getStructuringElement()函数用于生成常用的矩形结构元素、十字结构元素和椭圆结构元素。该函数的函数原型在代码清单6-10中给出。
代码清单6-10 getStructuringElement()函数原型
1. Mat cv::getStructuringElement(int shape,
2. Size ksize,
3. Point anchor = Point(-1,-1)
4. )
- shape:结构元素的种类,可以选择的参数及含义在表6-5中给出。
- ksize:结构元素的尺寸大小
- anchor:中心点的位置,默认参数为结构元素的几何中心点。
该函数用于生成图像形态学操作中常用的矩形结构元素、十字结构元素和椭圆结构元素。函数第一个参数为生成结构元素的种类,可以选择的参数及含义在表6-5给出,函数第二个参数是结构元素的尺寸大小,能够影响到图像腐蚀的效果,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。函数的最后一个参数是结构元素的中心点,只有十字结构元素的中心点位置会影响图像腐蚀后的轮廓形状,其他种类的结构元素的中心点位置只影响形态学操作结果的平移量。
标志参数 | 简记 | 作用 |
---|---|---|
MORPH_RECT | 0 | 矩形结构元素,所有元素都为1 |
MORPH_CROSS | 1 | 十字结构元素,中间的列和行元素为1 |
MORPH_ELLIPSE | 2 | 椭圆结构元素,矩形的椭圆内接元素为1 |
OpenCV 4提供了用于图像腐蚀的erode()函数,该函数的函数原型在代码清单6-11中给出。
代码清单6-11 erode()图像腐蚀
1. void cv::erode(InputArray src,
2. OutputArray dst,
3. InputArray kernel,
4. Point anchor = Point(-1,-1),
5. int iterations = 1,
6. int borderType