預備知識
結構元(SE)
1、結構元的中心一般來說是放在其重心位置處,但原則上原點的選擇是依賴于你要解決的問題的。
2、對圖像操作時,我們要求結構元是矩形陣列。(在結構元的基礎上添加較少的背景元素實現)
3、當結構元的中心位于原圖像的邊界時,要對原圖像進行填充操作
2注意點中的填充陣列:
但是其實這樣填充下來,只要給背景元素的權值賦0就和原來的一樣了。
這個陣列顯然和下面的陣列不是一個類型
3注意點中的填充原圖像
原理
腐蝕
該表達式表示:B對A的腐蝕使用一個z平移的B包含在A中的所有點z的集合。
效果:
也就是B的中心在A中遍歷之后,結構元素中沒有背景元素(即全是前景元素)的B中心的點的集合。
膨脹
膨脹是腐蝕的對偶操作。相當于將B的中心沿著所有A的點遍歷一遍,得到的B的所有元素的集合。
調用opencv庫函數
#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>using namespace cv;
using namespace std;
int main()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); //字體為綠色Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\黑白.jpg");//判斷圖像是否加載成功if (srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;namedWindow("原圖像", WINDOW_NORMAL); //定義窗口顯示屬性imshow("原圖像", srcImage);//進行腐蝕操作Mat element_erode = getStructuringElement(MORPH_RECT,Size(15,15)); //返回的是內核矩陣Mat dstImage;erode(srcImage, dstImage, element_erode); //腐蝕操作//顯示效果圖imshow("【腐蝕效果圖】", dstImage);//進行膨脹操作//獲取自定義核Mat element_dilate = getStructuringElement(MORPH_RECT, Size(15, 15));Mat out;//進行膨脹操作dilate(srcImage,out, element_dilate);imshow("【膨脹效果圖】", out);waitKey(0);return 0;
}
效果
作用
腐蝕的作用
消除A中比結構元B小的部件。去除黏連像素以及噪聲。
膨脹的作用
橋接裂縫,恢復連通性
作用:如圖,由于無法實現理想的二值化,使得原本連通的像素集合被
分成不同的連通域,從而影響目標物的提取。可通過膨脹運算使其恢復
連通性。
這種方法比低通濾波有一個直接優點:形態學橋接可以直接得到一個二值化的圖,
然而低通濾波則需要經過這樣過程:二值圖=>灰度圖=>二值圖。
另外需要了解的知識:
之后的擊中擊不中變換中將會用到這樣的知識。
上面是以二值圖為例的,下面我們以灰度圖作為例子。
效果:使整個圖像變暗且去除了局部較亮的像素
效果:使整個圖像變亮且去除了局部較暗的像素