C++ Opencv自写函数实现膨胀腐蚀处理技巧
什么是膨胀和腐蚀
膨胀和腐蚀是由数字图像处理中的形态学图像处理算法中的基本运算,常用于图像的形态学预处理和后处理。膨胀与腐蚀是两种互为逆运算的形态学变换,常常作为一种处理手段被组合应用。
- 膨胀:将图像中的白色区域(前景色)进行扩张,使上面的白色部分变得更加肥厚。
- 腐蚀:将图像中的白色区域(前景色)进行蚀刻,让上面白色部分变得更加苗条。
OpenCV中实现膨胀和腐蚀的函数
OpenCV中实现膨胀和腐蚀的函数分别为dilate
和erode
,如下所示:
void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor =
Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const
Scalar& borderValue = morphologyDefaultBorderValue());
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
为关于锚点的卷积核,anchor
为卷积核的锚点位置, iterations
为算法的迭代次数。
自行编写膨胀和腐蚀的处理函数
我们可以自行编写膨胀和腐蚀的处理函数来实现相应的功能。下面是一个简单的实现示例:
void customDilate(const cv::Mat& src, int kernelSize, cv::Mat& dst) {
// 这里假定 kernelSize 是奇数
int m = (kernelSize - 1) / 2;
dst = cv::Mat::zeros(src.rows, src.cols, src.type());
for (int i = m; i < src.rows - m; ++i) {
for (int j = m; j < src.cols - m; ++j) {
int max_val = 0;
for (int k = -m; k <= m; ++k) {
for (int l = -m; l <= m; ++l) {
if (src.at<uchar>(i+k, j+l) > max_val) {
max_val = src.at<uchar>(i+k, j+l);
}
}
}
dst.at<uchar>(i, j) = max_val;
}
}
}
void customErode(const cv::Mat& src, int kernelSize, cv::Mat& dst) {
// 这里假定 kernelSize 是奇数
int m = (kernelSize - 1) / 2;
dst = cv::Mat::zeros(src.rows, src.cols, src.type());
for (int i = m; i < src.rows - m; ++i) {
for (int j = m; j < src.cols - m; ++j) {
int min_val = 255;
for (int k = -m; k <= m; ++k) {
for (int l = -m; l <= m; ++l) {
if (src.at<uchar>(i+k, j+l) < min_val) {
min_val = src.at<uchar>(i+k, j+l);
}
}
}
dst.at<uchar>(i, j) = min_val;
}
}
}
示例 1:使用自行编写的函数实现膨胀和腐蚀
// 读入图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
// 自行编写的函数实现膨胀和腐蚀
cv::Mat dilated, eroded;
int kernelSize = 3;
customDilate(img, kernelSize, dilated);
customErode(img, kernelSize, eroded);
// 显示处理结果
cv::imshow("dilated", dilated);
cv::imshow("eroded", eroded);
cv::waitKey();
示例2:使用OpenCV的 dilate
和 erode
函数实现膨胀和腐蚀
// 读入图像
cv::Mat img = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
// 使用OpenCV自带函数实现膨胀和腐蚀
cv::Mat kernel = cv::Mat::ones(3, 3, CV_8UC1);
cv::Mat dilated, eroded;
cv::dilate(img, dilated, kernel);
cv::erode(img, eroded, kernel);
// 显示处理结果
cv::imshow("dilated", dilated);
cv::imshow("eroded", eroded);
cv::waitKey();
以上代码可在OpenCV环境下编译运行并验证其正确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ Opencv自写函数实现膨胀腐蚀处理技巧 - Python技术站