2013-08-22 2 views
7

В качестве предисловия: это мой первый вопрос - я изо всех сил старался сделать его максимально ясным, но приношу свои извинения, если он не соответствует требуемым стандартам.Обработка изображений MATLAB - поиск края и области изображения

Как часть летнего проекта, я беру временные изображения внутренней фигуры расплава, растущей внутри кристалла льда. Для каждого из этих изображений я хотел бы измерить периметр и область, заключенную в фигуру. Linked Ниже приведен пример одного из моих изображений:

enter image description here

Метод, который я пытаюсь использовать следующий:

  1. загрузить изображение, обрезать и конвертировать в оттенках серого
  2. Процесс снижения шума
  3. поиск край/периметр
  4. Попытка соединить края
  5. Заливка периметр с белым
  6. Измерение площади и периметра с использованием regionprops

Это код, который я использую:

clear; close all; 

% load image and convert to grayscale 
tyrgb = imread('TyndallTest.jpg'); 
ty = rgb2gray(tyrgb); 
figure; imshow(ty) 

% apply a weiner filter to remove noise. 
% N is a measure of the window size for detecting coherent features 
N=20; 
tywf = wiener2(ty,[N,N]); 
tywf = tywf(N:end-N,N:end-N); 

% rescale the image adaptively to enhance contrast without enhancing noise 
tywfb = adapthisteq(tywf); 

% apply a canny edge detection 
tyedb = edge(tywfb,'canny'); 

%join edges 
diskEnt1 = strel('disk',8); % radius of 4 
tyjoin1 = imclose(tyedb,diskEnt1); 
figure; imshow(tyjoin1) 

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

enter image description here

Причина, по которой я пытаюсь соединить края так, что я могу заполнить периметр с белыми пикселями, а затем использовать regionprops для вывода площадь. Я попытался использовать команду imfill, но, похоже, не может заполнить контур, так как в пределах периметра имеется большое количество темных областей.

Есть ли лучший способ получить область одной из этих фигур расплава, которая является более подходящей в этом случае?

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

clear all 
close all 
clc 

%% Read in RGB image from directory 
RGB1 = imread('1.jpg') ; 

%% Convert RPG image to grayscale image 
I1 = rgb2gray(RGB1)  ; 

%% Transform Image 
%CROP 
IC1 = imcrop(I1,[74 43 278 285]); 

%BINARY IMAGE 
BW1 = im2bw(IC1); %Convert to binary image so the boundary can be traced 

%FIND PERIMETER 
BWP1 = bwperim(BW1); 
%Traces perimeters of objects & colours them white (1). 
%Sets all other pixels to black (0) 
%Doing the same job as an edge detection algorithm? 

%FILL PERIMETER WITH WHITE IN ORDER TO MEASURE AREA AND PERIMETER 
BWF1 = imfill(BWP1); %This opens figure and allows you to select the areas to fill with white. 

%MEASURE PERIMETER 
D1 = regionprops(BWF1, 'area', 'perimeter'); 
%Returns an array containing the properties area and perimeter. 
%D1(1) returns the perimeter of the box and an area value identical to that 
%perimeter? The box must be bounded by a perimeter. 
%D1(2) returns the perimeter and area of the section filled in BWF1 

%% Display Area and Perimeter data 
D1(2) 
+1

Upvoted потому, что вы сделали отличную работу задавая вопрос. – guyrt

ответ

2

Возможно, вы захотите рассмотреть активные контуры. Это даст вам непрерывную границу объекта, а не пятнистые края.

Ниже приведены ссылки на

Книга:

http://www.amazon.co.uk/Active-Contours-Application-Techniques-Statistics/dp/1447115570/ref=sr_1_fkmr2_1?ie=UTF8&qid=1377248739&sr=8-1-fkmr2&keywords=Active+shape+models+Andrew+Blake%2C+Michael+Isard

