MATLAB图像轮廓筛选教程:使用图像处理函数提取感兴趣的轮廓
这段MATLAB代码展示了如何使用MATLAB 2018b中的图像处理函数来筛选轮廓。以下是代码的主要步骤:
- 导入图像并获取其尺寸。
- 定义圆心和半径,创建一个全黑图像,并在图像上绘制白色圆环。
- 将圆环区域的像素值应用到原始图像。
- 对原始图像进行滤波,以减少噪声。
- 对滤波后的图像进行二值化分割,提取黑色部分。
- 提取二值化图像对应的轮廓。
- 删除孤岛对应的轮廓,以去除不需要的小区域。
- 设置周长、面积和角点的阈值,初始化筛选后的轮廓线。
- 对每个轮廓进行筛选,根据周长、面积和角点数来选择符合条件的轮廓。
- 将筛选后的轮廓线绘制在原始图像上。
请注意,代码中的参数阈值可能需要根据您的具体需求和图像特性进行调整。您可以根据实际情况修改参数的值,以获得最佳的轮廓筛选效果。
% 导入图像
image = imread('image.bmp');
% 获取图像尺寸
[rows, cols] = size(image);
% 定义圆心和半径
centerX = 2562.4506; % 圆心x坐标
centerY = 2561.623; % 圆心y坐标
radiusInner = 800; % 内圆半径
radiusOuter = 2000; % 外圆半径
% 创建一个与图像大小相同的全黑图像
modifiedImage = 255*ones(rows, cols, 'uint8');
% 在全黑图像上绘制白色圆环
circleMask = false(rows, cols);
[circleX, circleY] = meshgrid(1:cols, 1:rows);
distanceToCenter = sqrt((circleX - centerX).^2 + (circleY - centerY).^2);
circleMask(distanceToCenter >= radiusInner & distanceToCenter <= radiusOuter) = true;
modifiedImage(circleMask) = 0;
% 将圆环区域的像素值应用到原始图像
modifiedImage(circleMask) = image(circleMask);
% 导入图像
image = modifiedImage;
% 滤波
filteredImage = imgaussfilt(image);
% 二值化分割提取黑色部分
threshold = graythresh(filteredImage);
binaryImage = imbinarize(filteredImage, threshold);
% 提取二值化对应的轮廓
binaryContours = bwboundaries(binaryImage);
% 删除孤岛对应的轮廓
noIslandImage = bwareaopen(binaryImage, 100); % 根据需要调整孤岛大小阈值
noIslandContours = bwboundaries(noIslandImage);
% 设置周长和面积的阈值
minPerimeter = 5000; % 最小周长阈值
maxPerimeter = 90000;
maxArea = 20000; % 最大面积阈值
minArea=11600;
minCornerPoints = 3000; % 最小角点数阈值
maxCornerPoints = 10000;
% 初始化筛选后的轮廓线
selectedContours = false(size(binaryImage));
% 对轮廓进行筛选
for k = 1:length(noIslandContours)
contour = noIslandContours{k};
% 计算当前轮廓的周长和面积
perimeter = length(contour);
area = numel(contour);
% 使用 detectHarrisFeatures 函数检测轮廓中的角点
% points = detectHarrisFeatures(contour);
% % 先将FilterSize设置为一个较小的值,例如3
% filterSize = 3;
%
% % 调用detectMinEigenFeatures函数,并传入图像和修改后的FilterSize参数值
% points = detectMinEigenFeatures(contour, 'FilterSize', filterSize);
% 计算角点数
% numCornerPoints = points.Count;
% 根据周长和面积进行筛选
if perimeter > minPerimeter && area < maxArea&& area > minArea && perimeter < maxPerimeter
% 将符合条件的轮廓线添加到selectedContours中
k=k
perimeter = length(contour)
area = numel(contour)
% 使用detectMinEigenFeatures函数检测角点
% 在轮廓内提取感兴趣的区域
xmin = min(contour(:, 2));
xmax = max(contour(:, 2));
ymin = min(contour(:, 1));
ymax = max(contour(:, 1));
roi = [xmin, ymin, xmax-xmin, ymax-ymin];
% cornerPoints = detectMinEigenFeatures(image, 'ROI', contour);
cornerPoints = detectMinEigenFeatures(image, 'ROI', roi);
% 根据最小角点数进行筛选
if cornerPoints.Count >= minCornerPoints
cornerPoints.Count
selectedContours(sub2ind(size(binaryImage), contour(:,1), contour(:,2))) = true;
end
end
end
% 绘制轮廓线在原始图像上
figure;
imshow(image);
hold on;
% 绘制筛选后的轮廓线
[B, ~] = bwboundaries(selectedContours);
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2);
end
title('轮廓线');
原文地址: http://www.cveoy.top/t/topic/sAA 著作权归作者所有。请勿转载和采集!