腐蚀和膨胀
在这两个操作中都需要有一个滑动窗口一样的小块,这个小块在整副图像上面进行一个像素一个像素的滑动。
膨胀
膨胀操作:当前像素值等于该小块覆盖下的图像区域的最大像素值。
从而当背景色为白色,字体为黑色时,执行一次膨胀操作,黑色字体将变细。
相关的api使用:
Mat ele = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
dilate(src,dst,ele,Point(-1,-1));
MORPH_RECT:滑动块为矩形
MORPH_CROSS:滑动块为十字型
MORPH_ELLIPSE:滑动块为椭圆形
Point(-1,-1):使用默认的锚点
腐蚀
腐蚀操作:当前像素值等于该小块覆盖下的图像区域的最小像素值。
从而当背景色为白色,字体为黑色时,执行一次腐蚀操作,黑色字体将变粗。
相关api的使用:
Mat ele = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
erode(src,dst,ele);
附加
为了调试参数方便,使用createTrackbar()函数来将要变化的参数值变成可拖动的进度条,方便测试最合适的参数。
具体的应用:
#include <ros/ros.h>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int eroding_x = 1;
int eroding_y = 1;
int dilate_x = 1;
int dilate_y = 1;
Mat src;
void Erod(int,void*);
void Dila(int,void*);
int main(int argc, char *argv[])
{
src = Mat::ones(Size(400,400),CV_32F);
putText(src,"test",Point(100,100),3,2,Scalar(0,0,0),3);
line(src,Point(10,10),Point(10,300),Scalar(0,0,0),3,8);
line(src,Point(10,10),Point(300,10),Scalar(0,0,0),3,8);
imshow("src",src);
namedWindow("Dilate window",CV_WINDOW_AUTOSIZE);
namedWindow("Eroding window",CV_WINDOW_AUTOSIZE);
createTrackbar("dilate x size","Dilate window",&dilate_x,17,Dila);
createTrackbar("dilate y size","Dilate window",&dilate_y,17,Dila);
createTrackbar("eroding x size","Eroding window",&eroding_x,17,Erod);
createTrackbar("eroding y size","Eroding window",&eroding_y,17,Erod);
waitKey(0);
return 0;
}
void Dila(int,void*)
{
if(dilate_x > 0 && dilate_y > 0)
{
Mat ele = getStructuringElement(MORPH_CROSS,Size(dilate_x,dilate_y),Point(-1,-1));
Mat temp;
dilate(src,temp,ele,Point(-1,-1));
imshow("dilate",temp);
}
else
{
cout << "the dilate_x and dilate_y don't equals 0" << endl;
}
}
void Erod(int,void*)
{
if(eroding_x > 0 && eroding_y > 0)
{
Mat ele = getStructuringElement(MORPH_RECT,Size(eroding_x,eroding_y),Point(-1,-1));
Mat temp;
erode(src,temp,ele);
imshow("erode",temp);
}
else
{
cout << "the eroding_x and eroding_y don't equals 0" << endl;
}
}
其中:
createTrackbar(
拖动条的名字,
所在弹出框的名字,
&改变的变量,
拖动条的最大值,
回调的函数
);