1

У меня есть следующее изображение после запуска приведенного ниже кода.Рисование линии и обрезание области циркулятора

enter image description here

file='grayscale.png'; 
I=imread(file); 
bw = im2bw(I); 
bw = bwareaopen(bw,870); 
imwrite(bw,'noiseReduced.png') 
subplot(2,3,1),imshow(bw); 
[~, threshold] = edge(bw, 'sobel'); 
fudgeFactor = .5; 
im = edge(bw,'sobel', threshold * fudgeFactor); 
subplot(2,3,2), imshow(im), title('binary gradient mask'); 

se = strel('disk',5); 
closedim = imclose(im,se); 
subplot(2,3,3), imshow(closedim), title('Connected Cirlces'); 
cc = bwconncomp(closedim); 

S = regionprops(cc,'Centroid'); //returns the centers S(2) for innercircle 
numPixels = cellfun(@numel,cc.PixelIdxList); 
[biggest,idx] = min(numPixels); 
im(cc.PixelIdxList{idx}) = 0; 
subplot(2,3,4), imshow(im), title('Inner Cirlces Only'); 
c = S(2); 

Моя цель теперь нарисовать красный cirle вокруг круглого объекта (см рисунок) и вырезать область круга (область) из исходного изображения «Я» и сохранить обрезанную область как изображения или выполнять другие задачи. Как мне это сделать?

ответ

1

В качестве альтернативы, вы можете оптимизировать/приспосабливать круг с не менее r, содержащий все точки:

bw = imread('http://i.stack.imgur.com/il0Va.png'); 
[yy xx]=find(bw); 

Теперь p быть три вектора параметризуя круг: p(1), p(2) являются ху координаты центра и p(3) его радиусы. Тогда мы хотим минимизировать r (т.е. p(3)):

obj = @(p) p(3); 

С учетом всех точек внутри круга

con = @(p) deal((xx-p(1)).^2+(yy-p(2)).^2-p(3).^2, []); 

Оптимизация с fmincon:

[p, fval] = fmincon(obj, [mean(xx), mean(yy), size(bw,1)/4], [],[],[],[],[],[],con); 

Урожайность

p = 
471.6397 484.4164 373.2125 

Обращая результат

imshow(bw,'border','tight'); 
colormap gray;hold on; 
t=linspace(-pi,pi,1000); 
plot(p(3)*cos(t)+p(1),p(3)*sin(t)+p(2),'r', 'LineWidth',1); 

enter image description here

Вы можете сгенерировать двоичную маску того же размера, как bw с true в круге и false вне

msk = bsxfun(@plus, ((1:size(bw,2))-p(1)).^2, ((1:size(bw,1)).'-p(2)).^2) <= p(3).^2; 

Маска выглядит как:

enter image description here

+0

Что такое 'img' в fmincon? –

+0

@Nektar опечатка. см. обновление – Shai

+0

Ваше решение верное. Но вместо бинарной маски я хочу обрезать область круга. Я имею в виду, скажем, я получил «bw» из изображения «I». Итак, как я могу обрезать обнаруженный круг из «I»? Или примените бинарную маску на «I» так, чтобы единственная область круга осталась неизменной, а остальная часть области стала черной? –

1

Выпуклый белый пиксель даст вам довольно хорошее приближение круга. Вы можете найти центр как центр тяжести корпуса и радиус как среднее расстояние от центра до вершин корпуса.

+0

Ваше решение прост и работает Vert отлично :) –

+0

@Nektar: спасибо за эту обратную связь. –