现在有两张二值化图像分别是目标的轮廓图片和一个图像中目标阈值分割后的特征图要求将距离轮廓50个像素的以外的特征图中面积小于10的特征点过滤掉距离目标轮廓50个像素点以内的像素还是按照原来二值化结果保留不使用findContours要求运行时间和算法复杂度最小的C++代码
以下是一个简单的C++代码示例,使用OpenCV库实现该任务:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取目标轮廓图片和特征图
Mat contour = imread("contour.png", IMREAD_GRAYSCALE);
Mat feature = imread("feature.png", IMREAD_GRAYSCALE);
// 创建距离变换图像,计算每个像素到最近的轮廓像素的距离
Mat distance;
distanceTransform(contour, distance, DIST_L2, 5);
// 过滤面积小于10的特征点
for (int y = 0; y < feature.rows; y++)
{
for (int x = 0; x < feature.cols; x++)
{
// 如果该像素距离轮廓超过50个像素,且像素值为1(即特征点)
if (distance.at<float>(y, x) > 50 && feature.at<uchar>(y, x) == 1)
{
// 计算该像素的连通区域面积
Mat mask = Mat::zeros(feature.size(), CV_8UC1);
floodFill(feature, mask, Point(x, y), Scalar(255));
int area = countNonZero(mask);
// 如果面积小于10,将该像素设置为0
if (area < 10)
{
feature.at<uchar>(y, x) = 0;
}
}
}
}
// 保存结果
imwrite("result.png", feature);
return 0;
}
该代码首先使用distanceTransform函数计算目标轮廓图片的距离变换图像,然后遍历特征图中的每个像素,如果该像素距离轮廓超过50个像素且像素值为1,就计算该像素所在的连通区域面积,如果面积小于10,就将该像素设置为0。最后保存处理后的特征图
原文地址: https://www.cveoy.top/t/topic/dpre 著作权归作者所有。请勿转载和采集!