13 - 形态学操作应用一 提取水平线和垂直线
代码和注释:
#include<opencv2/opencv.hpp>;
#include<iostream>;
#include<opencv2/imgproc/types_c.h>;
using namespace std;
using namespace cv;
int main(int argc, char* argv) { // 13 - 形态学操作实际应用一:提取水平与垂直线
Mat source1;
source1 = imread("F:\\OpenCV-Test\\TestPicture\\SourcePicture1\\12.jpg");
if (source1.empty()) { printf("can not load image ... \n"); return -1; }
imshow("source1原图像", source1);
Mat source1Gray;
cvtColor(source1,source1Gray,CV_BGR2GRAY); // #include<opencv2/imgproc/types_c.h>; CV_BGR2GRAY=6
//cvtColor(source1,source1Gray,6); //将彩色图 灰度化
imshow("source1Gray", source1Gray);
Mat source1GrayBinaryzation;
adaptiveThreshold(~source1Gray, source1GrayBinaryzation,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2);//将灰度图 二值化
//取反灰度图像,二值化图像,最大值,自适应阈值算法,指定阈值类型,邻域块模板大小,算法相关常数参数
imshow("source1GrayBinaryzation", source1GrayBinaryzation);
Mat Xline = getStructuringElement(MORPH_RECT, Size(source1.cols/16,1),Point(-1, -1));//水平线 X方向
// 结构元素: 矩形,大小,锚点
Mat Yline = getStructuringElement(MORPH_RECT, Size(1,source1.rows/16),Point(-1, -1)); //垂直线 Y方向
Mat temp, resultXline;
erode(source1GrayBinaryzation, temp, Xline); //将二值化图像 通过 水平线 腐蚀
dilate(temp, resultXline, Xline); //将腐蚀后的二值化图像进行 垂直线 膨胀
//morphologyEx(source1GrayBinaryzation,resultXline,MORPH_OPEN,Xline); // 开操作
bitwise_not(resultXline, resultXline); //反转像素,原图像白色背景,结果图像也应该是白色背景
blur(resultXline, resultXline,Size(3,3),Point(-1,-1));
imshow("resultXline", resultXline);
Mat temp2, resultYline;
erode(source1GrayBinaryzation, temp2, Yline); //将二值化图像 通过 水平线 腐蚀
dilate(temp2, resultYline, Yline); //将腐蚀后的二值化图像进行 垂直线 膨胀
//morphologyEx(source1GrayBinaryzation,resultYline,MORPH_OPEN,Yline); // 开操作
bitwise_not(resultYline, resultYline); //反转像素,原图像白色背景,结果图像也应该是白色背景
blur(resultYline, resultYline, Size(3, 3), Point(-1, -1));
imshow("resultYline", resultYline);
waitKey(0);
return 0;
}
代码效果演示: