2014-11-12 2 views
1

Мне нужно уменьшить размер изображения, используя фильтр осреднения окна, я попытался написать этот код, но произошла ошибка: Unknown command option., где ошибка, и какой правильный алгоритм для box filter Я знаю его идею, новый пиксель = усредняет четыре соседних пикселя. код:ошибка в окне усреднения фильтра изображения с использованием matlab

clear, clc 

image=imread('p128.jpg'); 
old_size=size(image); 
out_image=zeros(old_size(1)/2 , old_size(2)/2); 

for i = 1 : old_size(1) - 1 
    for j= 1 : old_size(2) - 1 
     for k= i : i+1 
      for t= j : j+1 
       out_image(k,t)=(image(i,j)+image(i+1,j)+image(i,j+1)+... 
        image(i+1,j+1))/4 ; 
      end 
     end 
    end 
end 

figure(1), imshow(out_image) 
+0

, в котором линия у вас есть эта ошибка? Matlab обычно говорит, какая строка производит ошибку, это начальная точка для отладки –

ответ

0

Вы можете использовать im2cols with 'distinct' от Image Processing Toolbox повторно расположить окно элементов в столбцы, а затем вычислить среднее значение каждого столбца, который будет представлять среднее значение каждого окна. Теперь в комментариях, которые вы сказали, вы не хотите использовать какую-либо функцию из панели инструментов IP, поэтому мы заменили im2cols нашей собственной выполненной на заказ реализацией. Таким образом, если предположить, im быть входных данных в оттенках серого изображения, вы можете использовать это -

box_len = 2; %// length of the box 
im_cols = im2col_distinct(im,[box_len box_len]); 
im_downsized = uint8(reshape(mean(im_cols,1),size(im,1)/box_len,[])); 

Попутный функция -

function out = im2col_distinct(A,blocksize) 

nrows = blocksize(1); 
ncols = blocksize(2); 
nele = nrows*ncols; 

row_ext = mod(size(A,1),nrows); 
col_ext = mod(size(A,2),ncols); 

padrowlen = (row_ext~=0)*(nrows - row_ext); 
padcollen = (col_ext~=0)*(ncols - col_ext); 

A1 = zeros(size(A,1)+padrowlen,size(A,2)+padcollen); 
A1(1:size(A,1),1:size(A,2)) = A; 

t1 = reshape(A1,nrows,size(A1,1)/nrows,[]); 
t2 = reshape(permute(t1,[1 3 2]),size(t1,1)*size(t1,3),[]); 
t3 = permute(reshape(t2,nele,size(t2,1)/nele,[]),[1 3 2]); 
out = reshape(t3,nele,[]); 

return; 

Таким образом, вы бы избежать все, что беспорядочные вложенные циклы с исходным кодом.

Вход:

enter image description here

Выход:

enter image description here

+0

, спасибо, это здорово, но я действительно не хочу использовать какие-либо функции, такие как im2col .. мне нужен весь код, основанный на математике .. поскольку мне нужно реализовать этот код в verilog, так что я должен делать с im2col?! – abdic

+0

@abdallahkamal Кстати, с этим подходом для размера коробки '4 х 4'. он уменьшает изображение в 4 раза по строкам и столбцам. Ты хочешь этого? – Divakar

+0

@abdallahkamal Только что отредактировал код, а вместе с ним коэффициент уменьшения - '2'. Таким образом, изображение размером 256 x 256 будет уменьшено до 128 x 128. Посмотрите, будут ли результаты работать на вас? – Divakar

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