Выходное изображение не отображается должным образом

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

Я расскажу вам код. Во-первых, я определяю функцию, которая принимает три параметра: IMAGE, изображение, для которого будет установлено пороговое значение; r радиус, который определяет окрестность вокруг центрального пикселя, из которого можно вычислить данные пикселя; и k, «ядро», которое определяет детали порогового значения.

function [t] = imadaptive ( IMAGE, r, k )

Затем я вызываю ранее определенные функции, которые создают изображения, в которых хранятся среднее значение и стандартное отклонение каждого пикселя:

meanpic = immean (IMAGE, r);
stdpic = imstd (IMAGE, r);

Затем я создаю новое изображение t, где интенсивность каждого пикселя равна 0. Это будет использоваться для хранения соответствующих пороговых значений для каждого пикселя:

t = zeros(size(IMAGE));

Затем я вычисляю размер изображения, чтобы сообщить циклу for, когда остановиться:

[nx, ny] = size(IMAGE);

Затем я запускаю цикл for и запускаю серию операторов if, чтобы программа не пыталась проверять значения пикселей в таких позициях, как (-2,-2):

 if x-r <= 0
     startx = 1;
 else
     startx = x-r;
 end

 if x+r > nx
     endx = nx;
 else
     endx = x+r;
 end

 if y-r <= 0
     starty = 1;
 else
     starty = y-r;
 end

 if y+r > ny
     endy = ny;
 else
     endy = y+r;
 end

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

 R = 128;

 for xp = startx : endx

   for yp = starty : endy  

         if (x-xp)^2 + (y-yp)^2 <= r^2
           thresh = meanpic(xp,yp) * (1 + (k * (((stdpic(xp,yp) / R) - 1))));
         end
   end
 end

 t(x,y) = thresh;

Проблема в том, что когда я запускаю этот код, я получаю изображение, идентичное моему stdpic: изображение, которое показывает значения стандартного отклонения для каждого изображения. Я не могу понять, почему это, однако. Уравнение кажется правильным — и когда я удаляю ; из уравнения, я вижу, что значения, которые оно выводит, очень различаются и находятся в диапазоне от 0 до 255, поэтому выходное изображение t должно сильно отличаться.

Может ли кто-нибудь указать, что я здесь не так?


person Zetland    schedule 09.03.2015    source источник
comment
Не могли бы вы опубликовать образец входного и выходного изображения, пожалуйста? Сделайте это так, чтобы люди могли просто скопировать и вставить ваш код для его запуска. Упростите запуск вашего кода. Если вы это сделаете, у вас будет гораздо больше шансов получить полезный ответ.   -  person kkuilla    schedule 09.03.2015
comment
@Zetland - каковы типы данных вашего изображения? Являются ли они двойными (значения пикселей 0..1) или uint8 (значения пикселей 0..255)? Являются ли thresh, meanpic, stdpic, IMAGE одним и тем же типом или разными типами?   -  person cxw    schedule 09.03.2015
comment
@cxw Они от 0 до 255. С тех пор я отредактировал приведенный выше код, чтобы превратить t = zeros(size(IMAGE)); в t = uint8(zeros(size(IMAGE)));, хотя теперь программа создает изображение, которое кажется идентичным изображению, созданному immean() ...   -  person Zetland    schedule 09.03.2015
comment
Понятно. Проблема была вызвана всеми кастингами, которые я делал. Как только я удалил все uint8 и uint32 и добавил Agrey = double(Agrey);, программа заработала.   -  person Zetland    schedule 13.03.2015
comment
@Zetland рад это слышать! Не могли бы вы поставить галочку рядом с ответом, чтобы отметить его как принятый? Спасибо!   -  person cxw    schedule 16.03.2015


Ответы (1)


thresh переназначается каждый раз в цикле. Таким образом, только один соседний пиксель вносит вклад в каждый выходной пиксель. Если смена thresh не поможет, не могли бы вы выложить весь файл сюда или на pastebin? Формат пошагового руководства очень полезен, но всегда возможно, что ошибка находится в не показанном коде.

Изменить: в строках 163-165 вставки заменить uint8 на double. В строке 211 добавьте код для использования количества пикселей или чего-то подобного. Я думаю, что деление на R происходит в uint и усекается до нуля. Вернитесь к uint в самом конце, после математики, иначе imshow не даст вам ожидаемых результатов. Надеюсь это поможет!

person cxw    schedule 10.03.2015
comment
Большое тебе спасибо. Я отправил его в Pastebin здесь: pastebin.com/SuyrsSQa - person Zetland; 12.03.2015
comment
Только что заметил ошибку в методе main. imshow(imthreshold(Agrey, 2, 0.5)) не должны быть закомментированы, а subplot должны быть... - person Zetland; 12.03.2015
comment
Спасибо. Вы нашли что-нибудь? - person Zetland; 12.03.2015
comment
Сегодня не было возможности все прочитать. Я заметил, что immean, похоже, выполняет математику в uint8, которая усекает дроби. Я бы сказал, поставьте whos в конце immean и imadaptive и убедитесь, что все, что вы хотите нести дробное значение, равно double. Я продолжу просмотр в ближайшие день или два. - person cxw; 13.03.2015
comment
@zet Обновлено. Есть новости с твоей стороны? - person cxw; 14.03.2015