- adaptiveThreshold(~gray, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15,-2);
- 自适应阈值化操作,这里只用二值化
- 注意gray要取反,这里要参考我们的背景颜色, 我用的是白色背景,所以要取反这样二值图片就是黑色背景
- 参数:原图,输出图,二值化算法,阈值类型(不必纠结), 操作块大小(adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定),偏移值调整量(±和0都可以)
- 15是邻域块大小,发现自适应二值化得到的不理想时可调整它和偏移量-2
- 保留水平线
- adaptiveThreshold(~gray, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3,-2);
- Mat hline = getStructuringElement(MORPH_RECT, Size(src0.cols / 15, 1), Point(-1, -1));
- 保留垂直线
- adaptiveThreshold(~gray, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3,-2);
- Mat vline = getStructuringElement(MORPH_RECT, Size(1, src0.rows/15), Point(-1, -1));
- 保留字母
- adaptiveThreshold(~gray, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 13,-2);
- Mat kernel = getStructuringElement(MORPH_RECT, Size(4,4), Point(-1, -1));
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
Mat src0, gray, bin, dst;
int main(int argc, char ** argv)
{
src0 = imread("C:\\Users\\xujin\\Desktop\\ABCD.PNG");
if (!src0.data)
{
cout << "no image";
return -1;
}
namedWindow("src0_image", WINDOW_AUTOSIZE);
imshow("src0_image", src0);
cvtColor(src0, gray, COLOR_BGR2GRAY);
namedWindow("gray_image", WINDOW_AUTOSIZE);
namedWindow("bin_image", WINDOW_AUTOSIZE);
imshow("gray_image", gray);
//二值化
adaptiveThreshold(~gray, bin, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 13,-2);
//注意gray要取反,这里要参考我们的背景颜色, 我用的是白色背景,所以要取反这样二值图片就是黑色背景
imshow("bin_image", bin);
//保留水平线
Mat hline = getStructuringElement(MORPH_RECT, Size(src0.cols / 15, 1), Point(-1, -1));
//保留垂直线
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src0.rows/15), Point(-1, -1));
//保留字母
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
//这里主要是靠kernel的size来抹除细小噪声, 因为噪点比字母要小很多,所以可以靠小的kernel进行抹除
Mat temp;
erode(bin, temp, kernel, Point(-1, -1));
dilate(temp, dst, kernel, Point(-1, -1));
//erode(bin, temp, vline, Point(-1, -1));
//dilate(temp, dst, vline, Point(-1, -1));
namedWindow("dst_image", WINDOW_AUTOSIZE);
imshow("dst_image", dst);
waitKey(0);
return 0;
}