1.腐蝕操作
增強圖像的暗部(圖像矩陣中數值更小的部分),濾波得到的新像素點為濾波器內最小的值,也就是用最暗的點代替濾波器內的錨點
erode(src,dst,kernel,Point,epoch_num)
參數分別為:輸入圖像,輸出圖像,濾波器,錨點(一般為Point(-1,-1)),迭代次數(默認為一次)
2.膨脹操作
增強圖像的亮部(圖像矩陣中數值更大的部分),濾波得到的心像素點為濾波器內的最大值,也就是用最亮的點代替濾波器內的錨點
dilate(src,dst,kernel,Point,epoch_num)
參數同腐蝕
以上兩個解釋是我認為最好懂的定義
按照數字圖像處理教材中的說法
二值圖像的腐蝕是使用濾波器對圖形進行濾波,濾波器的邊界不超過圖形邊界,那么濾波后圖形的新邊界就是由錨點所畫的邊界,像隊員圖形會有所縮小所以叫腐蝕
膨脹是錨點不超過圖性的邊界,那么濾波器邊界畫出的新邊界就是新的圖形邊界,相比原圖行會有所擴大,所以是膨脹。
這種說法不是非常准確,我覺得按照像素點的數值來描述更准確一些。
獲取濾波器
Mat kernel=getstructuringElement(int shape,Size kernel,Point)
shape為濾波器形狀,常為:MORPH_RECT矩形,MORPH_CROSS十字,MORPH_ELLIPSE圓弧
代碼
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Mat src, dst; int elem_size = 3; int max_size = 21; char output_win[] = "output image"; void callback_demo(int, void*); int main(int argc, char **argv) { src = imread("b.jpg"); if (src.empty()) { cout << "load img failed" << endl; return -1; } imshow("input img", src); namedWindow(output_win, CV_WINDOW_AUTOSIZE); createTrackbar("Element size :", output_win, &elem_size, max_size, callback_demo); callback_demo(0, 0); waitKey(0); return 0; } void callback_demo(int, void*) { int s = elem_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //dilate(src, dst, structureElement, Point(-1, -1),1); erode(src, dst, structureElement, Point(-1, -1), 1); imshow(output_win, dst); return; }
增加了滾動條可以調節腐蝕膨脹的濾波器大小,隨着濾波器變大可以清楚看到圖片的亮度按照濾波器的形狀逐層疊加。
暗部增強的腐蝕
亮部增強的膨脹
不同形狀