理论
去干扰线干扰点的操作方法, 大体上与第9课所说的提取水平/垂直线一致, 只是把核改为矩形, 不要线型就行,反正都是通过开操作来实行的。
操作流程:
相关API
转换为二值图像 - 通过adaptiveThreshold这个接口去转换
adaptiveThreshold(
Mat src, //输入的灰度图像
Mat dst, //输出的二值图像
double maxValue, //超过阈值的部分取值是多少(对于cv.THRESH_BINARY而言)
int adaptiveMethod, //自适应阈值算法,只能选其中之一: ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType, //阈值类型, 必须为THRESH_BINARY或THRESH_BINARY_INV
int blockSize, //核的大小
double C, //常量, 可以是正数,0,负数, 它是减去平均或加权平均值后的常数值,通常为正数
);
代码示例
Mat src,dst;
src = imread(...);
// 先显示原图
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
// 再显示灰度图
Mat gray_dst;
cvtColor(src, gray_dst, CV_BGR2GRAY);
namedWindow("gray image", CV_WINDOW_AUTOSIZE);
imshow("gray image", gray_dst);
// 再显示二值图
Mat binImg_dst;
adaptiveThreshold(~gray_dst, binImg_dst, 255, ADAPTIVE_THRESH_MEAN_C, THRSH_BINARY, 15, -2); //注意这个gray_dst有个取反符号,表示先取反再进行二值转换, 如果是白色背景的图, 就会变为黑色
namedWindow("binary image", CV_WINDOW_AUTOSIZE);
imshow("binary image", binImg_dst);
// 再显示开操作之后的图
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
Mat temp;
erode(binImg_dst, temp, kernel ); // 先腐蚀
dilate(temp, dst, kernel ); // 再膨胀
bitwise_not(dst, dst); // 图像取反操作, 将黑色背景再转为白色
namedWindow("result image", CV_WINDOW_AUTOSIZE);
imshow("result image", dst);
效果截图:
原图:
灰度图:
取反之后的二值图:
开操作之后的图:
由上图结果可以看出,我们的提取不大顺利, 把字母也去掉了一些, 那么我们改一下代码
将:
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
改为:
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));