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

        膨脹、腐蝕屬於形態學的操作, 簡單來說就是基於形狀的一系列圖像處理操作。

        膨脹腐蝕是基於高亮部分(白色)操作的, 膨脹是対高亮部分進行膨脹, 類似“領域擴張”, 腐蝕是高亮部分被腐蝕, 類似“領域被蠶食”。

        膨脹腐蝕的應用和功能:  (1)、消除噪聲(2)、分割獨立元素或連接相鄰元素(3)、尋找圖像中的明顯極大值、極小值區域(4)、求圖像的梯度。

        其他相關:  開運算、閉運算;頂帽、黒帽;形態學梯度 ;

一、膨脹操作

        膨脹就是求局部最大值的操作, 從數學角度上來講, 膨脹或腐蝕就是將圖像(或區域)A與B進行卷積。

        核可以是任意大小和形狀, 它有一個獨立定義的參考點(錨點), 多數情況下, 核是一個小的中間帶參考點和實心正方形或者圓盤, 可以看做是一個模板或掩碼。

        膨脹是求局部最大值的操作, 核B與圖形卷積, 即核B覆蓋的區域的像素點的最大值, 並把這個最大值複製給參考點指定的像素, 這樣就會使圖像中的高亮區域逐漸增長, 如下圖所示:


           函數原型爲:

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,

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

                          int borderType=BORDER_CONSTANT,

                          const Scalar& borderValue=morphologyDefaultBorderValue() );

src: 輸入原圖像(建議爲二值圖)。

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

kernel: 膨脹操作的核, 當爲NULL時, 表示使用參考點位於中心的3x3的核一般使用getStructuringElement獲得指定形狀和尺寸的結構元素(核)可選以下三種形狀: 矩形、交叉形、橢圓形。

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

iterations: 膨脹的次數。

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

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

代碼如下:

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


using namespace cv;
using namespace std;


int main()
{
    Mat image=imread("/Users/zhangxiaoyu/Desktop/1.png",0);//0爲讀出的是灰度圖像
    
    if(image.empty())
    {
        cout<<"Error!cannot be read...../n";
        return -1;
    }
    
    
    //膨脹圖像
    cv::Mat dilated;
    cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
    cv::dilate(image, dilated, element);

    //顯示原始圖片
    cv::namedWindow("original image");
    cv::imshow("original image", image);

    
    
    //顯示圖片
    cv::namedWindow("dilated image");
    cv::imshow("dilated image",dilated );
    
    
    waitKey(0);
    return 0;

}

原始圖像(灰度圖像)如下:



膨脹後的圖像爲:



二、腐蝕操作

       腐蝕和膨脹相反, 是取局部最小值, 高亮區域逐漸減小, 如下圖所示:


函數原型爲:

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,

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

                         int borderType=BORDER_CONSTANT,

                         const Scalar& borderValue=morphologyDefaultBorderValue() );

代碼如下:

//腐蝕圖像
    cv::Mat eroded;
    cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
    erode(image, eroded, element);

運行程序,如下圖:


























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