Обнаружение контура в MATLAB - PullRequest
5 голосов
/ 02 мая 2011

Я пытаюсь понять этот код:

d=edge(d,'canny',.6);
figure,
imshow(d,[])

ds = bwareaopen(d,40);
figure,
imshow(ds,[])

iout = d1;
BW=ds;

iout(:,:,1) = iout;
iout(:,:,2) = iout(:,:,1);
iout(:,:,3) = iout(:,:,1);
iout(:,:,2) = min(iout(:,:,2) + BW, 1.0);
iout(:,:,3) = min(iout(:,:,3) + BW, 1.0);

Я понимаю, что d - это изображение, и для него применен хитрый детектор, а 40 пикселей игнорируются. Изображение серого цвета и контур добавляется к изображению.

Не могли бы вы объяснить следующие строки? Какой принцип / алгоритм используется здесь? У меня проблемы, особенно с частью кода для обнаружения контуров.

1 Ответ

10 голосов
/ 02 мая 2011

Если предположить, что переменная d1 хранит то, что является вероятным представлением двойной точности (значения от 0 до 1) исходного изображения с интенсивностью серого , на котором выполняется операция, то последние 5 строк повернут этоИзображение в градациях серого в 3-D RGB-изображение iout, которое выглядит так же, как исходное изображение в градациях серого, за исключением того, что контуры будут накладываться на изображение в голубом цвете.

Вот пример,используя изображение 'cameraman.tif', которое входит в состав MATLAB Toolbox Toolbox :

d1 = double(imread('cameraman.tif'))./255;  % Load the image, scale from 0 to 1
subplot(2, 2, 1); imshow(d1); title('d1');  % Plot the original image
d = edge(d1, 'canny', .6);                  % Perform Canny edge detection
subplot(2, 2, 2); imshow(d); title('d');    % Plot the edges
ds = bwareaopen(d, 40);                     % Remove small edge objects
subplot(2, 2, 3); imshow(ds); title('ds');  % Plot the remaining edges
iout = d1;
BW = ds;
iout(:, :, 1) = iout;                           % Initialize red color plane
iout(:, :, 2) = iout(:, :, 1);                  % Initialize green color plane
iout(:, :, 3) = iout(:, :, 1);                  % Initialize blue color plane
iout(:, :, 2) = min(iout(:, :, 2) + BW, 1.0);   % Add edges to green color plane
iout(:, :, 3) = min(iout(:, :, 3) + BW, 1.0);   % Add edges to blue color plane
subplot(2, 2, 4); imshow(iout); title('iout');  % Plot the resulting image

И вот рисунок, который создает приведенный выше код:

enter image description here

Как это работает ...

Создание изображения iout не имеет ничего общего с алгоритмом обнаружения края.Это просто простой способ отобразить края, найденные в предыдущих шагах.2-мерное изображение с интенсивностью серого не может отображать цвет, поэтому, если вы хотите добавить цветные контурные линии к изображению, вы должны сначала преобразовать его в формат, который позволит вам показать цвет: либо индексированное изображение (по моему опыту это немного сложнее) или трехмерное RGB-изображение (третье измерение представляет красный, зеленый и синий цветовые компоненты каждого пикселя).

Репликация в оттенках серогоизображение 3 раза в третьем измерении дает нам трехмерное изображение RGB, которое изначально все еще содержит серые цвета (равное количество красного, зеленого и синего на пиксель).Однако, изменяя определенные пиксели каждой цветовой плоскости, мы можем добавить цвет к изображению.При добавлении логической маски ребер BW (те, где ребра находятся, а в другом месте нули) к зеленым и синим цветным плоскостям, те пиксели, где были найдены контуры, станут голубыми.Вызов функции min гарантирует, что результат добавления изображений никогда не приведет к тому, что значение цвета пикселя превысит значение 1.0, которое является максимальным значением, которое элемент должен иметь для двойной точностиТрехмерное изображение RGB.

Следует также отметить, что код для создания трехмерного изображения RGB можно упростить до следующего:

iout = d1;
iout(:, :, 2) = min(d1+ds, 1.0);
iout(:, :, 3) = min(d1+ds, 1.0);
...