2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 scilab фильтрация изображения
Сообщение16.05.2010, 18:18 


29/11/08
55
одномерным горизонтальным фильтром длинны 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 


29/05/06
92
а где тут ifft?
и почему u(l,k)=v(1); ?

 Профиль  
                  
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 07:10 


29/11/08
55
должно быть так?
v=ifft(fft(B(l,k-5:k+5)).*H);

а U(l,k)=?

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

 Профиль  
                  
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 11:50 


29/05/06
92
ildmth в сообщении #320398 писал(а):
должно быть так?
я просто перепробывал уже всё. поэтому даже без ifft получился код..

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

 Профиль  
                  
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 12:03 


29/11/08
55
так у меня длина фильтра 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 


29/11/08
55
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 


04/02/08
325
Буково
Может, попробуете использовать другие виды фильтрации? Винеровский фильтр, к примеру? Почитайте Гонсалеса и Вудза (там хоть и матлаб, но для сайлаба код хорошо переносится).

 Профиль  
                  
 
 Re: scilab фильтрация изображения
Сообщение17.05.2010, 13:49 


29/11/08
55
да дело в том, что мне нужно сделать именно так как я описал и как сказал alexrey036. но что то не фильтрует..

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


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

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


29/11/08
55
виноват:



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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group