Нуждаются в детализации изображения - PullRequest
1 голос
/ 29 февраля 2012

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти ресурсы о том, как применять фильтры (на основе ядра) к изображениям rbga.Я имею в виду, что я нашел то, что использует временную сумму для каждого цветового канала и для каждого обработанного пикселя.Я пытался сделать то же самое, но мне не удалось.Результат не совпадает с Matlab.Для меня действительно важно иметь точно такой же результат с matlab, потому что это будет означать, что все, что предназначено для запуска в matlab, будет работать и с моим кодом.

Мне было интересно, есть ли книга об этих вещах,Объясняет ли matlab, как реализованы функции?

EDIT

например, я применяю ядро ​​prewittX

>> a = imread('Hydrangeas.jpg');
>> w = [-1 0 1; -1 0 1; -1 0 1];
>> b = imfilter(a,w);
>> imshow(b)

, что я делаю, что-то вроде этого

for i < img.height, i++
 for j < img.width, j++
  rsum = pixel[i-1,j-1].R*(-1) + pixel[i-1,j+1].R*(1)
  rsum += pixel[i,j-1].R*(-1) + pixel[i,j+1].R*(1)
  rsum += pixel[i+1,j-1].R*(-1) + pixel[i+1,j+1].R*(1)

  gsum = pixel[i-1,j-1].G*(-1) + pixel[i-1,j+1].G*(1)
  gsum += pixel[i,j-1].G*(-1) + pixel[i,j+1].G*(1)
  gsum += pixel[i+1,j-1].G*(-1) + pixel[i+1,j+1].G*(1)

  bsum = pixel[i-1,j-1].B*(-1) + pixel[i-1,j+1].B*(1)
  bsum += pixel[i,j-1].B*(-1) + pixel[i,j+1].B*(1)
  bsum += pixel[i+1,j-1].B*(-1) + pixel[i+1,j+1].B*(1)

  if rsum>255, rsum=255
  if gsum>255, gsum=255
  if bsum>255, bsum=255

  if rsun<0, rsun=0
  if gsun<0, gsun=0
  if bsun<0, bsun=0

  img.setpixel(i,j) = (rsum|gsum|bsum)
 end
end

Я также не знаю, что делать с каналом, потому что я обрабатываю изображения RGBA.

Это вывод, который я получаю

my output

выход Matlab

matlab output

1 Ответ

5 голосов
/ 29 февраля 2012

Простые фильтры изображений реализованы с использованием свертка . Каждая выходная точка - это просто взвешенная сумма соответствующей входной точки и других точек в ее окрестности. Ядро - это просто массив, который описывает эти веса. В 1D это будет просто:

y[n] = SUM x[n-k] . h[k]
        k

где h - ядро. Обычно вы рассчитываете это независимо для каждого цветового канала.

После того, как у вас работает свёртка, самый сложный вопрос - что делать по краям изображения. Существуют различные стратегии (например, заполнение нулями, расширение значений, перенос, зеркальное отображение), но единого правильного ответа не существует; это зависит от вашей цели.

Вы не объяснили, что вы подразумеваете под "неудачей"; был ли результат полной ерундой или был близок (с точностью до погрешности)? Если это последнее, то вы можете стать жертвой ограничений арифметики с плавающей точкой; Matlab может вычислять вещи в несколько ином порядке, что приводит к различным эффектам округления.

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