Как удалить эти объекты НЕ КРАСНЫЙ И НЕ КРУГ с этого изображения? И сделать красное белым, а остальное черным

Мне нужны красные круги белые, а остальные как черные. Точно так же, как бинарное изображение. Я мог бы отфильтровать только красный цвет, а затем сделать что-то еще, но как включить только круги? Я пробовал много вещей, но это просто не работает. Я думаю, из-за устаревших функций 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)
Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
2
0
347
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

здесь немного другой подход:

% 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);

Извините, я забыл добавить, я должен сделать красные круги белыми, а остальные черными. Как и бинарное изображение, только черно-белое.

Stayheuh 26.12.2020 15:17

если вы используете imshow вместо imagesc, вы, вероятно, увидите черно-белое изображение. в противном случае просто измените палитру в конце графиков на colormap(gray)

bla 27.12.2020 05:00
Ответ принят как подходящий

Начиная с 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 26.12.2020 15:40

@Stayheuh Я рад, что это помогло. И извините за эту часть, я не был достаточно ясен. Я отредактировал, надеюсь теперь понятно.

saastn 26.12.2020 17:18

Другие вопросы по теме