【OpenCV入門十七講】形態學操作

2021-03-02 小白學視覺

學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【OpenCV入門】系列。新的一年文章的內容進行了很大的完善,主要是借鑑了更多大神的文章,希望讓小夥伴更加容易理解。如果小夥伴覺得有幫助,請點擊一下文末的「在看」鼓勵一下小白。

膨脹與腐蝕(Dilation與Erosion)

圖像形態學操作

膨脹與腐蝕能實現多種多樣的功能,主要如下:

相關函數

getStructuringElement(int shape, Size ksize, Point anchor)

1. 形態學操作-膨脹

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

形態學操作-膨脹(感官上圖像變細,變白了)

相關函數

dilate(src, dst, kernel);

2. 形態學操作-腐蝕

腐蝕跟膨脹操作的過程類似,唯一不同的是以最小值替換錨點重疊下圖像的像素值

形態學操作-腐蝕(感官上圖像變粗,變黑了)

相關函數

代碼示例

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;

Mat src,erode_dst,dilate_dst;
char input_Win[]="input windows",dilate_Win[]="Dilation windows",Erode_Win[]="Erosion windows";
int dilate_elem=0,erode_elem=0;
int dilate_size=0,erode_size=0;
int const max_elem=2;
int const max_kernel_size=21;

void Dilation(int,void*);
void Erosion(int,void*);

int main(int argc,char** argv){
 
 src = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
 if(src.empty()){
   printf("Could not load Image ...");
   return -1;
 }

 namedWindow(input_Win,CV_WINDOW_AUTOSIZE);
 imshow(input_Win,src);
 
 
 
 namedWindow(dilate_Win,CV_WINDOW_AUTOSIZE);
 namedWindow(Erode_Win,CV_WINDOW_AUTOSIZE);
 
 
 
 
 createTrackbar("卷積核類型",dilate_Win,&dilate_elem,max_elem,Dilation);
 
 createTrackbar("卷積核大小",dilate_Win,&dilate_size,max_kernel_size,Dilation);
 
 
 createTrackbar("卷積核類型",Erode_Win,&erode_elem,max_elem,Erosion);
 createTrackbar("卷積核大小",Erode_Win,&erode_size,max_kernel_size,Erosion);

 Dilation( 0, 0 );
 Erosion( 0, 0 );

 waitKey(0);
}


void Dilation(int,void*){
 int dilate_type;
 if(dilate_elem == 0){ dilate_type = MORPH_RECT; }
 else if(dilate_elem == 1){ dilate_type = MORPH_CROSS; }
 else if(dilate_elem == 2){ dilate_type = MORPH_ELLIPSE; }

 Mat kernel = getStructuringElement(dilate_type,Size(2*dilate_size+1,2*dilate_size+1),Point(dilate_size,dilate_size));
 dilate(src,dilate_dst,kernel);
 imshow( dilate_Win, dilate_dst );
}


void Erosion(int,void*){
 int erosion_type;
 if(erode_elem == 0){ erosion_type = MORPH_RECT; }
 else if(erode_elem == 1){ erosion_type = MORPH_CROSS; }
 else if(erode_elem == 2){ erosion_type = MORPH_ELLIPSE; }

 Mat kernel = getStructuringElement(erosion_type,Size(2*erode_size+1,2*erode_size+1),Point(erode_size,erode_size));
 erode(src,erode_dst,kernel);
 imshow( Erode_Win, erode_dst );
}

運行結果

3. 形態學操作-開運算

先腐蝕後膨脹

可以去掉小的對象,假設對象是前景色,背景是黑色

4. 形態學操作-閉運算

先膨脹後腐蝕

可以填充小的洞,假設對象是前景色,背景是黑色

主要借鑑」Madcola「和」Micheal超「兩位大神的文章。兩位大神的博客主頁是:

https://www.cnblogs.com/skyfsm/(Madcola)

https://blog.csdn.net/qq_42887760(Micheal超)

由於時間和文章篇幅有限,本次總結先到這裡,下次小白會為小夥伴們帶來OpenCV的形態學操作的應用,各位小夥伴敬請期待。如果小夥伴覺得本文對自己有幫助,請幫忙點擊一下右下角的「在看」,鼓勵一下小白。

