3

Я пытаюсь найти способ обрезать из объекта окружности (изображение A) наибольший квадрат, который может поместиться внутри него.Обрезать наибольшую площадь внутри объекта круга - Matlab

Может кто-нибудь объяснит/покажет мне, как найти самые большие квадратные параметры белого пространства внутри круга (изображение I) и на их основе обрезать квадрат в исходном изображении (изображение A).

Сценарий:

A = imread('E:/CirTest/Test.jpg'); 
%imshow(A) 
level = graythresh(A); 
BW = im2bw(A,level); 
%imshow(BW) 
I = imfill(BW, 'holes'); 
imshow(I) 

d = imdistline; 
[centers, radii, metric] = imfindcircles(A,[1 500]); 

imageCrop=imcrop(A, [BoxBottomX BoxBottomY NewX NewY]); 

enter image description here

+0

Если 'imfindcircles' предоставляет вам с центром и радиусами, вы не можете выработать ограничительную рамку? Нарисуйте его на листе бумаги и сделайте второй взгляд. (Независимо от того, правильно ли работает imfindcircles на этих изображениях, это другое дело). – nkjt

ответ

5

У меня есть для вас решение, но это требует немного дополнительной работы. Сначала я хотел бы использовать imfill, но непосредственно на изображении в градациях серого. Таким образом, шумные пиксели в однородных областях окрашиваются одинаковыми интенсивностями, так что пороговое значение становится проще. Вы по-прежнему можете использовать graythresh или порог Otsu и делать это на изображении, украшенном картиной.

Вот код, чтобы вы начали:

figure; % Open up a new figure 

% Read in image and convert to grayscale 
A = rgb2gray(imread('http://i.stack.imgur.com/vNECg.jpg')); 
subplot(1,3,1); imshow(A); 
title('Original Image'); 

% Find the optimum threshold via Otsu 
level = graythresh(A); 

% Inpaint noisy areas 
I = imfill(A, 'holes'); 
subplot(1,3,2); imshow(I); 
title('Inpainted image'); 

% Threshold the image 
BW = im2bw(I, level); 
subplot(1,3,3); imshow(BW); 
title('Thresholded Image'); 

выше код выполняет три операции, которые я упомянул, и мы видим эту цифру:

enter image description here

Обратите внимание, что пороговое изображение имеет пиксели границы, которые необходимо удалить, чтобы мы могли сосредоточиться на круговом объекте. Вы можете использовать функцию imclearborder, чтобы удалить граничные пиксели. Когда мы делаем это:

% Clear off the border pixels and leave only the circular object 
BW2 = imclearborder(BW); 
figure; imshow(BW2); 

... мы теперь получить это изображение:

enter image description here

К сожалению, есть некоторые шумные пиксели, но мы можем очень легко использовать морфологию, в частности, операция открытия с небольшим круговым дисковым структурирующим элементом, чтобы удалить эти шумные пиксели. Использование strel с соответствующим структурным элементом в дополнении к imopen должно помочь сделать трюк:

% Clear out noisy pixels 
SE = strel('disk', 3, 0); 
out = imopen(BW2, SE); 
figure; imshow(out); 

Теперь мы получаем:

enter image description here

Этой маска содержит расположение круглого объекта, мы теперь должны используйте, чтобы обрезать исходное изображение. Последняя часть, чтобы определить расположение строк и столбцов, используя эту маску, чтобы найти верхний левый и нижний правый угол исходного изображения и, таким образом, мы кадрирование:

% Find row and column locations of circular object 
[row,col] = find(out); 

% Find top left and bottom right corners 
top_row = min(row); 
top_col = min(col); 
bottom_row = max(row); 
bottom_col = max(col); 

% Crop the image 
crop = A(top_row:bottom_row, top_col:bottom_col); 

% Show the cropped image 
figure; imshow(crop); 

Теперь мы получаем:

enter image description here

