Алгоритм обнаружения краев без потери цвета - PullRequest
1 голос
/ 08 января 2012

Я ищу алгоритм (C #) или некоторую информацию о том, как определить край какого-либо объекта на изображении (целью является меланома). Я нашел библиотеку AForge.NET, но мне нужно обнаружить edge without losing the image color. Приведенные ниже примеры были подготовлены с использованием Paint.NET

До:

enter image description here

после

enter image description here

Мне нужен только этот синий край (цвет внутри не имеет значения) или координаты этих синих пикселей

EDIT

Мэтью Чемберс был прав, преобразование изображения в градации серого повышает эффективность алгоритма. Первое результирующее изображение основано на исходном цветном изображении, а второе - на изображении в градациях серого. Синие пиксели соответствуют значению HSV <30. Вы можете увидеть различия самостоятельно. Спасибо, m8! </p>

enter image description here

Ответы [ 4 ]

3 голосов
/ 08 января 2012

Вам необходимо учесть несколько моментов, связанных с проблемой, которую вы пытаетесь решить.

Что такое край на картинке? Как правило, это когда цвет меняется с высокой скоростью. То есть от темноты к свету за короткое время.

Но тут возникает вопрос о том, какова на самом деле высокая скорость изменения цвета. Например, значения Red и Green могут оставаться неизменными, в то время как значение Blue изменяется с высокой скоростью. Будем ли мы считать это преимуществом? Это может произойти для любой комбинации значений RGB.

По этой причине изображения обычно преобразуются в оттенки серого для обнаружения края - в противном случае вы можете получить разные результаты для каждого значения RGB.

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

1 голос
/ 09 января 2012

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

Здесьэто код в Matlab, чтобы проиллюстрировать, что я имею в виду:

function FindThresh()
    i = imread('c:\b.png');
    figure;imshow(i);
    graythresh(i)
    th = graythresh(i(:,:,2))*255;
    figure;imshow(i(:,:,2)>th)
    i1 = imclose(i(:,:,2)>th,strel('diamond',3));
    figure;imshow(i1)
    e = edge(i1);
    indexes = find(e);
    [r,c]=ind2sub(size(i1),indexes)

    figure;imshow(e)
    figure;imshow(i);hold on; scatter(c,r);
end

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

The figures

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

1 голос
/ 09 января 2012

Вы можете преобразовать в цветовое пространство Lab, разделить каналы, выполнить код обнаружения края (как тот, который приведен в другом ответе) только на L-канале, а затем добавить каналы a и b.

1 голос
/ 08 января 2012

Как насчет использования Edges класса:

// create filter
Edges filter = new Edges();
// apply the filter
var newImage = filter.Apply(orignalImage);

Затем выполните порог для newImages, наконец наложив newImage поверх originalImage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...