Portofolio 3
Posted May 18, 2008
on:Merekonstruksi foto diri dengan menggunakan freqcomp.m
Listing program freqcomp.m
function recon = freqcomp(im, Npts, delay)
if ndims(im) == 3
% mengubah image jadi grayscale
im = rgb2gray(im);
warning(‘converting colour image to greyscale’);
end
if nargin < 2
Npts = 50;
end
[rows,cols] = size(im);
% If necessary crop one row and/or column so that there are an even
% number of rows and columns, this makes things easier later.
if mod(rows,2) % odd
rows = rows-1;
end
if mod(cols,2) % odd
cols = cols-1;
end
im = im(1:rows,1:cols);
rc = fix(rows/2)+1; % Centre point
cc = fix(cols/2)+1;
% The following code constructs two arrays of coordinates within the FFT
% of the image that correspond to complex conjugate pairs of points that
% spiral out from the centre visiting every frequency component on
% the way.
p1 = zeros(Npts,2); % Path 1
p2 = zeros(Npts,2); % Path 2
m = zeros(rows,cols); % Matrix for marking visited points
m(rc,cc) = 1;
m(rc,cc-1) = 1;
m(rc,cc+1) = 1;
p1(1,:) = [rc cc-1];
p2(1,:) = [rc cc+1];
d1 = [0 -1]; % initial directions of the paths
d2 = [0 1];
% Mark out two symmetric spiral paths out from the centre (I wish I
% could think of a neater way of doing this)
for n = 2:Npts
l1 = [-d1(2) d1(1)]; % left direction
l2 = [-d2(2) d2(1)];
lp1 = p1(n-1,:) + l1; % coords of point in left direction
lp2 = p2(n-1,:) + l2;
if ~m(lp1(1), lp1(2)) % go left
p1(n,:) = lp1;
d1 = l1;
m(p1(n,1), p1(n,2)) = 1; % mark point as visited
else % go sraight ahead
p1(n,:) = p1(n-1,:) + d1;
m(p1(n,1), p1(n,2)) = 1; % mark point as visited
end
if ~m(lp2(1), lp2(2)) % go left
p2(n,:) = lp2;
d2 = l2;
m(p2(n,1), p2(n,2)) = 1; % mark point as visited
else % go sraight ahead
p2(n,:) = p2(n-1,:) + d2;
m(p2(n,1), p2(n,2)) = 1; % mark point as visited
end
end
% Having constructed the path of frequency components to be visited
% we take the FFT of the image and then enter a loop that
% incrementally reconstructs the image from its components.
IM = fftshift(fft2(im));
recon = zeros(rows,cols); % Initialise reconstruction matrix
if max(rows,cols) < 150
fontsze = 7;
else
fontsze = 10;
end
figure(1), clf
subplot(2,2,1),imagesc(im),colormap gray, axis image, axis off
title(‘Original Image’,’FontSize’,fontsze);
subplot(2,2,2),imagesc(log(abs(IM))),colormap gray, axis image
axis off, title(‘Fourier Transform + frequency component pair’,’FontSize’,fontsze);
warning off % Turn off warnings that might arise if the images cannot be
% displayed full size
truesize(1)
for n = 1:Npts
% Extract the pair of Fourier components
F = zeros(rows,cols);
F(p1(n,1), p1(n,2)) = IM(p1(n,1), p1(n,2));
F(p2(n,1), p2(n,2)) = IM(p2(n,1), p2(n,2));
% Invert and add to reconstruction
f = real(ifft2(fftshift(F)));
recon = recon+f;
% Display results
subplot(2,2,2),imagesc(log(abs(IM))),colormap gray, axis image
axis off, title(‘Fourier Transform + frequency component pair’,’FontSize’,fontsze);
hold on, plot([p1(n,2), p2(n,2)], [p1(n,1), p2(n,1)],’r.’); hold off
subplot(2,2,3),imagesc(recon),colormap gray, axis image, axis off, title(‘Reconstruction’,’FontSize’,fontsze);
subplot(2,2,4),imagesc(f),colormap gray, axis image, axis off
title(‘Basis function corresponding to frequency component pair’,’FontSize’,fontsze);
if nargin == 3
pause(delay);
else
fprintf(‘Hit any key to continue \n’); pause
end
end
Dengan jumlah komponen frekuensi 30, hasilnya seperti dibawah ini:
Dengan jumlah komponen frekuensi 50, hasilnya seperti dibawah ini:
Dengan jumlah komponen frekuensi 120, hasilnya seperti dibawah ini:
Filter Gausian
function tugasgausian = Gausian(images);
% mendapatkan image
i = imread(images);
% image grayscale
im = rgb2gray(i);
% filter gausian
gausianfilter = fspecial(‘gaussian’, size(im), 5);
% FFT image
imagefft = fft2(im);
% FFT dari filter gaussian
gausianfilterfft = fft2(gausianfilter);
% perkalian FFT image dengan FFT filter gaussian
result = gausianfilterfft.*imagefft;
figure,imshow(im);
figure,imagesc(gausianfilter),colormap gray;
figure,imagesc(fftshift(log(abs(imagefft)+eps))),colormap gray;
figure,imagesc(fftshift(log(abs(gausianfilterfft)+eps))),colormap gray;
figure,imagesc(fftshift(log(abs(result)+eps))),colormap gray;
% menampilkan hasil smoothing
figure,imagesc(fftshift(real(ifft2(result)))),colormap gray;
Filter Average
function tugasaverage = average(images);
% mendapatkan image
i = imread(images);
% image grayscale
im = rgb2gray(i);
[row col] = size(im);
averageFilter = zeros(row,col);
if (mod(row,2)==0 && mod(col,2)==0)
pusatx = row/2;
pusaty = col/2;
averageFilter(pusatx-10:pusatx+11, pusaty-10:pusaty+11) = 1;
elseif (mod(row,2)==0 && mod(col,2)==1)
pusatx = row/2;
pusaty = (col-1)/2;
averageFilter(pusatx-10:pusatx+11, pusaty-10:pusaty+10) = 1;
elseif (mod(row,2)==1 && mod(col,2)==0)
pusatx = (row-1)/2;
pusaty = col/2;
averageFilter(pusatx-10:pusatx+10, pusaty-10:pusaty+11) = 1;
elseif (mod(row,2)==1 && mod(col,2)==1)
pusatx = (row-1)/2;
pusaty = (col-1)/2;
averageFilter(pusatx-10:pusatx+10, pusaty-10:pusaty+10) = 1;
end
% filter average
averageFilter = averageFilter/(sum(sum(averageFilter)));
% FFT image
imagefft = fft2(im);
% FFT dari filter average
averagefilterfft = fft2(averageFilter);
% perkalian FFT image dengan FFT filter average
result = averagefilterfft.*imagefft;
figure,imshow(im);
figure,imagesc(averageFilter),colormap gray;
figure,imagesc(fftshift(log(abs(imagefft)+eps))),colormap gray;
figure,imagesc(fftshift(log(abs(averagefilterfft)+eps))),colormap gray;
figure,imagesc(fftshift(log(abs(result)+eps))),colormap gray;
% menampilkan hasil smoothing
figure,imagesc(fftshift(real(ifft2(result)))),colormap gray;
Pertukaran Nilai Fase
Image1
Image2
informasi amplitudo dari image1 dan informasi fase dari image2, hasilnya lebih mirip image2
Informasi amplitudo dari image2 dan informasi fase dari image1, hasilnya lebih mirip image1
Fase dari image1
Fase dari image2
Listing program pertukaran nilai fase
% mendapatkan 2 gambar yg berbeda
image1 = imread(‘polka.jpg’);
image2 = imread(‘sok imut1.jpg’);
% image1 dirubah ke bentuk grayscale
image1 = rgb2gray(image1);
% image2 dirubah ke bentuk grayscale
image2 = rgb2gray(image2);
% FFT image1
image1fft = fft2(image1);
% FFT image2
image2fft = fft2(image2);
% mendapatkan informasi fase dari image1
image1fase = angle(image1fft);
% mendapatkan informasi fase dari image2
image2fase = angle(image2fft);
% mendapatkan amplitudo dari image1
image1amp = abs(image1fft);
% mendapatkan amplitudo dari image2
image2amp = abs(image2fft);
% informasi amplitudo dari image1, informasi fase dari image2
newimfft1 = image1amp.*(cos(image2fase) + i*sin(image2fase));
% informasi amplitudo dari image2, informasi fase dari image1
newimfft2 = image2amp.*(cos(image1fase) + i*sin(image1fase));
figure,imagesc(real(ifft2(newimfft1))),colormap gray;
figure,imagesc(real(ifft2(newimfft2))),colormap gray;
% mendapatkan fase dari image1 saja
image1faseaja = image1fft./image1amp;
% mendapatkan fase dari image2 saja
image2faseaja = image2fft./image2amp;
figure,imagesc(real(ifft2(image1faseaja))),colormap gray;
figure,imagesc(real(ifft2(image2faseaja))),colormap gray;
figure,imagesc(image1),colormap gray;
figure,imagesc(image2),colormap gray;
Leave a comment