相關焦點

  • OpenCV-Python 形態學轉換|十七
    目標在這一章當中, 我們將學習不同的形態學操作,例如侵蝕,膨脹,開運算,閉運算等。 我們將看到不同的功能,例如:cv.erode(),cv.dilate(), cv.morphologyEx()等。理論形態變換是一些基於圖像形狀的簡單操作。通常在二進位圖像上執行。
  • 【計算機視覺處理一】OpenCV入門
    詳細內容可以查看OpenCV的官網:https://opencv.org/。2、OpenCV能做什麼?OpenCV中實現了了很多計算機視覺算法,包括基本的圖片運算、閾值處理、圖像濾波、形態學操作等。除此之外,OpenCV還提供了級聯分類器可以用於人臉檢測。不僅是圖片,OpenCV同時提供了視頻處理相關的操作,下面我們來看看一些案例。
  • 【走進OpenCV】學習Opencv不得不掌握的操作
    學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【走進OpenCV】系列,主要幫助小夥伴了解如何調用OpenCV
  • 【OpenCV入門之十三】如何在ROI中添加Logo
    學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【OpenCV入門】系列。
  • Python 圖像處理 OpenCV (1):入門
    新系列第一件事兒當然是資源推薦,下面是一些有關 OpenCV 的資源連結:資源連結:官方網站:https://opencv.org/GitHub:https://github.com/opencv/opencv官方文檔:https://docs.opencv.org/中文文檔(非官方):http://www.woshicver.com
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 圖像的形態學操作
    #include <opencv4/opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;void drawState(Mat &img,int number,Mat centroids,Mat stats,String
  • 基於opencv的感興趣區域ROI的操作
    利用opencv庫進行編程實現對感興趣區域ROI的操作例如:將小圖標複製到大圖像的指定位置中使用到的函數:矩形的表示:Rect類----》Rect(x,y,width,heigh)對Rect類的解釋:Rect類的成員變量有x、y、width、height,分別在左上角點的坐標和矩形的寬和高。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 給OpenCV初學者的禮物——OpenCV人臉檢測入門教程
    本文的參考文檔見https://docs.opencv.org/4.0.1/d1/dfb/intro.html圖像的基本操作對於人類來說,圖像可以解構為畫面結構、色彩和非常豐富的意象。你可以把它解構為各種色塊或線條,然後用故事性的語言把這幅圖像存在腦海裡。
  • Python+OpenCV的基礎圖像處理操作匯總
    圖像處理是對圖像進行的技術操作與分析,比如為了得到增強的圖像或提取一些有用的信息而進行的一系列操作。隨著我們的發展,許多應用程式使用圖像/幀/視頻作為輸入,對它們進行預處理,並將其輸入到設備或軟體或腳本中。圖像處理也可以是娛樂性的,可以用於許多應用。
  • 「Python+cv2」Python安裝opencv及圖像的基本操作
    Python環境opencv的安裝1、檢查是否安裝python環境3、安裝opencvpython環境下opencv的安裝:pip3 install opencv-pythonpython opencv安裝因為我已經安裝,所以會出現安裝位置的提示。
  • GA教育|VVVV入門教程第十七講:顏色識別
    VVVV,圖片來源於MANA官網。《VVVV入門教程第十七講:顏色識別》By TonyMark。公眾號後臺回復「VVVV第十七講課件」,獲取本節代碼、高清教程及案例視頻。在本講教程中,我們會使用Pipet節點來吸附攝像頭中想要獲取的顏色,就像Photoshop裡面的吸管工具一樣。
  • 基於OpenCV的條形碼檢測
    打開一個新文件,將其命名為 detect_barcode.py,如何開始寫代碼:# 導入必要的包/庫import numpy as npimport argparseimport imutilsimport cv2# 構造參數解析並分析參數ap = argparse.ArgumentParser()ap.add_argument("-i"
  • 基於 opencv 的圖像處理入門教程
    雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
    資料 | Practical Python and OpenCV 一周時間帶你入門CV
  • 【OpenCV+Python】頂帽與黑帽操作
    為原圖像與上文剛剛介紹的「開運算「的結果圖之差,數學表達式如下:因為開運算帶來的結果是放大了裂縫或者局部低亮度的區域,因此,從原圖中減去開運算後的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作和選擇的核的大小相關。帽運算往往用來分離比鄰近點亮一些的斑塊。
  • opencv教程-形態學處理、邊緣檢測
    1:形態學處理(常用於二值化圖像)腐蝕:對核範圍內的像素,只要有一個是非前景,則設置為背景;比如對於3*3的核函數,如果當前像素的3*3鄰域內像素全是前景則保留,否者設置為背景;常用於去除較小噪聲,分離物體。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 18、OpenCV閾值操作
    也可以把閾值看作是一個非常簡單的卷積或濾波操作,它使用1×1內核,然後在該像素上執行卷積操作:double cv::threshold(cv::InputArray src,      // Input imagecv::OutputArray dst,    // Result imagedouble thresh,         // Threshold