파일:Image restoration (motion blur, Wiener filtering).png

문서 내용이 다른 언어로는 지원되지 않습니다.
위키백과, 우리 모두의 백과사전.

원본 파일(1,464 × 488 픽셀, 파일 크기: 982 KB, MIME 종류: image/png)

파일 설명

설명
English: Image restoration (motion blur, Wiener filter). Deblured in GNU Octave. Blur parameters (length and angle) estimated by cepstral method. From left: original, blurred image and deblurred image.
Čeština: Restaurace obrazu rozmazaného vlivem pohybu (Wienerovým filtrem). Naprogramováno v GNU Octave. Parametry pohybu kamery (délka a úhel) odhadnuty kepstrální metodou. Zleva: originál, rozmazaný obrázek a rekonstruovaný obrázek.
날짜
출처 자작
저자 DaBler

라이선스

Public domain 나는 이 작품의 저작권자로서, 이 작품을 퍼블릭 도메인으로 모두에게 공개합니다. 이 공개 선언은 전 세계적으로 유효합니다.
만약 저작권의 포기가 법률적으로 가능하지 않은 경우,
나는 이 작품을 법적으로 허용되는 한도 내에서 누구나 자유롭게 어떤 목적으로도 제한없이 사용할 수 있도록 허용합니다.

Source code

  • blur_c.m:
## Copyright (C) 2008 David Barina

## -*- texinfo -*-
## @deftypefn {Function File} {[@var{len}, @var{angle}] =} blur_c(@var{image})
## Rozmaze obrazek (odstiny sedi nebo 3 kanaly) pod zadanou delkou a uhlem.
##
## Pokusi se odhadnout delku a uhel rozmazani. Je urcena
## jen pro obrazky poskozene rovnomernym rozmazanim
## po primce.
## @end deftypefn

## Author: David Barina  <ibarina@fit.vutbr.cz>
## Created: 2008-11-16

function blur_c(fnamein, fnameout='blurred.png', length=10, angle=0)
	% nacist original
	IM = imread(fnamein);
	IM_IN=double(IM);

	% zjistit pocet kanalu
	S=size(IM_IN);
	if(size(S)(2) == 3)
		L=S(3);
	else
		L=1;
	endif

	printf("Pocet vrstev obrazu:\n");
	L

	% horizontalni konvolucni jadro
	h=zeros(length,length);
	h(1,:) = ones(1,length);

	% otocit o dany uhel
	hx = imrotate(h,angle,"bicubic","loose",0);
	% normalizace
	hx ./= sum(hx(:));

	% rozmazani obrazku
	IM_OUT = conv2(IM_IN(:,:,1), hx, 'valid');
	for i = 2:L
		IM_OUT(:,:,i) = conv2(IM_IN(:,:,i), hx, 'valid');
	endfor

	IM_OUT=uint8(IM_OUT);

	% ulozi vysledek
	imwrite(IM_OUT, fnameout);

endfunction
  • detect_c.m:
## Copyright (C) 2008 David Barina

## -*- texinfo -*-
## @deftypefn {Function File} {[@var{len}, @var{angle}] =} detect_c(@var{image})
## Detekuje delku a smer rozmazani z obrazku.
##
## Pokusi se odhadnout delku a uhel rozmazani. Je urcena
## jen pro obrazky poskozene rovnomernym rozmazanim
## po primce.
## @end deftypefn

## Author: David Barina  <ibarina@fit.vutbr.cz>
## Created: 2008-11-16

