原理方法:
图像形态学操作时候,可以通过自定义的核实现对输入图像一些对象敏感,另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出,通过使用两个基本的形态学操作-膨胀与腐蚀,使用不同的核实现对输入图像的操作,得到想要的结果,
膨胀–输出的像素值是核覆盖下输入图像的最大像素值
腐蚀–输出的像素值是核覆盖下输入图像的最小像素值
提取步骤:
输入图像色彩图像imread
转换为灰度图像-cvColor
转换为二值图像-adaptiveThreshold
定义结构元素(核)
开操作(腐蚀+膨胀)提取水平与垂直线
adaptiveThreshold函数详解:
adaptiveThreshold(
InputArray src://源图像
OutputArray dst://输出图像,与源图像大小一致
int adaptiveMethod://在一个邻域内计算阈值所采用的算法,有两个取值,分别为
//ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
//ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType://这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV
int blockSize://adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C://在对参数int adaptiveMethod的说明中,我已经说了这个参数的作用,从中可以看出,
//这个参数实际上是一个偏移值调整量)
代码:
#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include <string>
#include<fstream>
using namespace cv;
using namespace std;
int main() {
Mat src, grasrc, adasrc, dst;
src = imread("C:\\Users\\Administrator\\Desktop\\pic\\11.jpg");
imshow("input", src);
cvtColor(src, grasrc,CV_BGR2GRAY);
imshow("outputgray", grasrc);
adaptiveThreshold(grasrc, adasrc, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
imshow("binary", adasrc);
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1));//水平结构元素(核)
Mat cline= getStructuringElement(MORPH_RECT, Size( 1,src.rows/16));//垂直结构元素(核)
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));//矩形结构元素
morphologyEx(adasrc, dst, MORPH_OPEN, cline);
//blur(dst, dst, Size(3, 3));
imshow("output", dst);
waitKey(0);
}
结果: