почему этот код обнаружения контура не работает должным образом?

#matlab #image-processing #edge-detection

#matlab #обработка изображений #обнаружение края

Вопрос:

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

Мы предлагаем использовать локальный метод, который проверяет изменения освещенности в пределах выбранного окна n * n . Обычно мы используем окно 3 * 3 и разделили изображение на множество перекрывающихся областей такого размера. Для каждой из этих областей мы рассчитали среднее значение и стандартное отклонение значений интенсивности пикселей в окрестности 8 пикселей.

Для этой части я написал:

 e=imread('1.jpg');
p=rgb2gray(e);
p=im2double(p);
h=[1 1 1;
   1 1 1;
   1 1 1;]; 
h=h/9;
u=imfilter(p,h);% average filter
Size=size(e);
n=3;
e=[1 1 1;
   1 1 1;
   1 1 1;]; 
Di=stdfilt(p,e); % standard deviation
  

Здесь у меня проблема: что означает 8-пиксельная окрестность? Это то, что (а) я не должен использовать центральный пиксель каждого локального окна 3 * 3, или это (б) просто другой термин для локального окна?

Теперь остальная часть алгоритма из статьи:

Затем мы решаем, принадлежит ли центральный пиксель исследуемой области линии или фону. Для максимального значения интенсивности пикселя Ihigh и минимального значения интенсивности пикселя в области Ilow мы вычисляем разницу S (i, j), такую как:
S (i, j) =Ihigh-Ilow
и сравниваем ее с определенным пороговым значением. Мы предлагаем использовать среднее значение и стандартное отклонение интенсивностей пикселей при вычислении порогового значения T (i, j), используемого при определении контура. T = u-k * sd (sd = стандартное отклонение), где k — определенное значение.Тогда правило для определения контура таково:
g (i, j) = 1, если S (i, j)>=T (i, j) и 0, если S (i,j) < T (i, j) В результате мы получаем двоичное изображение g (i, j) с обнаруженными контурами. Более того, константа k позволяет настраивать и изменять чувствительность алгоритма обнаружения контуров,»

Я написал этот код для этой части:

 k=1;
Div=k*Di;
t=u-Div;
min=ordfilt2(p,1,ones(3,3));
max=ordfilt2(p,3*3,ones(3,3));
s=max-min;
g=zeros(Size(1),Size(2));
for I=1:Size(1)
    for J=1:Size(2)
        if(s(I,J) >= t(I, J))
            g(I, J) = 1;
        else
            g(I, J) = 0;
        end
    end
end
g=imadjust(g,[0 1],[1,0]);
imshow(g)
  

Я не уверен насчет этих двух строк:

  min=ordfilt2(p,1,ones(3,3));
 max=ordfilt2(p,3*3,ones(3,3);
  

Основываясь на том, что говорилось в документе, есть ли что-нибудь, чего мне не хватает? или какие-либо недоразумения?

Это пример, показанный в статье:

пример из статьи

и это то, что у меня есть:

собственный результат

исходное изображение:

оригинал

Комментарии:

1. Можем ли мы увидеть в сообщении, что вы хотите и что у вас есть? Также изображение, которое вы используете. Даже если я попытаюсь, я не смогу скомпилировать код в своей голове, извините.

2. Мне нужен контур изображения уха, подобный тому, который показан в статье. Я попытался добавить картинку, которая у меня есть, но сайт не позволяет мне, потому что у меня всего 6 репутации (у вас должно быть не менее 10)

3. ваше среднее значение немного не соответствует действительности: h=h/8; и не делится на 9! у вас установлено всего 8 пикселей h . можете ли вы также опубликовать входное изображение, которое вы используете для получения этого результата?

4. таково мое восприятие статьи, в которой говорится «соседство в 8 пикселей», и я не уверен в этом, я не знаю, должен ли я создавать это окно h = fspecial (‘average’, 3) или то, которое я написал в коде выше?

Ответ №1:

Я думаю, ваш результат выглядит не так уж плохо. О различиях:

  • У вас больше шума, но это может быть потому, что у вас более высокое разрешение, позволяющее отображать больше деталей на вашем изображении. Вы могли бы попробовать применить фильтр Гаусса к вашему изображению, прежде чем находить контуры.
  • На вашем изображении может быть намного больше значений серого, чем на изображении бумаги. Таким образом, более подробную информацию можно найти в виде контуров с помощью этого алгоритма.
  • Может быть, это просто из-за другого значения для k .

Тем не менее, я думаю, вам следует сравнить изображение вашего уха с серым значением с результатом.

соседство с 8 пикселями в 2d означает, что вы используете пиксель не посередине, а по всему периметру. Я не могу оценить влияние этого на результат по сравнению с использованием 9 пикселей.

Комментарий к вашему коду: Вы могли бы заменить

 for I=1:Size(1)
    for J=1:Size(2)
        if(s(I,J) >= t(I, J))
            g(I, J) = 1;
        else
            g(I, J) = 0;
        end
    end
end
  

с

 g=zeros(Size);
g(s>=t)=1;