首页 > 解决方案 > 如何从此图像中删除此非红色和非圆形对象?并使红色变为白色,其余为黑色

问题描述

在此处输入图像描述 我需要红色圆圈白色,其余为黑色。完全像二进制图像。我可以只过滤掉红色,然后做一些事情,但如何只包括圆圈?我尝试了很多东西,但它不起作用。我猜是因为 MATLAB 的不推荐使用的功能。因为其中许多主题至少已有 10 年的历史。我试过这些:

https://nl.mathworks.com/help/images/ref/bwareaopen.html

https://nl.mathworks.com/matlabcentral/answers/19507-remove-non-circle-objects-from-image

我只是用这段代码如此接近,但它仍然留下正方形和六边形。我想让他们走,但不知道怎么走。我尝试增加 minExtend 或减少,但它没有这样做。

I=imread('circlesColored.png');
% Get the image as a b&w indexed (non-rgb) image
R=I(:,:,1);
R=(R>35&R<255);
imshow(R);
bwareaopen(I, 50);
 BW = gray2ind(R, 2);
%Calculate its connected regions
L = bwlabel(BW); % Not using bwconncomps() for older version users
stats = regionprops(L,'Extent','Area');
%Find the ones that are like a circle
minExtent = 0.75;
keepMask = [stats.Extent]>minExtent;
%Extract the image of circles only and display
BWcircles = ismember(L, find(keepMask));
BWnonCircles = BW & ~BWcircles;
%Show the circles
figure, imshow(BWcircles)

标签: imagematlabimage-processing

解决方案


从 R2019a 开始,将'Circularity'属性添加到regionprops. 我修改了你的代码以获得:

close all; clc; clear variables;
I=imread('2JxCA.png');
% Get the image as a b&w indexed (non-rgb) image
R=I(:,:,1);
R=(R>35&R<255);
imshow(R);
%Calculate its connected regions
L = bwlabel(R); % Not using bwconncomps() for older version users
stats = regionprops(L,'Circularity'); 
%Find the ones that are like a circle
keepMask = [stats.Circularity]>.99;
%Extract the image of circles only and display
BWcircles = ismember(L, find(keepMask));
BWnonCircles = R & ~BWcircles;
%Show the circles
figure, imshow(BWcircles)

在此处输入图像描述

但是,如果您使用的是旧版本,请不要担心。文档实际上描述了它是如何计算的:

'Circularity'
对象的圆度,作为具有字段 Circularity 的结构返回。该结构包含输入图像中每个对象的循环值。圆度值计算为 (4*Area*pi)/(Perimeter^2)。对于正圆,圆度值为 1。输入必须是标签矩阵或具有连续区域的二值图像。如果图像包含不连续的区域,则 regionprops 会返回意外结果。

笔记

对于非常小的物体(例如 3×3 正方形),不建议使用圆形。对于这种情况,结果可能会超过完美圆的圆度值。

因此,如果您在早于 R2019a 的版本中运行代码,请将分配 和 的行替换statskeepMask以下行:

stats = regionprops(L,'Area', 'Perimeter'); 
%Find the ones that are like a circle
Circularity = (4*[stats(:).Area]*pi)./([stats(:).Perimeter].^2);
keepMask = Circularity>.99;

推荐阅读