图像形态学(opencv),运行后通过在屏幕上输入对应指令完成相对应的形态学方法。
圖像形態(tài)學(xué)
1、開操作(MORPH_OPEN)
結(jié)果圖類似腐蝕圖
先腐蝕后膨脹的過程,開操作可以幫助消除圖像中的小的干擾區(qū)域,并且在平滑較大物體的邊界的同時不明顯改變其面積。
2、閉操作(MORPH_CLOSE)
結(jié)果圖類似膨脹圖
先膨脹后腐蝕的過程,閉操作可以幫助消除圖像中的小的封閉區(qū)域。
3、形態(tài)學(xué)梯度(MORPH_GRADIENT)
膨脹圖與腐蝕圖之差,可以用形態(tài)學(xué)梯度來保留物體的邊緣輪廓。
4、頂帽(MORPH_TOPHAT)
原圖像與開運(yùn)算的結(jié)果圖之差,因為開運(yùn)算會放大局部低亮度區(qū)域,因此效果圖會突出比原輪廓周圍更亮的區(qū)域。
5、黑帽(MORPH_BLACKHAT)
原圖像與閉運(yùn)算的結(jié)果圖之差,因為閉運(yùn)算會放大局部高亮度區(qū)域,因此效果圖會突出比原輪廓周圍更暗的區(qū)域,可以得到原圖的輪廓。
6、morphologyEX函數(shù)
MORPH_OPEN – 開運(yùn)算(Opening operation)
? ? ? ? ? MORPH_CLOSE – 閉運(yùn)算(Closing operation)
? ? ? ? ? MORPH_GRADIENT -形態(tài)學(xué)梯度(Morphological gradient)
? ? ? ? ? MORPH_TOPHAT - “頂帽”(“Top hat”)
? ? ? ? ? MORPH_BLACKHAT - “黑帽”(“Black hat“)
//自定義核
Mat?element = getStructuringElement(MORPH_ELLIPSE, Size(f * 2 + 1, f * 2 + 1));
//進(jìn)行形態(tài)學(xué)操作
morphologyEx(src, dst2, MORPH_CLOSE, element);
相關(guān)程序
運(yùn)行后通過在屏幕上輸入對應(yīng)指令完成相對應(yīng)的形態(tài)學(xué)方法。
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<vector>
#include<time.h>
#include<opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//--------------------------------------【main( )函數(shù)】-----------------------------------------
// 描述:控制臺應(yīng)用程序的入口函數(shù),我們的程序從這里開始執(zhí)行
//-------------------------------------------------------------------------------------------------Mat src = imread("D:\\VC\\c++\\opencv源碼\\opencv源碼\\2.jpg");
Mat dst, dst1, dst2, dst3, dst4, dst5, dst6;
int p = 3;//膨脹初始值
int f = 4;//腐蝕初始值
int k = 3;//開運(yùn)算初始值
int b = 3;//閉運(yùn)算初始值
int x = 3;//形態(tài)學(xué)梯度初始值
int d = 3;//頂帽初始值
int h = 3;//黑帽初始值//膨脹回調(diào)函數(shù)
void on_p(int, void*)
{Mat element = getStructuringElement(MORPH_RECT, Size(p * 2 + 1, p * 2 + 1));morphologyEx(src, dst,MORPH_DILATE, element);imshow("膨脹圖", dst);}//腐蝕回調(diào)函數(shù)
void on_f(int, void*)
{//自定義核Mat element1 = getStructuringElement(MORPH_RECT, Size(f * 2 + 1, f * 2 + 1));//進(jìn)行形態(tài)學(xué)操作morphologyEx(src, dst1, MORPH_ERODE, element1);imshow("腐蝕圖", dst1);
}//開運(yùn)算回調(diào)函數(shù)
void on_k(int, void*)
{Mat element2 = getStructuringElement(MORPH_RECT, Size(k * 2 + 1, k * 2 + 1));morphologyEx(src, dst2, MORPH_OPEN, element2);imshow("開運(yùn)算圖", dst2);
}//閉運(yùn)算回調(diào)函數(shù)
void on_b(int, void*)
{Mat element3 = getStructuringElement(MORPH_RECT, Size(b * 2 + 1, b * 2 + 1));morphologyEx(src, dst3, MORPH_CLOSE, element3);imshow("閉運(yùn)算圖", dst3);
}//形態(tài)學(xué)梯度回調(diào)函數(shù)
void on_x(int, void*)
{Mat element4 = getStructuringElement(MORPH_RECT, Size(x * 2 + 1,x * 2 + 1));morphologyEx(src, dst4, MORPH_GRADIENT, element4);imshow("形態(tài)學(xué)梯度圖", dst4);
}//頂帽回調(diào)函數(shù)
void on_d(int, void*)
{Mat element5 = getStructuringElement(MORPH_RECT, Size(d * 2 + 1, d * 2 + 1));morphologyEx(src, dst5, MORPH_TOPHAT, element5);imshow("頂帽圖", dst5);
}//黑帽回調(diào)函數(shù)
void on_h(int, void*)
{Mat element6 = getStructuringElement(MORPH_RECT, Size(h* 2 + 1, h* 2 + 1));morphologyEx(src, dst6,MORPH_BLACKHAT, element6);imshow("黑帽圖", dst6);
}void print()
{cout << "******0:膨脹*********************" << endl;cout << "******1:腐蝕*********************" << endl;cout << "******2:開運(yùn)算*******************" << endl;cout << "******3:閉運(yùn)算*******************" << endl;cout << "******4:形態(tài)學(xué)梯度***************" << endl;cout << "******5:頂帽*********************" << endl;cout << "******6:黑帽*********************" << endl;cout << "******7:退出系統(tǒng)*****************" << endl;cout << "注意:進(jìn)行其他指令請擦除上一個指令的圖像" << endl;
}int main()
{print();cout << "————————————————" << endl;while (1){int method;cout << "*****請輸入形態(tài)學(xué)方法************" << endl;cin >> method;if (method == 0){//膨脹namedWindow("膨脹圖");createTrackbar("內(nèi)核值", "膨脹圖", &p, 20, on_p);on_p(p, 0);waitKey(0);}if (method == 1){//腐蝕namedWindow("腐蝕圖");createTrackbar("內(nèi)核值", "腐蝕圖", &f, 20, on_f);on_f(f, 0);waitKey(0);}if (method == 2){//開運(yùn)算namedWindow("開運(yùn)算圖");createTrackbar("內(nèi)核值", "開運(yùn)算圖", &k, 20, on_k);on_k(k, 0);waitKey(0);}if (method == 3){//閉運(yùn)算namedWindow("閉運(yùn)算圖");createTrackbar("內(nèi)核值", "閉運(yùn)算圖", &b, 20, on_b);on_b(b, 0);waitKey(0);}if (method == 4){//形態(tài)學(xué)梯度運(yùn)算namedWindow("形態(tài)學(xué)梯度圖");createTrackbar("內(nèi)核值", "形態(tài)學(xué)梯度圖", &x, 20, on_x);on_x(x, 0);waitKey(0);}if (method == 5){//頂帽運(yùn)算namedWindow("頂帽圖");createTrackbar("內(nèi)核值", "頂帽圖", &d, 20, on_d);on_d(d, 0);waitKey(0);}if (method ==6){//黑帽運(yùn)算namedWindow("黑帽圖");createTrackbar("內(nèi)核值", "黑帽圖", &h, 20, on_h);on_h(h, 0);waitKey(0);}if (method == 7){return 0;break;}}return 0;
}
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的图像形态学(opencv),运行后通过在屏幕上输入对应指令完成相对应的形态学方法。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腐蚀与膨胀
- 下一篇: 图像金字塔与resize函数