學習c++版opencv3.4之10-膨脹腐蝕
阿新 • • 發佈:2018-12-11
形態學操作。
膨脹:結構B在影象A上面移動,B的中心定義為錨點,計算B覆蓋下A的最大畫素值來替換錨點的畫素,B的形狀可以是任意的。膨脹類似於中值濾波時取最大值而不是中間值,且濾波時核的形狀比較單一,但是膨脹中B的形狀可以為矩形,圓形等。
腐蝕:結構B在影象A上面移動,B的中心定義為錨點,計算B覆蓋下A的最小畫素值來替換錨點的畫素,B的形狀可以是任意的。
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace std; using namespace cv; int main(){ Mat src, dst, dst2; src = imread("/Users/ming/Documents/test.jpg"); if (!src.data){ printf("cannot load image ..."); return -1; } namedWindow("src img", CV_WINDOW_AUTOSIZE); imshow("src img", src); Mat structure_element = getStructuringElement(MORPH_RECT, Size(3,3)); //設定膨脹/腐蝕的核為矩形,大小為3*3 dilate(src, dst, structure_element); //膨脹 // erode(dst, dst, structure_element); //先膨脹後腐蝕 namedWindow("dilate img", CV_WINDOW_AUTOSIZE); imshow("dilate img", dst); erode(src, dst2, structure_element); //腐蝕 namedWindow("erode img", CV_WINDOW_AUTOSIZE); imshow("erode img", dst2); waitKey(0); return 0; }
使用createTrackbar建立滑動按鈕,動態調節腐蝕引數。
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace std; using namespace cv; void callback_demo(int ,void*); int element_size = 1, max_size = 10; string window_name = "dilate img"; Mat src ,dst; int main(){ src = imread("/Users/ming/Documents/test.jpg"); if (!src.data){ printf("cannot load image ..."); return -1; } namedWindow("src img", CV_WINDOW_AUTOSIZE); imshow("src img", src); namedWindow(window_name, CV_WINDOW_AUTOSIZE); createTrackbar("element size", window_name, &element_size, max_size, callback_demo); //利用回撥函式建立滑動按鈕示例 callback_demo(0, 0); waitKey(0); return 0; } void callback_demo(int, void*){ cout << "element_size: " << element_size << endl; int s = element_size * 2 + 1; Mat structure_element = getStructuringElement(MORPH_RECT, Size(s,s)); //設定膨脹/腐蝕的核為矩形,大小為3*3 dilate(src, dst, structure_element); //膨脹 // erode(src, dst, structure_element); //腐蝕 imshow(window_name, dst); return; }