形態學操作


morphologyEx(src,dst,OPT,kernel)

OPT對應操作,分為以下幾類

CV_MOP_OPEN開操作

CV_MOP_CLOSE閉操作

CV_MOP_GRADIENT形態學梯度

CV_MOP_TOPHAT頂帽操作

CV_MOP_BLACKHAT黑帽操作

 

1.開操作

先腐蝕再膨脹

2.閉操作

先膨脹再腐蝕

3.形態學梯度

膨脹-腐蝕(也叫做基本梯度),形態學梯度還包括內部梯度和方向梯度

4.頂帽操作

原圖像與開操作的差值

5.黑帽操作

閉操作與原圖像的差值

 

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
    Mat src,dst_open,dst_close,dst_gra,dst_top,dst_black;
    src = imread("b.jpg");
    if (src.empty())
    {
        cout << "load image failed" << endl;
        return -1;
    }

    imshow("input img", src);
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1));
    morphologyEx(src, dst_open, CV_MOP_OPEN, kernel);
    imshow("open", dst_open);
    morphologyEx(src, dst_close, CV_MOP_CLOSE, kernel);
    imshow("close", dst_close);
    morphologyEx(src, dst_gra, CV_MOP_GRADIENT, kernel);
    imshow("gradent", dst_gra);
    morphologyEx(src, dst_top, CV_MOP_TOPHAT, kernel);
    imshow("tophat", dst_top);
    morphologyEx(src, dst_black, CV_MOP_BLACKHAT, kernel);
    imshow("blackhat", dst_black);
    waitKey(0);
    return 0;

}

 

 

 

 

 

 

6,水平線垂直線的提取

分為以下幾個步驟:

輸入彩色圖像

轉為灰度圖像

轉為二值圖像

adaptiveThreshould(src,dst,maxValue,adaptiveMethod,threshould,blocksize,c)

參數分別對應輸入圖像,輸出圖像,自適應方法(ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C),閾值類型,塊大小,常數c

 

定義結構元素

開操作提取水平線和垂直線(~表示取反操作)

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
    Mat src,dst;
    src = imread("d.jpg");
    if (src.empty())
    {
        cout << "load image failed" << endl;
        return -1;
    }

    imshow("input img", src);
    Mat gray_src;
    cvtColor(src, gray_src, CV_BGR2GRAY);
    imshow("gray", gray_src);

    Mat binImg;
    adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    imshow("binary img", binImg);
    //水平結構元素
    Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 100, 1), Point(-1, -1));
    //垂直結構元素
    Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 100), Point(-1, -1));

/*
    Mat temp;
    erode(binImg, temp, wline);
    dilate(temp, dst, wline);
*/
    morphologyEx(binImg, dst, CV_MOP_OPEN, hline);

    imshow("final result", dst);
    waitKey(0);
    return 0;

}

 

 

 

 

 

 

利用形態學降噪

 

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
    Mat src,dst;
    src = imread("d.jpg");
    if (src.empty())
    {
        cout << "load image failed" << endl;
        return -1;
    }

    imshow("input img", src);
    Mat gray_src;
    cvtColor(src, gray_src, CV_BGR2GRAY);
    imshow("gray", gray_src);

    Mat binImg;
    adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    imshow("binary img", binImg);
    //水平結構元素
    Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 100, 1), Point(-1, -1));
    //垂直結構元素
    Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 100), Point(-1, -1));

    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
/*
    Mat temp;
    erode(binImg, temp, wline);
    dilate(temp, dst, wline);
*/
    morphologyEx(binImg, dst, CV_MOP_OPEN, kernel);

    imshow("final result", dst);
    waitKey(0);
    return 0;

}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM