文章目錄
- 形態學基本概念
- 高級形態學變換函式:MorphologyEx
- 形態學開運算
- 開運算案例:
- 形態學閉運算
- 閉運算案例:
- 形態學梯度運算
- 形態學梯度運算案例:
- 禮/頂帽(Top hat)
- 禮帽案例:
- 黑帽(Black hat)
- 黑帽案例:
形態學基本概念
影像形態學即數學形態學(Mathematical morphology)是一門建立在格倫和拓撲學基礎上的影像分析學科,是數學形態學影像處理的基本理論;常見影像形態學運算:腐蝕,膨脹,開運算,閉運算,骨架抽取,極線腐蝕,擊中擊不中變換,頂帽變換,顆粒分析,流域變換,形態學梯度等,
腐蝕和膨脹是最基本的形態學運算,
腐蝕和膨脹是針對白色部分(高亮部分)而言的,
膨脹(dilate)是對影像高亮部分進行“領域擴張”,領域擴張,效果圖擁有比原圖更大的高亮區域;
腐蝕(erode)是原圖中的高亮區域被蠶食,領域縮減,效果圖擁有比原圖更小的高亮區域,
開運算:先腐蝕再膨脹,用來消除小物體
閉運算:先膨脹再腐蝕,用于排除小型黑洞
形態學梯度:就是膨脹圖與俯視圖之差,用于保留物體的邊緣輪廓,
頂帽:原影像與開運算圖之差,用于分離比鄰近點亮一些的斑塊,

黑帽:閉運算與原影像之差,用于分離比鄰近點暗一些的斑塊,

高級形態學變換函式:MorphologyEx
函式原型:
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:源影像Mat物件 -
dst:目標影像Mat物件 -
op:操作的型別,通過原始碼我們得知總共有以下幾種型別:enum MorphTypes{ MORPH_ERODE = 0, //腐蝕 MORPH_DILATE = 1, //膨脹 MORPH_OPEN = 2, //開操作 MORPH_CLOSE = 3, //閉操作 MORPH_GRADIENT = 4, //梯度操作 MORPH_TOPHAT = 5, //頂帽操作 MORPH_BLACKHAT = 6, //黑帽操作 MORPH_HITMISS = 7 }; -
kernel:用于膨脹操作的結構元素,如果取值為Mat(),那么默認使用一個3 x 3 的方形結構元素,可以使用getStructuringElement()來創建結構元素 -
anchor:參考點,其默認值為(-1,-1)說明位于kernel的中心位置, -
borderType:邊緣型別,默認為BORDER_CONSTANT, -
borderValue:邊緣值,用它的默認值即可,
形態學開運算
開操作(先腐蝕后膨脹)可以平滑物體輪廓,斷開狹窄的間斷和消除細小的突出物,
它具有消除細小物體,在纖細處分離物體和平滑較大物體邊界的作用,
函式使用:
morphologyEx(src, dst, MORPH_OPEN, kernel);
開運算案例:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./morphologyEx.jpg");
cout << img.size() << endl;
imshow("原圖", img);
Mat dst;
//獲取自定義核
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
//形態學開操作
#if 1
morphologyEx(img, dst, MORPH_OPEN, element);
#else
erode(img, dst, element);
dilate(dst, dst, element);
#endif
imshow("形態學開操作", dst);
waitKey();
return 0;
}
注:形態學操作可使用高級函式morphologyEx,
形態學閉運算
閉操作(先膨脹后腐蝕)可以消弭狹窄的間斷,消除小的孔洞,先膨脹后腐蝕的操作稱之為閉操作,
它具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用,
函式使用:
morphologyEx(src, dst, MORPH_CLOSE, kernel);
閉運算案例:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./morphologyEx.jpg");
cout << img.size() << endl;
imshow("原圖", img);
Mat dst;
//獲取自定義核
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
//形態學閉操作
morphologyEx(img, dst, MORPH_CLOSE, element);
imshow("形態學閉操作", dst);
waitKey();
return 0;
}
形態學梯度運算
形態學梯度操作能描述影像亮度變化的劇烈程度;當我們想要突出高亮區域的外圍時,則可以選用形態學梯度來突出邊緣,可以保留物體的邊緣輪廓,
形態學梯度運算案例:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./morphologyEx.jpg");
cout << img.size() << endl;
imshow("原圖", img);
Mat dst;
//獲取自定義核
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
//形態學梯度運算
morphologyEx(img, dst, MORPH_GRADIENT, element);
imshow("形態學梯度運算", dst);
waitKey();
return 0;
}
禮/頂帽(Top hat)
頂帽是原圖與原圖的開運算的差值影像,
開運算放大了裂縫或者區域低亮度的區域,所以,從原圖中減去開運算后的圖,得到的結果突出了比原圖輪廓周圍的區域更明亮的區域,這個操作與選擇的核的大小有關,TopHat運算一般用來分離比鄰近點亮一些的斑塊,可以使用這個運算提取背景,
禮帽案例:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./morphologyEx.jpg");
cout << img.size() << endl;
imshow("原圖", img);
Mat dst,dst_open;
// 獲取自定義核
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
// 形態學禮帽
morphologyEx(img, dst_open, MORPH_OPEN, element);
morphologyEx(img, dst, MORPH_TOPHAT, element);
imshow("開運算", dst_open);
imshow("形態學禮帽", dst);
waitKey();
return 0;
}
黑帽(Black hat)
黑帽是閉運算結果與原圖的差值影像,
黑帽運算的結果突出了比原圖輪廓周圍區域更暗的區域,所以黑帽運算用來分離比鄰近點暗一些的斑塊,
黑帽案例:

#include<iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("./morphologyEx.jpg");
cout << img.size() << endl;
imshow("原圖", img);
Mat dst, dst_close;
// 獲取自定義核
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
// 形態學黑帽
morphologyEx(img, dst_close, MORPH_CLOSE, element);
morphologyEx(img, dst, MORPH_BLACKHAT, element);
imshow("閉運算", dst_close);
imshow("形態學黑帽", dst);
waitKey();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356716.html
標籤:AI
