- 原理
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。
膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值 - 提取步骤
1.输入彩色图像 — imread
//输入原图像
Mat src = imread("C:/Users/XWT11/Desktop/MAGIC.jpg");
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "result image";
namedWindow("INPUT_WIN",WINDOW_NORMAL);
imshow("INPUT_WIN", src);
2.转换为灰度图像 — ctvColor
//转化为灰度图像
Mat gray_img;
cvtColor(src, gray_img, COLOR_BGR2GRAY);//ctvColor转换色彩空间
namedWindow("gray_img", WINDOW_NORMAL);
imshow("gray_img", gray_img);
3.转换为二值图像 — adaptiveThreshold
函数原型
void adaptiveThreshold( src, dst, int maxValue, Method, Type, int bolckSize, int delta )
相关参数:
src 要二值化的灰度图
dst 二值化后的图
maxValue 二值化后要设置的那个值
method 块计算的方法(ADAPTIVE_THRESH_MEAN_C 平均值,ADAPTIVE_THRESH_GAUSSIAN_C 高斯分布加权和)
type 二值化类型(CV_THRESH_BINARY 大于为最大值,CV_THRESH_BINARY_INV 小于为最大值)
blockSize 块大小(奇数,大于1)
delta 差值(负值也可以)
//转换为二值图像
Mat erzhi_img;
adaptiveThreshold(~gray_img, erzhi_img, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
namedWindow("erzhi_img", WINDOW_NORMAL);
imshow("erzhi_img", erzhi_img);
4.定义结构元素
//定义水平结构元素
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
//定义垂直结构元素
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
5.开操作(先腐蚀后膨胀)
提取水平线
Mat temp;
Mat dst;
erode(erzhi_img, dst,hline);
dilate(dst, temp, hline);
提取垂直线
erode(erzhi_img, dst,vline);
dilate(dst, temp, vline);