有關opencv的學習(16)—圖像的膨脹和腐蝕(2)

形態學其他操作:

          開運算、閉運算、頂帽、黒帽、形態學梯度 

基於膨脹腐蝕基礎, 利用morphologyEx()函數進行操作


核心函數爲:

CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,

                                int op, InputArray kernel,

                                Point anchor=Point(-1,-1), int iterations=1,

                                int borderType=BORDER_CONSTANT,

                                const Scalar& borderValue=morphologyDefaultBorderValue() );

src: 輸入原圖像。

dst: 輸出圖像要求和src一樣的尺寸和類型。

op: 表示形態學運算的類型, 可以取如下值:

enum { MORPH_ERODE=CV_MOP_ERODE, MORPH_DILATE=CV_MOP_DILATE,

       MORPH_OPEN=CV_MOP_OPEN, MORPH_CLOSE=CV_MOP_CLOSE,

       MORPH_GRADIENT=CV_MOP_GRADIENT, MORPH_TOPHAT=CV_MOP_TOPHAT,

       MORPH_BLACKHAT=CV_MOP_BLACKHAT, MORPH_HITMISS };

kernel: 形態學運算內核, 若爲NULL, 表示使用參考點位於中心的3x3內核, 一般使用getStruecuringElement函數獲得。

anchor: 錨的位置, 默認值Point(-1,-1), 表示位於中心。

interations: 迭代使用函數的次數, 默認爲1。

borderType: 邊界模式, 一般採用默認值。

borderValue: 邊界值, 一般採用默認值。


一、開運算

        開運算是先腐蝕後膨脹的過程, 開運算可以用來消除小物體, 在纖細點處分離物體, 並在平滑較大物體邊界的同時不明顯的改變其面積。

     cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element);

代碼如下:

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

using namespace cv;
using namespace std;


//加入椒鹽噪聲
void salt(Mat image, int n)
{
    int i,j;
    for (int k=0; k<n; k++)
    {
        // rand()是隨機數生成器
        i= rand()%image.cols;
        j= rand()%image.rows;
        if (image.type() == CV_8UC1)
        { // 灰度圖像
            image.at<uchar>(j,i)= 255;
        }
        else if (image.type() == CV_8UC3)
        { // 彩色圖像
            image.at<cv::Vec3b>(j,i)[0]= 255;
            image.at<cv::Vec3b>(j,i)[1]= 255;
            image.at<cv::Vec3b>(j,i)[2]= 255;
        }
    }
}


int main( )
{
    Mat image=imread("/Users/zhangxiaoyu/Desktop/lena.jpg");
    if(image.empty())
    {
        cout<<"Error!cannot be read...../n";
        return -1;
    }
    
    salt(image, 5000);
    
    namedWindow("saltImage");
    imshow("saltImage", image);
    
    cv::Mat openedImage;
    cv::Mat element3(3,3,CV_8U,cv::Scalar(1));
    cv::Mat opened;
    cv::morphologyEx(image, openedImage, cv::MORPH_OPEN, element3);
    
    namedWindow("openedImage");
    imshow("openedImage", openedImage);
    waitKey(0);
    
}


如下圖所示:




二、閉運算

         閉運算是先膨脹後腐蝕的過程, 閉運算可以用來消除小型黑洞(黑色區域)。

        cv::morphologyEx(image, closedImage, cv::MORPH_CLOSE, element);

程序結果如下:



三、形態學梯度

        形態學梯度是膨脹圖與腐蝕圖之差, 對二值圖可以將團塊(blob)邊緣凸顯出來, 可以用其來保留邊緣輪廓。

如下圖所示:


四、Top-Hat變換(頂帽運算)

        頂帽運算也被稱爲”禮帽”, 是閉運算結果和原圖像做差的結果, 可以用來分離比鄰近點亮一些的斑塊。


五、Black Hat變換(黑帽變換)

       黑帽運算是原圖像和開運算做差的結果, 可以用來分離比鄰近點暗一些的斑塊。





























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章