索引地址:系列教程索引地址
OpenCV图片默认背景色为黑色
腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;
膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的空洞。
简单来说,腐蚀会放大黑色区域使图片变黑,膨胀会缩小黑色区域使图片变白。
腐蚀
腐蚀函数:
| void cv::erode (InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue =morphologyDefaultBorderValue() )
|
- InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
- OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
- InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。
- Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
- iterations,迭代使用erode()函数的次数,默认值为1。
- borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。
- borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue,一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter函数得到更详细的解释。
腐蚀膨胀操作需要的核获取腐蚀固定,调用函数获取就行了。
使用erode函数,一般我们只需要填前面的三个参数,后面的四个参数都有默认值。
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <opencv2/opencv.hpp> using namespace cv;
int main() { Mat srcImage = imread("1.jpg"); imshow("Original", srcImage); Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstImage; erode(srcImage, dstImage, element); imshow("Result", dstImage); waitKey(0);
return 0; }
|
腐蚀结果:

可以看出图片中黑色像素增加了。
膨胀
| void cv::dilate (InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar & borderValue=orphologyDefaultBorderValue() );
|
参数为输入,输出,处理核等等,和腐蚀类似。
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <opencv2/opencv.hpp> using namespace cv;
int main() { Mat image = imread("1.jpg"); imshow("Original Image", image);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat out; dilate(image, out, element);
imshow("Result", out); waitKey(0);
return 0; }
|
结果如下:

结果中白色像素增加,整体变亮。
动态显示
通过滑动栏动态调整参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv;
Mat g_srcImage, g_dstImage; int g_nTrackbarNumer = 0; int g_nStructElementSize = 3;
void Process(); void on_TrackbarNumChange(int, void *); void on_ElementSizeChange(int, void *);
int main( ) { g_srcImage = imread("../data/images/1.jpg"); if( !g_srcImage.data ) { printf("读取srcImage错误~!\n"); return false; }
imshow("Original", g_srcImage);
Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize )); erode(g_srcImage, g_dstImage, element); imshow("Result", g_dstImage);
createTrackbar("腐蚀/膨胀", "Result", &g_nTrackbarNumer, 1, on_TrackbarNumChange); createTrackbar("内核尺寸", "Result", &g_nStructElementSize, 21, on_ElementSizeChange);
cout<<endl<<"\t运行成功,请调整滚动条观察图像效果~\n\n" <<"\t按下“q”键时,程序退出。\n";
while(char(waitKey(1)) != 'q') {}
return 0; }
void Process() { Mat element = getStructuringElement(MORPH_RECT, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point( g_nStructElementSize, g_nStructElementSize ));
if(g_nTrackbarNumer == 0) { erode(g_srcImage, g_dstImage, element); } else { dilate(g_srcImage, g_dstImage, element); }
imshow("Result", g_dstImage); }
void on_TrackbarNumChange(int, void *) { Process(); }
void on_ElementSizeChange(int, void *) { Process(); }
|
代码没什么难点,就是函数整合。需要了解前面所说的回调函数。当然了C++不会的话我也没办法。
效果在B站中:腐蚀膨胀动态效果