2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 scilab фильтрация изображения
Сообщение16.05.2010, 18:18 
одномерным горизонтальным фильтром длинны 11, стостоящим из единиц = {1 1 1 1 1 1 1 1 1 1 1}
профильтровано изображение, тоесть размыто.
Нужно при помощи обратной фильтрации востановить картинку.

смазанное изображение http://rghost.ru/1625252.

мой код:

function out=f()
fp=mopen('461_615_h_11!140.txt','rb');
m=461;
n=615;
x=mget(m*n,'ul',fp);
mclose(fp);
B=matrix(x,m,n);
H(1:1:11)=1;
H=fft(H);
H=pinv(H);

for l=1:461
for k=6:605
v=fft(B(l,k-5:k+5)).*H;
u(l,k)=v(1);
end;
end;
Matplot(u);
xset('colormap',graycolormap(32));
out=0;

endfunction;


в результате никакого эффекта, подскажите где я ошибаюсь?

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 06:28 
а где тут ifft?
и почему u(l,k)=v(1); ?

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 07:10 
должно быть так?
v=ifft(fft(B(l,k-5:k+5)).*H);

а U(l,k)=?

я просто перепробывал уже всё. поэтому даже без ifft получился код..

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 11:50 
ildmth в сообщении #320398 писал(а):
должно быть так?
я просто перепробывал уже всё. поэтому даже без ifft получился код..

Нужно не гадать, нужно понимать что делаешь.
Смазаное изображение, дополняем нулями на величину размера фильтра.
Фильтр, дополняем нулями на величину изображения.
Считаем FFT и от того и от другого.
Делим поэлементно FFT изображения на FFT фильтра.
Считаем IFFT.
Берем abs (на случай, если результат из-за ошибок округления будет комплексный).

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 12:03 
так у меня длина фильтра 11, значит я беру строку в изображении длиной 11, и ничего не дополняю нулями ни в фильтре ни в изображении?
h={1 ... 1}
pinv(fft(h)) получается = {1/11 0 0 0 ... 0}

тогда зачем умножать поэлементно, если все остальные кроме первого нули?
и на какой элемент fft(B(l,k-5:k+5)) мне умножить этот не нулевой элемент?

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 13:32 
function out=f()
fp=mopen('461_615_h_11!140.txt','rb');
m=461;
n=615;
x=mget(m*n,'ul',fp);
mclose(fp);
B=matrix(x,m,n);
H(1:1:11)=1;
H=fft(H);
H=pinv(H);
for l=1:461
for k=6:605
v=fft(B(l,k-5:k+5));
for s=1:11
r(s)=v(s)*H(s);
end;
q=abs(ifft(r));
u(l,(k-5:k+5))=q';
end;
end;
Matplot(u);
xset('colormap',graycolormap(32));
out=0;
endfunction;

вот сделал как вы сказали, но результат не изменился...

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 13:44 
Может, попробуете использовать другие виды фильтрации? Винеровский фильтр, к примеру? Почитайте Гонсалеса и Вудза (там хоть и матлаб, но для сайлаба код хорошо переносится).

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 13:49 
да дело в том, что мне нужно сделать именно так как я описал и как сказал alexrey036. но что то не фильтрует..

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 18:01 
Ничего Вы не сделали. Где дополненние нулями?
pinv - вообще откуда Вы взяли?
Объясните, зачем делать псевдоинверсию матрицы? :shock: С тем же успехом можно взять логарифм или еще что-нибудь произвольное.

 
 
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 19:18 
виноват:



function out=f()
fp=mopen('461_615_h_11!140.txt','rb');
m=461;
n=615;
x=mget(m*n,'ul',fp);
mclose(fp);
B=matrix(x,m,n);

H(1:11)=1;
H(12:615)=0;

H=fft(H);
for l=1:461
v=fft(B(l,(1:615)));
for k=1:615
r(k)=v(k)/H(k);
end;
q=ifft(r);
u(l,(1:615))=abs(q');
end;
Matplot(u);
xset('colormap',graycolormap(32));
out=0;
endfunction;

в результате жуткая картинка в вертикальную полоску получается.



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

function out=f()
fp=mopen('461_615_h_11!140.txt','rb');
m=461;
n=615;
x=mget(m*n,'ul',fp);
mclose(fp);
B=matrix(x,m,n);
H(1:11)=1;
H(12:615)=0;
H=fft(H);
for i=1:615
H(i)=1/H(i);
end;
H=ifft(H);
for l=1:461
v(l,(1:1229))=convol(H,B(l,(1:615)));
u(l,(1:615))=abs(v(l,(1:615)));
end;
Matplot(u);
xset('colormap',graycolormap(128));
out=0;
endfunction;


но почему, не работает вариант с преобр.фурье осталось загадкой...

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group