- 一、膨胀与腐蚀原理
- 二、代码实现
- 1.操作像素实现
- 2.Opencv库函数实现:dilate(膨胀)、erode(腐蚀)、getStructuringElement(锚框的形状)
一、膨胀与腐蚀原理
膨胀:锚点邻域最大像素值代替锚点处像素值。
腐蚀:锚点邻域最小像素值代替锚点处像素值。
如图为矩形(3*3)框,还可以为圆形框、椭圆框等。
腐蚀(矩形)代码如下(示例):
#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include#include using namespace cv; using namespace std; int main(int argc, char* argv) { Mat src = imread("1000.jpg",IMREAD_GRAYSCALE); if (!src.data) { cout << "图像为空" << endl; return -1; } Mat src_border; copyMakeBorder(src, src_border,2,2,2,2,CV_8U,Scalar(0)); uchar min,max; for (int i = 2; i < src.rows+2; i++) { for (int j = 2; j < src.cols+2; j++) { uchar vec[9] = { src_border.at (i, j), src_border.at (i - 1, j),src_border.at (i + 1, j), src_border.at (i, j - 1),src_border.at (i, j + 1) ,src_border.at (i - 1, j - 1) , src_border.at (i + 1, j + 1) ,src_border.at (i + 1, j - 1) ,src_border.at (i - 1, j + 1) }; min = 255, max = 0; for (int c = 0; c < 9; c++) { if (vec[c]>=max) max = vec[c]; if (vec[c] (i-2, j-2) = min; } } imshow("board", src); waitKey(); }
膨胀代码(矩形)如下(示例):
#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include2.Opencv库函数实现:dilate(膨胀)、erode(腐蚀)、getStructuringElement(锚框的形状)#include using namespace cv; using namespace std; int main(int argc, char* argv) { Mat src = imread("1000.jpg",IMREAD_GRAYSCALE); if (!src.data) { cout << "图像为空" << endl; return -1; } Mat src_border; copyMakeBorder(src, src_border,2,2,2,2,CV_8U,Scalar(0)); uchar min,max; for (int i = 2; i < src.rows+2; i++) { for (int j = 2; j < src.cols+2; j++) { uchar vec[9] = { src_border.at (i, j), src_border.at (i - 1, j),src_border.at (i + 1, j), src_border.at (i, j - 1),src_border.at (i, j + 1) ,src_border.at (i - 1, j - 1) , src_border.at (i + 1, j + 1) ,src_border.at (i + 1, j - 1) ,src_border.at (i - 1, j + 1) }; min = 255, max = 0; for (int c = 0; c < 9; c++) { if (vec[c]>=max) max = vec[c]; if (vec[c] (i-2, j-2) = max; } } imshow("board", src); waitKey(); }
代码如下(示例):
#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include#include using namespace cv; using namespace std; int main(int argc, char* argv) { Mat src = imread("1000.jpg",IMREAD_GRAYSCALE); if (!src.data) { cout << "图像为空" << endl; return -1; } Mat src_dilate, src_erode; Mat kenel = getStructuringElement(MORPH_RECT,Size(3,3)); dilate(src, src_dilate, kenel); erode(src, src_erode, kenel); imshow("src_dilate", src_dilate); imshow("src_erode", src_erode); waitKey(); }



