2020.11.02 使用OpenCV进行图像水平和垂直线提取 【OpenCV C++】
采用开操作方法进行提取(先腐蚀再膨胀)
源代码:
// testOpencv11.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
const char* inWin = "intput window";
const char* outWin = "output window";
int main()
{
//std::cout << "Hello World!\n";
Mat src = imread("E:/imageSources/8.jpg");
if (!src.data) {
printf("cannot load image");
return -1;
}
namedWindow(inWin,WINDOW_AUTOSIZE);
imshow(inWin,src);
//转化为灰度图像
Mat grayImage;
cvtColor(src,grayImage,COLOR_RGB2GRAY);
//imshow("grayImage",grayImage);
//转化为二值图像
Mat binaryImage;
adaptiveThreshold(~grayImage, binaryImage,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,-2);
imshow("BinaryImage", binaryImage);
//进行水平腐蚀膨胀
Mat tempH;
Mat horizonResult;
//水平扫描结构元素
Mat horizonkernal = getStructuringElement(MORPH_RECT,Size(binaryImage.cols/16,1),Point(-1,-1));
//
Mat kernal = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1, -1));
//开操作=腐蚀+膨胀
//erode(binaryImage, tempH, horizonkernal);
//dilate(tempH, horizonResult, horizonkernal);
//开操作
morphologyEx(binaryImage,horizonResult,MORPH_OPEN,horizonkernal);
//morphologyEx(binaryImage, horizonResult, MORPH_OPEN, kernal);
namedWindow(outWin, WINDOW_AUTOSIZE);
imshow(outWin, ~horizonResult);
//进行垂直腐蚀膨胀
Mat tempV;
Mat verticalResult;
//垂直扫描结构元素
Mat verticlkernal = getStructuringElement(MORPH_RECT, Size(1, binaryImage.rows / 16), Point(-1, -1));
//开操作=腐蚀+膨胀
//erode(binaryImage, tempV, verticlkernal);
//dilate(tempV, verticalResult, verticlkernal);
//开操作
morphologyEx(binaryImage, verticalResult, MORPH_OPEN, verticlkernal);
imshow("vertical image", ~verticalResult);
waitKey(0);
return 0;
}
水平和垂直线提取结果:
采用3X3结构元素进行去噪,特征提取: