1、原理方法:
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。
- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
2、二值图像与灰度图像上的膨胀操作
3、二值图像与灰度图像上的腐蚀操作
4、结构元素
上述膨胀与腐蚀过程可以使用任意的结构元素,常见的结构元素形状有:矩形、圆、直线、磁盘形状、砖石头、形状等各种自定义形状。
5、提取过程
1)输入彩色图像-imread
2)转换为灰度图像-cvtColor
3) 转换为二值图像-adaptiveThreshold
4)定义结构元素
5)开操作(腐蚀+膨胀)提取水平与垂直直线
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
const char * input = "input image";
const char *output = "output image";
void main()
{
Mat srcImg, grayImg, binImg, tempImg,resImg;
srcImg = imread("chars.png");
if (!srcImg.data)
{
cout << "error image data" << endl;
return;
}
namedWindow(input, WINDOW_AUTOSIZE);
imshow(input, srcImg);
//convert to grayImg
if (srcImg.channels() == 3)
{
cvtColor(srcImg, grayImg, CV_BGR2GRAY);
}
else
{
grayImg = srcImg;
}
//convert to binaryImg
adaptiveThreshold(~grayImg, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//create struct element
int xSize =binImg.cols/180 ;
int ySzie = binImg.rows/180;
Mat horizonLine = getStructuringElement(MORPH_RECT, Size(xSize, 1), Point(-1, -1));
Mat verticalLine = getStructuringElement(MORPH_RECT, Size(1, ySzie), Point(-1, -1));
//open operation, 提取水平直线
//erode(binImg, tempImg, horizonLine);
//dilate(tempImg, resImg, horizonLine);
//morphologyEx(binImg, resImg, CV_MOP_OPEN, horizonLine); //morphologyEx==erode+dilate
/*提取字符*/
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(binImg, resImg, CV_MOP_OPEN, kernel);
bitwise_not(resImg, resImg);
blur(resImg, resImg, Size(3, 3), Point(-1, -1));
imshow(output, resImg);
waitKey(0);
return;
}
字符提取效果如图: