OpenCV-C++ 圖像形態學操作


這一節主要介紹幾種圖像形態學操作, 主要包括:膨脹, 腐蝕,開,閉四種處理操作;

另外,在顯示圖像中的同時,加入動態調整參數的滑動條;

另外,在顯示圖像中的同時,加入動態調整參數的滑動條;

完整的代碼在文章最后;

需要注意的是,重要的不是如何調用API,而是理解每一種形態學操作所起到的作用;

形態學操作

圖像形態學操作(Morphology Operators)指的是基於形狀的一系列圖像處理操作的合集,主要是基於集合論基礎上的形態學數學;

其中,膨脹和腐蝕是最常用的形態學處理操作;

膨脹操作(dilate)

  • 與卷積操作類似,假設有圖像A和結構元素B,結構元素B在A上面移動,其中B定義其中心為錨點,計算B覆蓋下A的最大像素值用來替換錨點的像素,其中B作為結構體可以是任意形狀;

膨脹dilate的API使用介紹:

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表示處理后的輸出圖像
  • kernel結構元素
  • anchor錨點,默認中心像素;
  • iterations迭代處理的次數;

膨脹操作的作用:

  • 通過取最大值,使得圖像形狀變粗;

腐蝕操作(erode)

  • 與膨脹類似,但是使用最小像素值用來替換錨點的像素;

腐蝕erode的API使用介紹:

erode( InputArray src, OutputArray dst, InputArray kernel,
       Point anchor = Point(-1,-1), int iterations = 1,
       int borderType = BORDER_CONSTANT,
       const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src表示需要處理的原始圖像
  • dst表示處理后的輸出圖像
  • kernel結構元素
  • anchor錨點,默認中心像素;
  • iterations迭代處理的次數;

腐蝕操作的作用:

  • 通過取最小值,使得圖像中形狀變細;

開操作(open)

  • 先腐蝕,后膨脹
  • 可以去掉小的對象

使用方式:

Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);

開操作的作用:

  • 常用於圖像中的噪聲消除
  • 通過對小對象放在背景中來從圖像的前景中移除;

閉操作(close)

  • 先膨脹,后腐蝕
  • 可以去掉小的洞

使用方式:

Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);

閉操作的作用:

  • 能夠填充間隙來閉合形狀的操作,也可以用來去除噪聲;
  • 通過把背景中的小對象來放入前景中來移除前景的小孔;

形態學梯度--Morphological Gradient

  • 膨脹減去腐蝕
  • 又稱基本梯度(其他還包括內部梯度, 方向梯度)

形態學梯度的作用:

  • 通過獲取圖像的膨脹和腐蝕之間的差異,繪制圍繞形狀的邊界;

頂帽--Top hat

  • 源圖像與開操作之間的差值

頂帽的作用:

  • 從圖像中提取更精細的細節;

黑帽--Black hat

  • 閉操作與源圖像的差值

黑帽的作用:

  • 從圖像中提取更精細的細節;

上述一些形態學處理操作的作用並不是唯一的,需要根據具體的應用場景,選擇合適的操作;

完整的代碼如下:

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

using namespace std;
using namespace cv;

Mat src, dst;
int elementSize = 3;
int maxSize = 22;
char OUPUT_TITLE[] = "output_image";

void CallBackDemo(int, void*);

int main(){

    // 讀取圖像
    src = imread("/home/chen/dataset/MorphologyOperators.png");
    if (src.empty()){
        cout << "cloud not load image." << endl;
        return -1;
    }

    // 獲取結構元素
    int s = 3;
    Mat structreElement = getStructuringElement(MORPH_RECT, Size(s, s));
    namedWindow("src", WINDOW_AUTOSIZE);
    imshow("src", src);

    // 顯示處理后的圖像
    namedWindow(OUPUT_TITLE, WINDOW_AUTOSIZE);
    createTrackbar("Parmaters: ", OUPUT_TITLE, &elementSize, maxSize, CallBackDemo);
    CallBackDemo(0, 0);
    
    waitKey(0);

    return 0;
}

void CallBackDemo(int, void*){
    
    // 創建結構元素
    int s = elementSize * 2 + 1;
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));

    // 膨脹操作
    // dilate(src, dst, structureElement, Point(-1, -1), 1);

    // 腐蝕操作
    // erode(src, dst, structureElement, Point(-1, -1), 1);

    // 開操作
    // morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);

    // 閉操作
    // morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);

    // 形態學梯度
    // morphologyEx(src, dst, MORPH_GRADIENT, structureElement, Point(-1, -1), 1);

    // 頂冒-Top hat
    // morphologyEx(src, dst, MORPH_TOPHAT, structureElement, Point(-1, -1), 1);

    // 黑帽--Black hat
    morphologyEx(src, dst, MORPH_BLACKHAT, structureElement, Point(-1, -1), 1);

    imshow(OUPUT_TITLE, dst);
    return;
}


免責聲明!

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



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