image - 如何从此图像中删除此非红色和非圆形对象?并使红色变为白色,其余为黑色
问题描述
我需要红色圆圈白色,其余为黑色。完全像二进制图像。我可以只过滤掉红色,然后做一些事情,但如何只包括圆圈?我尝试了很多东西,但它不起作用。我猜是因为 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)
解决方案
从 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 的版本中运行代码,请将分配 和 的行替换stats
为keepMask
以下行:
stats = regionprops(L,'Area', 'Perimeter');
%Find the ones that are like a circle
Circularity = (4*[stats(:).Area]*pi)./([stats(:).Perimeter].^2);
keepMask = Circularity>.99;
推荐阅读
- angular - Angular 本地库 StaticInjectorError(AppModule)[HttpHandler -> Injector]
- azure-devops - CI CD 管道 Azure Devops
- java - 使用 JAVA 8 Lambda 使用存储在数据库中的密钥列表解密 JWE
- android - Android 无法解析 ExpandableLayout
- mongodb - 如何在 MongoDB 中查询递归 JSON 文档
- bash - mac上如何使用sed删除部分行和下一行
- firebase - 根据 Firestore 数据库中的数据控制对 Firebase 存储中文件的访问
- python - 如何使用 keras 知道 WGAN 中生成图像的标签
- sql - 无法连接到 SQL
- php - PHP SoapClient - 获取 http 标头时出错