MATLAB обработка изображений-поиск края и области изображения

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

enter image description here

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

  1. загрузка изображения, обрезка и преобразование в оттенки серого

3 ответов


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

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

книги:

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

A демонстрация: 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 / блог / индекс.php / архивы/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);

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

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

Это был результат I получено

enter image description here

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


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

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