Демонстрационный: http://users.ecs.soton.ac.uk/msn/book/new_demo/Snakes/

и некоторые Matlab код на бирже Файл: http://www.mathworks.co.uk/matlabcentral/fileexchange/28149-snake-active-contour

и в ссылка на описание того, как имплантировать ление его: http://www.cb.uu.se/~cris/blog/index.php/archives/217

Использование реализации на бирже файла, вы можете получить что-то вроде этого:

%% Load the image 
% You could use the segmented image obtained previously 
% and then apply the snake on that (although I use the original image). 
% This will probably make the snake work better and the edges 
% in your image is not that well defined. 
% Make sure the original and the segmented image 
% have the same size. They don't at the moment 
I = imread('33kew0g.jpg'); 

% Convert the image to double data type 
I = im2double(I); 
% Show the image and select some points with the mouse (at least 4) 
% figure, imshow(I); [y,x] = getpts; 
% I have pre-selected the coordinates already 
x = [ 525.8445 473.3837 413.4284 318.9989 212.5783 140.6320 62.6902 32.7125 55.1957 98.6633 164.6141 217.0749 317.5000 428.4172 494.3680 527.3434 561.8177 545.3300]; 
y = [ 435.9251 510.8691 570.8244 561.8311 570.8244 554.3367 476.3949 390.9586 311.5179 190.1085 113.6655 91.1823 98.6767 106.1711 142.1443 218.5872 296.5291  375.9698]; 

% Make an array with the selected coordinates 
P=[x(:) y(:)]; 
%% Start Snake Process 
% You probably have to fiddle with the parameters 
% a bit more that I have 
Options=struct; 
Options.Verbose=true; 
Options.Iterations=1000; 
Options.Delta = 0.02; 
Options.Alpha = 0.5; 
Options.Beta = 0.2; 
figure(1); 
[O,J]=Snake2D(I,P,Options); 
0

Если конечный результат оценить область/диаметр, то почему бы не попытаться найти максимальные и минимальные формы, которые соответствуют в общих чертах, а затем использовать площадь шейпов, чтобы оценить общую площадь. Например, вычислите минимальный круг вокруг край, затем максимальный круг внутри края. Затем вы можете использовать их для оценки диаметра и площади фактической формы.

Преимущество состоит в том, что ваши ограничивающие формы могут быть подогнаны таким образом, чтобы минимизировать ошибку (неограниченные края) при оптимизации размера вверх или вниз для внутренней и внешней формы соответственно.

+0

Я не думал об этой идее - я попробую оценить эту область. К сожалению, мне также необходимо измерить периметр. Я также задавался вопросом, можно ли начать с круга, большего, чем фигура, а затем сжать его, чтобы окружить периметр. Вид как лассо или термоусадочная машина. Я не уверен, существует ли такой алгоритм? –

3

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

tyedb = edge(tywfb,'sobel',0.012); 

%join edges 

diskEnt1 = strel('disk',7); % radius of 4 
tyjoin1 = imclose(tyedb,diskEnt1); 

Кроме того, я использовал bwfill в интерактивном режиме, чтобы заполнить большую часть интерьера. Должно быть возможным наполнить интерьер программно, но я не преследовал этого.

% interactively fill internal regions 

[ny nx] = size(tyjoin1); 
figure; imshow(tyjoin1) 
tyjoin2=tyjoin1; 
titl = sprintf('click on a region to fill\nclick outside window to stop...') 
while 1 
    pts=ginput(1) 
    tyjoin2 = bwfill(tyjoin2,pts(1,1),pts(1,2),8); 
    imshow(tyjoin2) 
    title(titl) 
    if (pts(1,1)<1 | pts(1,1)>nx | pts(1,2)<1 | pts(1,2)>ny), break, end 
end 

Это результат я получил

enter image description here

«фрактал» свойства периметра может иметь важное значение для вас, однако. Возможно, вы хотите сохранить складки в своей форме.

Смежные вопросы