2013-10-24 2 views
1

Мне было интересно, может ли кто-нибудь просмотреть этот код. Я пытаюсь сделать гауссовское ядро ​​3x3 без использования встроенных функций matlab. (Да, я знаю все встроенные функции gaussian и convolution, то есть fspecial), результат дает мне вместо белого изображения. не знаю, в чем проблема.пользовательское ядро ​​gaussian

clc; 

close all; 

clear all; 

img=imread('image.jpg'); 

figure,imshow(img); 

img2=zeros(size(img)+2); 

newImg=zeros(size(img)); 
for rgb=1:3 

     for x=1:size(img,1) 

      for y=1:size(img,2) 

       img2(x+1,y+1,rgb)=img(x,y,rgb); 

      end 
     end 
end 
    for i= 1:size(img2,1)-2 

     for j=1:size(img2,2)-2 

      window=zeros(9,1); 

      inc=1; 

      for x=1:3 

       for y=1:3 

        window(inc)=img2(i+x-1,j+y-1,rgb); 

        inc=inc+1; 

       end 

      end 
       kernel=[1;2;1;2;4;2;1;2;1]; 

%    kernel=[0;1;0;1;-4;1;0;1;0]; 

      med=window.*kernel; 

      disp(med); 

      med=sum(med); 

      med=floor(med); 

      newImg(i,j,:)=med; 

     end 

    end 

newImg=uint8(newImg); 

figure,imshow(newImg); 

Спасибо.

+0

Какой результат вы получаете? Ошибка компилятора, плохие данные, нет данных? –

+0

Результат такой, как указано - я получил изображение белого блока вместо размытого/сглаженного изображения. – drifterOcean19

+0

Я не работаю с matplab, но вы уверены, что это не проблема с типами данных? изображение может легко быть 8-битным целым, поэтому оно легко переполнится в процессе. –

ответ

0

Я думаю, вы должны нормализовать kernel. Я имею в виду, делить каждый элемент на сумму их значения (16), чтобы их сумма была равна 1:

kernel=[1;2;1;2;4;2;1;2;1]/16; 
+0

Спасибо, попробуем это. – drifterOcean19

+0

Я протестировал это решение, и оно работает для меня. Важно, чтобы сжатие jpg сделало изображение размытым, поэтому лучше попробовать свой код на несжатом изображении (например, несжатый jpg или bmp). – kol

+0

Это сработало спасибо. Я пытался сделать так, что функция принимает входное изображение и другое ядро ​​размера, например, вместо предварительно определенного ядра 3x3, как указано выше, вместо этого можно взять 5x5 или 7x7. а затем пользователь может ввести тип требуемого ядра/фильтра (в зависимости от предполагаемого эффекта). Кажется, я не могу опустить голову. Я совершенно новый для Matlab. – drifterOcean19

Смежные вопросы