您的位置:首页 > 编程语言 > C语言/C++

OpenCV图像处理教程C++(十一) 形态学操作应用--提取水平与垂直线

2018-08-15 14:22 375 查看

原理方法:
图像形态学操作时候,可以通过自定义的核实现对输入图像一些对象敏感,另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出,通过使用两个基本的形态学操作-膨胀与腐蚀,使用不同的核实现对输入图像的操作,得到想要的结果,
膨胀–输出的像素值是核覆盖下输入图像的最大像素值
腐蚀–输出的像素值是核覆盖下输入图像的最小像素值

提取步骤:
输入图像色彩图像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);
}

结果:

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