Мне нужны красные круги белые, а остальные как черные. Точно так же, как бинарное изображение. Я мог бы отфильтровать только красный цвет, а затем сделать что-то еще, но как включить только круги? Я пробовал много вещей, но это просто не работает. Я думаю, из-за устаревших функций 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)
здесь немного другой подход:
% remove non-red
thr=100;
I_only_red= I(:,:,1)>thr & I(:,:,2)<thr & I(:,:,3)<thr ;
%remove non circles: we first find the circles in the image
[centers, radii, metric] = imfindcircles(I_only_red,[40 120]);
% and make a mask according to their centers and radii:
[x y]=meshgrid(1:size(I,2),1:size(I,1));
mask=zeros(size(I_only_red));
for n=1:numel(radii)
mask = mask | (x-centers(n,1)).^2+(y-centers(n,2)).^2<=radii(n).^2;
end
давайте построим:
subplot(3,1,1); imagesc(I);
subplot(3,1,2); imagesc(I_only_red);
viscircles(centers , radii ,'EdgeColor','b');
subplot(3,1,3); imagesc(I_only_red.*mask);
если вы используете imshow
вместо imagesc
, вы, вероятно, увидите черно-белое изображение. в противном случае просто измените палитру в конце графиков на colormap(gray)
Начиная с 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)
Но не волнуйтесь, если вы используете более старые версии. Документы на самом деле описали, как он рассчитывается:
«Цикличность»
Округлость объектов, возвращенных как структура с полем Цикличность. Структура содержит значение цикличности для каждого объекта. во входном изображении. Значение цикличности вычисляется как(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;
Это было именно то, что мне было нужно, спасибо. Кстати, не понял, как изменить часть кода. Я могу сделать это как первый, но я собираюсь сделать это и для более старых версий, так куда мне поместить этот код?
@Stayheuh Я рад, что это помогло. И извините за эту часть, я не был достаточно ясен. Я отредактировал, надеюсь теперь понятно.
Извините, я забыл добавить, я должен сделать красные круги белыми, а остальные черными. Как и бинарное изображение, только черно-белое.