#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;