这段MATLAB代码展示了如何使用MATLAB 2018b中的图像处理函数来筛选轮廓。以下是代码的主要步骤:

  1. 导入图像并获取其尺寸。
  2. 定义圆心和半径,创建一个全黑图像,并在图像上绘制白色圆环。
  3. 将圆环区域的像素值应用到原始图像。
  4. 对原始图像进行滤波,以减少噪声。
  5. 对滤波后的图像进行二值化分割,提取黑色部分。
  6. 提取二值化图像对应的轮廓。
  7. 删除孤岛对应的轮廓,以去除不需要的小区域。
  8. 设置周长、面积和角点的阈值,初始化筛选后的轮廓线。
  9. 对每个轮廓进行筛选,根据周长、面积和角点数来选择符合条件的轮廓。
  10. 将筛选后的轮廓线绘制在原始图像上。

请注意,代码中的参数阈值可能需要根据您的具体需求和图像特性进行调整。您可以根据实际情况修改参数的值,以获得最佳的轮廓筛选效果。

% 导入图像
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('轮廓线');
MATLAB图像轮廓筛选教程:使用图像处理函数提取感兴趣的轮廓

原文地址: http://www.cveoy.top/t/topic/sAA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录