1.基本原理
水平线与垂直线的提取本质是:先腐蚀后膨胀,即开操作。
2.提取步骤
输入图像彩色图像 imread
转换为灰度图像 – cvtColor
转换为二值图像 – adaptiveThreshold(将分离目标区域和背景区域)
定义结构元素
开操作 (腐蚀+膨胀)提取 水平与垂直线
3.自适应阈值API和原理
(这是采用平均的阈值算法)
void adaptiveThreshold( InputArray src, OutputArray dst,double maxValue, int adaptiveMethod,int thresholdType, int blockSize, double C );
参数1:输入图像
参数2:输出图像
参数3:满足条件的最大值
参数4:阈值算法,可选ADAPTIVE_THRESH_MEAN_C(平均) 或 ADAPTIVE_THRESH_GAUSSIAN_C(高斯)两种
参数5:阈值类型。可选择THRESH_BINARY或者THRESH_BINARY_INV两种
参数6:邻域块大小,用来计算区域阈值,一般选择为3、5、7。。
参数7:它是一个从均值或加权均值提取的常数,可以是负数。
该部分转自:https://blog.csdn.net/sinat_36264666/article/details/77586964(详细的可以去这位大佬这里参考)
4.代码实现
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
char InputName[] = "input name";
char OutPutName[] = "output name";
int main()
{
Mat src, dst,graySrc;
src = imread("D:/VS project/Image/vertical.png");
if (src.empty())
{
cout << "找不到图像" << endl;
return -1;
}
namedWindow(InputName, CV_WINDOW_AUTOSIZE);
imshow(InputName, src);
cvtColor(src, graySrc, COLOR_BGR2GRAY);//先转化为灰度图像
Mat binSrc;//二值矩阵定义
adaptiveThreshold(~graySrc, binSrc, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);//对输入的图像进行取反操作
imshow("binSrc", binSrc);
Mat hline = getStructuringElement(MORPH_RECT,Size(src.cols/16,1),Point(-1,-1));//定义水平线结构体
Mat vline = getStructuringElement(MORPH_RECT,Size(1,src.rows/16),Point(-1,-1));//定义垂直线结构体
Mat temp;
erode(binSrc, temp, hline);//对垂直线进行腐蚀
dilate(temp, dst, hline);//再膨胀,对水平线被腐蚀部分进行还原,最后提取到水平线
bitwise_not(dst, dst);//反向取像素
imshow(OutPutName, dst);
//以上操作可以直接通过开操作完成
Mat dst1;
morphologyEx(binSrc, dst1, CV_MOP_OPEN, hline);
imshow("开操作直接输出图像", dst1);
waitKey(0);
return 0;
}