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

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

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

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26907755/article/details/81703460