最近这几天一直在回顾OpenCV的相关知识点,也算是做一次简单的总结的吧。这次小项目主要是针对 形态学应用知识点做的回顾。首先是提取图像中的水平线和垂直线,然后利用类似原理,可以消除验证码上面的干扰项。
操作步骤:
- 1、读取图像
- 2、转换为灰度图
- 3、装换为二值图
- 4、定义水平结构原始和垂直结构元素
- 5、对图像处理:先腐蚀再膨胀(开运算)
- 6、再来一个反转,把背景改成白的
- 7、利用blur滤波,让图像更美观
如下,首先提取下面图像的水平线:
1、读取图像
Mat src, dst,grayImage; src = imread("E:\\Pec\\形态学应用1.jpg"); namedWindow("原图", WINDOW_AUTOSIZE); imshow("原图", src); if (src.empty()) { printf("图片读取错误!\n"); }
2、转换为灰度图
//灰度图转化 cvtColor(src, grayImage, COLOR_BGR2GRAY);
3、装换为二值图
//二值图 Mat threImage; adaptiveThreshold(grayImage, threImage, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow("ee图", threImage);
4、定义水平结构原始和垂直结构元素
//水平结构元素 Mat hkernel = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1)); //垂直结构元素 Mat wkernel = getStructuringElement(MORPH_RECT, Size(1, src.rows/16), Point(-1, -1));
5、对图像处理:先腐蚀再膨胀(开运算)
Mat eImage, dImage; erode(threImage, eImage, wkernel); dilate(eImage, dImage,wkernel);
6、再来一个反转,把背景改成白的
bitwise_not(dImage,dImage);
7、利用blur滤波,让图像更美观
blur(dImage, dImage, Size(3, 3), Point(-1, -1)); imshow("提取水平线", dImage);
效果如下:
验证码去除干扰项
假设验证码的图片如下所示:
程序代码
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat src, dst,grayImage; src = imread("E:\\Pec\\形态学应用2.jpg"); imshow("假设验证码图", src); if (src.empty()) { printf("图片读取错误!\n"); } //灰度图转化 cvtColor(src, grayImage, COLOR_BGR2GRAY); //二值图 Mat threImage; adaptiveThreshold(grayImage, threImage, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 17, 2); Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); Mat eimage, dimage; erode(threImage, eimage, kernel); dilate(eimage, dimage,kernel); imshow("验证码去除干扰项", dimage); waitKey(0); return 0; }