Это не идеально, но, конечно же, вы начнете. Если вы хотите скопировать и вставить это в полном объеме и запустить его на своем компьютере, то здесь мы находимся:

figure; % Open up a new figure 

% Read in image and convert to grayscale 
A = rgb2gray(imread('http://i.stack.imgur.com/vNECg.jpg')); 
subplot(2,3,1); imshow(A); 
title('Original Image'); 

% Find the optimum threshold via Otsu 
level = graythresh(A); 

% Inpaint noisy areas 
I = imfill(A, 'holes'); 
subplot(2,3,2); imshow(I); 
title('Inpainted image'); 

% Threshold the image 
BW = im2bw(I, level); 
subplot(2,3,3); imshow(BW); 
title('Thresholded Image'); 

% Clear off the border pixels and leave only the circular object 
BW2 = imclearborder(BW); 
subplot(2,3,4); imshow(BW2); 
title('Cleared Border Pixels'); 

% Clear out noisy pixels 
SE = strel('disk', 3, 0); 
out = imopen(BW2, SE); 

% Show the final mask 
subplot(2,3,5); imshow(out); 
title('Final Mask'); 

% Find row and column locations of circular object 
[row,col] = find(out); 

% Find top left and bottom right corners 
top_row = min(row); 
top_col = min(col); 
bottom_row = max(row); 
bottom_col = max(col); 

% Crop the image 
crop = A(top_row:bottom_row, top_col:bottom_col); 

% Show the cropped image 
subplot(2,3,6); 
imshow(crop); 
title('Cropped Image'); 

...и наша окончательная цифра:

enter image description here

+0

Большое спасибо, впечатляет. Я добавил out = bwareaopen (out, 500); в разделе% Очистить шумные пиксели. ссылка: [ссылка] (http://tinypic.com/view.php?pic=netgcz&s=9#.V3jS-aJeFao). Возможно ли, что квадратная рамка будет находиться внутри круга, как в [link] (http://tinypic.com/view.php?pic=16c5gr9&s=9#.V3jQHqJeFap). Кроме того, как культура может быть наибольшей площадью внутри этого круга. – hsi

+0

Это самая большая часть. – rayryeng

+0

Спасибо за терпение, но я имею в виду, что это самый большой квадрат, как в ссылке (отмечен красным цветом в ссылке) [link] (http://tinypic.com/r/2cp3qjs/9). – hsi

3

Вы можете использовать bwdist с L_inf расстояния (ака 'chessboard'), чтобы получить выровненный по осям расстоянию до краев области, таким образом, заключающих размеров самой большой ограниченной коробки:

bw = imread('http://i.stack.imgur.com/7yCaD.png'); 
lb = bwlabel(bw); 
reg = lb==2; %// pick largest area 
d = bwdist(~reg,'chessboard'); %// compute the axis aligned distance from boundary inward 
r = max(d(:)); %// find the largest distance to boundary 
[cy cx] = find(d==r,1); %// find the location most distant 
boundedBox = [cx-r, cy-r, 2*r, 2*r]; 

И результат

figure; 
imshow(bw,'border','tight'); 
hold on; 
rectangle('Position', boundedBox, 'EdgeColor','r'); 

enter image description here

После того, как у вас есть прямоугольник, вы можете использовать imcrop обрезать исходное изображение

imageCrop = imcrop(A, boundedBox); 

В качестве альтернативы, вы можете

imageCrop = A(cy + (-r:r-1), cx + (-r:r-1)); 
+0

Я получаю эту ошибку «Неопределенная функция или переменная« lb ». Ошибка в Untitled2 (строка 2) reg = lb == 2;% // выберите наибольшую площадь». Что означает значение ==? – hsi

+0

Что вы имели в виду под lb = be label (be) ;? – lroca

+0

Спасибо, как я могу преобразовать строку boundedBox = [cx-r, cy-r, 2 * r, 2 * r] в структуру crop = A (top_row: bottom_row, top_col: bottom_col)? – hsi