function [a b]=detect_c(im)
	% zjisteni poctu kanalu obrazu
	S=size(im);
	if(size(S)(2) == 3)
		L=S(3);
	else
		L=1;
	endif
	printf("Pocet vrstev obrazu:\n");
	L

	% RGB obraz pripadne prevest na intenzitu
	if(L == 3)
		IMG=double(im)(:,:,1);
		IMG(:,:) = 0.299.*double(im)(:,:,1) .+ 0.114.*double(im)(:,:,2) .+ 0.587.*double(im)(:,:,3);
	else
		IMG=double(im)(:,:,1);
	endif

	% najit minima/minimum v cepstru
	MIN=min(min( real(fftshift(ifft2(log10(abs(fft2(IMG)))))) ));

	% na pozici minim dat 1, jinak vsude 0
	IMG2=uint8(real(fftshift(ifft2(log10(abs(fft2(IMG))))))<=MIN);

	% vyska cepstra
	Y=size(IMG2)(1);

	%minumum by melo byt ve spodni polovine
	IMG3=IMG2(floor(Y/2)+1:Y,:);

	% minimum je v horni polovine
	if(max(max(IMG3))==min(min(IMG3)))
		IMG3 = IMG2(1:floor(Y/2)+1,:);
		IMG3 = imrotate(IMG3,180);
	endif

	% neni minumum?
	if(max(max(IMG3))==min(min(IMG3)))
		printf("Chyba: Neni minimum ve spektru?!?! Co to znamena???\n");
	endif

	% zjistit pozici minima
	[mx,ix]=max(max(IMG3));
	[mx,iy]=max(max(IMG3'));
	[sy,sx]=size(IMG3);
	ix = ix-1;
	iy = iy-1;

	% poloha minima vuci stredu
	dx = ceil(ix-(sx/2));
	dy = iy;

	% spocitat vzdalenost od stredu a uhel
	delka = abs(dx+dy*i);
	uhel = (angle(dx+dy*i)/pi)*180-180;
	if(uhel==-180)
		uhel=0;
	endif

	% vratit hodnoty
	a = delka;
	b = uhel;
endfunction
  • deblur_c.m:
## Copyright (C) 2008 David Barina

## -*- texinfo -*-
## @deftypefn {Function File} deblur_c(@var{infilename}, @var{outfilename}, @var{K}, @var{length}, @var{angle})
## Odstrani rozmazani obrazku (stupne sedi nebo barevny).
##
## Pokusi se odhadnout delku a uhel rozmazani. Je urcena
## jen pro obrazky poskozene rovnomernym rozmazanim
## po primce.
## @end deftypefn

## Author: David Barina  <ibarina@fit.vutbr.cz>
## Created: 2008-11-16

function deblur_c(fnamein, fnameout='deblur.png', K=1e-2, length=-1, angle=-1)
	% nacist obrazek
	IM = imread(fnamein);

	% zjisteny poctu kanalu (vrstev)
	S=size(IM);
	if(size(S)(2) == 3)
		L=S(3);
	else
		L=1;
	endif
	printf("Pocet vrstev obrazu:\n");
	L

	% originalni obrazek v doublech
	IM_BLUR=double( IM );

	% zobrazit (prvni kanal pouze)
	figure(1); imshow(uint8(IM_BLUR(:,:,1)), [0 255]); title('blurred');

	% zjisteni rozmeru obrazku
	if(L == 1)
		[i1 j1] = size(IM_BLUR);
	else
		[i1 j1 k1] = size(IM_BLUR);
	endif

	% pridat okraje kvuli nasobeni ve frekvencni oblasti
	IM_BLUR_9 = [repmat(IM_BLUR(1,1,:),i1,j1) repmat(IM_BLUR(1,:,:),i1,1) repmat(IM_BLUR(1,end,:),i1,j1);
		repmat(IM_BLUR(:,1,:),1,j1) IM_BLUR repmat(IM_BLUR(:,end,:),1,j1);
		repmat(IM_BLUR(end,1,:),i1,j1) repmat(IM_BLUR(end,:,:),i1,1) repmat(IM_BLUR(end,end,:),i1,j1)];

	% detekovat poskozeni
	printf("Detekovano: \n");
	[delka uhel] = detect_c(IM_BLUR)

	% pouzit pripadne vynucene parametry
	if(length == -1)
		length = delka;
	endif

	length = round(length);

	if(angle == -1)
		angle = uhel;
	endif

	printf("Pouziji tyto hodnoty:\n");
	K
	length
	angle

	% vytvorit konvolucni jadro simulujici poskozeni
	hr=zeros(length,length);
	hr(1,:) = ones(1,length);
	hrx = imrotate(hr,-angle,"bicubic","loose",0);
	hrx ./= sum(hrx(:));

	% velikost obrazku i s okrajema
	if(L == 1)
		[i j]=size(IM_BLUR_9);
	else
		[i j k]=size(IM_BLUR_9);
	endif

	% vytvorit filtr simulujici poskozeni
	h3=zeros(i,j);
	h3(1:size(hrx)(1),1:size(hrx)(2)) = hrx;
	H3=fft2(h3);

	% vytvorit inverzni filtr ("parametric version of the Wiener filter")
	IF=conj(H3)./(abs(H3).^2 + K);

	% provest inverzni filtraci (dekonvoluci)
	if(L == 1)
		IMd=abs(ifft2(fft2(IM_BLUR_9).*(IF)));
	else
		IMd=abs(ifft2(fft2(IM_BLUR_9(:,:,1)).*(IF)));
		IMd(:,:,2)=abs(ifft2(fft2(IM_BLUR_9(:,:,2)).*(IF)));
		IMd(:,:,3)=abs(ifft2(fft2(IM_BLUR_9(:,:,3)).*(IF)));
	endif

	% vyriznout jen puvodni obrazek bez okraju
	IMd1 = IMd(1+i1:i1+i1,1+j1:j1+j1,:);

	% zobrazit vysledek (jen prvni kanal)
	figure(6); imshow( uint8( IMd1(:,:,1) ), [0 255]); title('deblurred');

	% ulozi vysledek
	imwrite(uint8(IMd1), fnameout);

endfunction

설명

이 파일이 나타내는 바에 대한 한 줄 설명을 추가합니다

이 파일에 묘사된 항목

다음을 묘사함

파일 역사

날짜/시간 링크를 클릭하면 해당 시간의 파일을 볼 수 있습니다.

날짜/시간섬네일크기사용자설명
현재2008년 12월 13일 (토) 12:142008년 12월 13일 (토) 12:14 판의 섬네일1,464 × 488 (982 KB)DaBler{{Information |Description={{en|1=Image restoration (motion blur, Wiener filtering). Deblured in GNU Octave. Blur parameters (length and angle) estimated by cepstral method.}} {{cs|1=Restaurace obrazu rozmazaného vlivem pohybu (Wienerovým filtrem). Napr

다음 문서 1개가 이 파일을 사용하고 있습니다:

이 파일을 사용하고 있는 모든 위키의 문서 목록

다음 위키에서 이 파일을 사용하고 있습니다: