針對灰度圖像
1. 腐蝕
實現:在圖像f中的某一像素點,以結構元素B的中心位置處對應該像素點, 若以該像素點為中心,尋找在結構元素B大小覆蓋的鄰域范圍內(圖像f上) 的最小值來代替該點像素值,作為腐蝕后對應位置的像素;簡言之,鄰域內(局部)最小值來代替該點像素。
主要作用:腐蝕過的圖像一般背景比原圖像要稍暗一些,比結構元b小的亮度特征被腐蝕掉了;
c++實現代碼:

void gray_erode(Mat &src, Mat &dst, int n) { std::vector<float> winTotal; src.copyTo(dst); int windows_size = n*n; int edge = n / 2; for (int i = edge; i < src.rows - edge; i++) { uchar * dstptr = dst.ptr(i); for (int j = edge; j < src.cols - edge; j++) { winTotal.clear(); for (int x = -edge; x <= edge; x++) { for (int y = -edge; y <= edge; y++) { winTotal.push_back(src.at<uchar>(i + x, j + y)); } } std::sort(winTotal.begin(), winTotal.end()); /*for (int t = 0; t < winTotal.size(); t++) cout << t << ", " << winTotal[t] << endl;*/ dstptr[j] = winTotal[0]; } } }
2. 膨脹
實現:參考上述腐蝕的實現,只不過這里是用局部最大值來代替;
c++實現代碼:

void gray_dilate(Mat &src, Mat &dst, int n) { std::vector<float> winTotal; src.copyTo(dst); int windows_size = n*n; int edge = n / 2; for (int i = edge; i < src.rows - edge; i++) { uchar * dstptr = dst.ptr(i); for (int j = edge; j < src.cols - edge; j++) { winTotal.clear(); for (int x = -edge; x <= edge; x++) { for (int y = -edge; y <= edge; y++) { winTotal.push_back(src.at<uchar>(i + x, j + y)); } } std::sort(winTotal.begin(), winTotal.end()); /*for (int t = 0; t < winTotal.size(); t++) cout << t << ", " << winTotal[t] << endl;*/ dstptr[j] = winTotal[winTotal.size()-1]; } } }
3. 開操作
實現:先腐蝕(局部最小值),后膨脹(局部最大值);
主要作用:開操作用於去除較小的明亮細節,而保持整體灰度級和較大的明亮特征相對不變;
c++實現代碼:

void gray_openOperation(Mat &src, Mat &dst, int n) { Mat src_temp; gray_erode(src, src_temp, n); gray_dilate(src_temp, dst, n); }
4. 閉操作
實現:先膨脹(局部最大值),后腐蝕(局部最小值);
主要作用:閉操作主要用於削弱暗特征,削弱的程度取決於這些特征相對於結構元的尺寸,而亮的細節和背景相對來說未受影響;
c++實現代碼:

void gray_closeOperation(Mat &src, Mat &dst, int n) { Mat src_temp; gray_dilate(src, src_temp, n); gray_erode(src_temp, dst, n); }
5. 頂帽變換
實現:圖像f減去其開操作;
主要作用:頂帽變換用於暗背景上的亮物體(有待后續完善...);
c++實現代碼:

void gray_topHat(Mat &src, Mat &dst, int n) { Mat src_temp; gray_openOperation(src, src_temp, n); if (src.rows == src_temp.rows && src.cols == src_temp.cols && src.type() == src_temp.type()) { subtract(src, src_temp, dst); } }
6. 底帽操作
實現:圖像f的閉操作減去圖像f;
主要作用:底帽作用用於亮背景上的暗物體(有待后續完善...)
c++實現代碼:

void gray_bottomCap(Mat &src, Mat &dst, int n) { Mat src_temp; gray_closeOperation(src, src_temp, n); if (src.rows == src_temp.rows && src.cols == src_temp.cols && src.type() == src_temp.type()) { subtract(src_temp, src, dst); } }