对于车牌识别,或OCR文字识别时,需要先对图片进行预处理,去除干扰因素后再进行后续图像识别操作!
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。
- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
(1)二值图像与灰度图像上的腐蚀操作原理
(2)二值图像与灰度图像上的膨胀操作原理
(3)结构元素,上述膨胀与腐蚀过程可以使用任意的结构元素(矩形、圆、直线)
操作步骤
(1)输入图像彩色图像 - imread()
(2)转换为灰度图像 – cvtColor()
(3)转换为二值图像 – adaptiveThreshold()
(4)定义结构元素 - getStructuringElement()
(5)开操作 (腐蚀+膨胀)提取 水平与垂直线
(6)后处理 - bitwise_not()
源代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("C:/Desktop/omd_Opencv/ms/2018-05-09_161301.png");//输入彩色图像
if (!src.data){
printf("could not load image...\n");
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "result image";
namedWindow(INPUT_WIN,CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN,src);
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY); //转换为灰度图像
imshow("gray image",gray_src);
Mat binImg;
adaptiveThreshold(~gray_src,binImg,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2);//转换为二值图像,~gray_src取反白底显示
imshow("bin image",binImg);
//矩形结构
Mat kernel = getStructuringElement(MORPH_RECT, Size(2,2), Point(-1, -1));//注意:一般Size(x, y), x, y 必须是正数而且是奇数
Mat temp;
//开操作(先腐蚀后膨胀),目的:去掉细小的对象
erode(binImg, temp, kernel);//形态学操作 - 腐蚀
dilate(temp, dst, kernel);//形态学操作-膨胀
bitwise_not(dst,dst);//做后处理,像素取反操作
imshow("final Result",dst);
waitKey(0);
return 0;
}
运行结果