《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀
第6章 圖像處理
6.3 形態學濾波(1):腐蝕與膨脹
6.3.1 形態學概述
1.數學形態學(Mathematical morphology):建立在格論和拓撲學基礎上的圖像分析學科,是數學形態學圖像處理的基本理論。
2.基本運算:二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹、灰值開閉運算、灰值形態學梯度等
3.基本形態學操作:膨脹(dilate)、腐蝕(erode)
6.3.2 膨脹
1.求局部最大值的操作,數學角度:將圖像與核進行卷積,即計算核覆蓋區域的像素點最大值,并把最大值賦值給參考點指定像素,這樣就會使圖像中高亮區域逐漸增長。
2.核:帶有一個參考點(錨點,anchor point),任意形狀大小的區域。
3.膨脹數學表達式:
??????????
??????????
4.封裝函數:dilate函數
5.函數原型:
void dilate(InputArray src,OutputArray dst,InputArray kernel,Point anchor=Point(-1,-1),int iteration=1,int borderType=BORDER_CONSTANT,const Scaler& borderValue=morphologyDefaultBorderValue());
6.參數說明:
(1)輸入圖像
(2)目標圖像
(3)膨脹操作的核,為NULL時表示使用參考點位于中心3*3的核,常使用getStructuringElement返回指定形狀和大小的結構元素
????1)形狀:矩型:MORPH_RECT,交叉型:MORPH_CROSS,橢圓形:MORPH_ELLIPSE
????2)內核尺寸
????3)錨點位置
????4)調用示例:
Int g_nStructElementSize = 3;
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructuringElement+1, 2*g_nStructElementSize+1), Point(g_nStructElementSize,g_nStructElementSize ));
(4)錨的位置,默認(-1,-1)表示位于中心
(5)迭代使用dilate()函數的次數,默認1
(6)用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DFALUT
(7)當邊界為常數時的邊界值,默認值morphologyDefalutBorderValue()
6.3.3 腐蝕
1.求局部最小值的操作,將圖像與核進行卷積,即計算核覆蓋區域的像素點最小值,并賦值給參考點指定的像素,這樣就會使圖像中高亮區域逐漸增長。
2.腐蝕的數學表達式:
??????????
??????????
3.封裝函數:erode()函數
4.函數原型:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& broderValue=morphologyDefalutBorderValue());
5.參數說明:
(1)輸入圖像
(2)目標圖像
(3)腐蝕操作的核,為NULL時表示使用參考點位于中心3*3的核,常使用getStructuringElement返回指定形狀和大小的結構元素
(4)錨的位置,默認(-1,-1)表示位于中心
(5)迭代使用erode()函數的次數,默認1
(6)用于推斷圖像外部像素的某種邊界模式,默認值BORDER_DFALUT
(7)當邊界為常數時的邊界值,默認值morphologyDefalutBorderValue()
6.3.4 綜合示例:腐蝕與膨脹
//滑動條1用于腐蝕與膨脹之間切換
//滑動條2用于調節內核尺寸
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;//全局變量
Mat g_srcImage, g_dstImage;
int g_nTrackbarNumber = 0;//0表示腐蝕erode,1表示膨脹dilate
int g_nStructElementSize = 3;//結構元素(內核矩陣)的尺寸//全局函數
void Process(); //膨脹和腐蝕的處理函數
void on_TrackbarNumChange(int, void*);//腐蝕和膨脹操作之間切換開關的回調函數
void on_ElementSizeChange(int, void*);//腐蝕和膨脹操作內核改變時的回調函數int main()
{//改變console顏色system("color 5E");//載入原圖g_srcImage = imread("love.jpg");if (!g_srcImage.data){printf("載入源圖像錯誤~!\n");return false;}//顯示原圖namedWindow("【原始圖】");imshow("【原始圖】", g_srcImage);//創建效果圖窗口namedWindow("【效果圖】");//創建軌跡條createTrackbar("腐蝕/膨脹", "【效果圖】", &g_nTrackbarNumber, 1, on_TrackbarNumChange);createTrackbar("內核尺寸", "【效果圖】", &g_nStructElementSize, 21, on_ElementSizeChange);on_TrackbarNumChange(g_nTrackbarNumber, 0);waitKey(0);return 0;
}
//進行自定義的腐蝕和膨脹操作
void Process()
{//獲取自定義核Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1), Point(g_nStructElementSize, g_nStructElementSize));//進行腐蝕或膨脹操作if (g_nTrackbarNumber == 0){erode(g_srcImage, g_dstImage, element);}else{dilate(g_srcImage, g_dstImage, element);}//顯示效果圖imshow("【效果圖】", g_dstImage);
}
//腐蝕和膨脹操作之間切換開關的回調函數
void on_TrackbarNumChange(int, void*)
{//腐蝕和膨脹之間效果已經切換,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process();
}
//腐蝕和膨脹操作內核改變時的回調函數
void on_ElementSizeChange(int, void*)
{//內核尺寸已改變,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process();
}
運行效果:
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电动车物流多少钱啊?
- 下一篇: 《OpenCV3编程入门》学习笔记6 图