|
用形态学运算变换图像(一)
数学形态学,即用预先定义的形状元素探测图像,实现图像转换,用于分析和处理离散图像,解决图像分割和特征检测等问题。
(一) 用形态学滤波器腐蚀和膨胀图像
最基本的形态学运算是腐蚀和膨胀。最基本的概念是结构元素,结构元素可简单定义为像素的组合,在对应的像素上设定结构元素的原点,也成锚点。结构元素原则上可为任何形状,通常为正方形、圆形、菱形,且把中心点作为原点;自定义结构元素,可用于强化或消除特殊形状。
形态学滤波器的应用过程,就包含用这个结构元素探测图像上每个像素的操作过程;结构元素与图像重叠部分的像素集就是特定形态学运算的应用对象。
1.1 前提
形态学滤波器通常作用于二维图像。形态学中,习惯用高像素值(白色)表示前景物体,用低像素值(黑色)表示背景物体;对图像做反向处理,即高、低像素值(黑白对调或者前景、后景换下)对换,且处理后的图像成为处理前图像的补码。
1.2 实现
OpenCV中,用简单函数cv:erode和cv:dilate分别实现腐蚀和膨胀运算,(所谓腐蚀与膨胀,其实就是针对白色前景物体进行的‘蚀’与‘胀’):
//读取输入图像
cv::Mat image=cv::imread(“binary.bmp”);
//腐蚀图像
//采用默认的3X3结构元素
cv::Mat eroded;
//目标图像cv::erode(image,eroded,cv::Mat());
//膨胀图像cv::Mat dilated;
//目标图像cv::dilate(image,dilated,cv::Mat());
1.3 原理
滤波器的作用范围,是由结构元素定义的像素集。在某个像素上应用结构元素时,结构元素的锚点与该像素对齐,所有与结构元素相交的像素就包含在当前集合中。
腐蚀,即把当前像素替换成所定义像素集合中的最小像素值;膨胀,即腐蚀的反运算,把当前像素替换成所定义像素集合中的最大像素值。由于输入的二值图像只包含黑色(值为0)和白色(值为255)像素,故每个像素都会被替换成白色或者黑色像素。 值得注意的是,腐蚀图像时,有些面积较小的物体(可看作背景中的“噪声”像素)会彻底消失;反之,膨胀后的物体会变大,而物体中的一些“空隙会被填满”。
OpenCV默认使用3x3正方形结构元素,调用函数时,将cv::erode()和cv::dilate()函数的第三个参数指定为空矩阵(即cv::Mat()),即可得到默认的结构元素。或者提供一个矩阵来指定结构元素的大小(以及形状),矩阵中的非零元素将构成结构元素。如果使用7X7的结构元素:
//用更大的结构元素腐蚀图像
//创建7X7的mat变量,其中全部元素都为1
cv::Mat element(7,7,CV_8U,cv::Scalar(1));
//用这个结构元素腐蚀图像
cv::erode(image,eroded,element);
图像结果显示:这次的结果更有破坏性;还有一种方法能得到类似的结果,即在图像上反复应用同一个结构元素。且腐蚀与膨胀函数都有一个用于指定重复次数的可选参数:
//腐蚀图像三次
cv::erode(image,eroded,cv:Mat(),cv::Point(-1,-1),3);
参数cv::Point(-1,-1)表示原点是矩阵的中心点(默认值),也可定义在结构元素上的其他位置,由此得到的图像与使用7X7结构元素得到的图像是一样的。实际上,对图像腐蚀两次相当于对结构元素自身膨胀后的图像进行腐蚀,这个规则也适用于膨胀。
实验结论得出腐蚀与膨胀运算的基本性质,即用结构元素腐蚀前景物体可看作对图像背景部分的膨胀,换个说法就是:
腐蚀图像相当于对其反色图像膨胀后再取反色;
膨胀图像相当于对其反色图像腐蚀后再取反色。
1.4 拓展
形态学滤波器,除了应用在二值图像上,也可应用在灰度图像、彩色图像上,且方法的定义是相同的。
OpenCV的形态学函数支持就地处理,即输入图像与输出图像可以采用用一个变量。OpenCV会创建必须的临时图像,从而保证这种方法的正常运行。示例如:
cv::erode(image,image,cv::Mat());
|