形态学操作应用-提取水平与垂直线
原理方法
图像形态学操作时候,可以通过自定义的结构元素实现结构元素
对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏
感的对象改变而不敏感的对象保留输出。通过使用两个最基本的
形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像
的操作、得到想要的结果。
- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
提取步骤
输入图像彩色图像 imread
转换为灰度图像 – cvtColor
转换为二值图像 – adaptiveThreshold
定义结构元素
开操作 (腐蚀+膨胀)提取 水平与垂直线
代码:
#include <opencv2\opencv.hpp> using namespace cv; using namespace std; Mat src; Mat dst; int main() { src = imread("D:/opencvSRC/font.jpg"); if (!src.data) { printf("load image error!\n"); } namedWindow("src", CV_WINDOW_AUTOSIZE); imshow("src", src); //灰度 Mat gray; if (src.channels() == 3) { cvtColor(src, gray, CV_BGR2GRAY); } else { gray = src; } imshow("gray", gray); //转换为二值图像 Mat dest; adaptiveThreshold(~gray, dest, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow("dest", dest); Mat lineHKernel = getStructuringElement(MORPH_RECT, Size(src.cols / 30, 1), Point(-1, -1)); Mat lineVKernel = getStructuringElement(MORPH_RECT, Size(1, src.cols / 30), Point(-1, -1)); Mat fontKernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); //开操作 Mat lineH; Mat lineV; Mat font; morphologyEx(dest, lineH, CV_MOP_OPEN, lineHKernel, Point(-1, -1)); morphologyEx(dest, lineV, CV_MOP_OPEN, lineVKernel, Point(-1, -1)); morphologyEx(dest, font, CV_MOP_OPEN, fontKernel, Point(-1, -1)); //erode(dest, lineH, lineHKernel); //imshow("lineH", lineH); //dilate(lineH, lineH, lineHKernel); blur(font, font, Size(3, 3)); bitwise_not(lineH, lineH); bitwise_not(lineV, lineV); bitwise_not(font, font); imshow("lineH", lineH); imshow("lineV", lineV); imshow("font", font); waitKey(0); return 0; }