目录
1 概念讲解及用处
腐蚀是形态学操作中的一种基本操作,通过结构元素与图像进行最小值运算,将物体边界内部的像素点进行磨损或消除,从而使物体的形状变小且更加平滑。还记得之前讲过的中值滤波吗,其实腐蚀操作可以看作是最小值滤波,对于结构元素下的图像的像素值进行排序,将中心像素替换为最小值。
腐蚀的作用: 腐蚀类似 '领域被蚕食' ,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小.。 图像被腐蚀后,去除了噪声,但是会压缩图像。 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并且保持原有形状。
2 原理
以下图为例,取一个3×3的正方形核,锚点就是正方形核的中心点,假设我们有下图中这个灰度图像矩阵:
图中黄色区域,由于其中的最小值为1,所以其锚点处(红色数字)为1。依次进行滑动窗口的移动,先向右再向下,直到所有元素都被替换掉。
3 API函数详解
在OpenCV中,可以通过erode()函数来实现图像的腐蚀操作。函数的定义如下:
void erode(InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue= morphologyDefaultBorderValue())
函数参数的含义:
src -- 输入图像
dst -- 目标图像
kernel -- 腐蚀核(使用Mat或getStructuringElement创建)
anchor -- 锚点在元素中的位置,默认值(-1,-1)代表锚点在正中心
iterations -- 腐蚀次数
borderType -- 像素外推方式
borderValue -- 恒定边框时的边框值
4 用C++编写代码进行实现
下面是使用OpenCV库在C++中实现图像腐蚀操作的示例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("input.jpg", IMREAD_GRAYSCALE);
if (srcImage.empty())
{
printf("Failed to load image\n");
return -1;
}
Mat dstImage;
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 定义3x3的矩形结构元素
erode(srcImage, dstImage, kernel);
imshow("Source Image", srcImage);
imshow("Eroded Image", dstImage);
waitKey(0);
return 0;
}
在代码中,首先加载输入图像srcImage,然后定义了一个3x3的矩形结构元素kernel。接下来,使用erode()函数对图像进行腐蚀操作,并将结果保存在dstImage中。最后,显示原始图像和腐蚀后的图像,并等待按键退出程序。