117 lines
3.1 KiB
Matlab
117 lines
3.1 KiB
Matlab
clear
|
|
close all
|
|
clc
|
|
format compact
|
|
|
|
%loading an image
|
|
im = im2double(imread('dog.jpg'));
|
|
|
|
%making image spectrum for graphics
|
|
imf_r = mat2gray(log(abs(fftshift(fft2(im(:,:,1))))+1));
|
|
imf_g = mat2gray(log(abs(fftshift(fft2(im(:,:,2))))+1));
|
|
imf_b = mat2gray(log(abs(fftshift(fft2(im(:,:,3))))+1));
|
|
imf = cat(3, imf_r, imf_g, imf_b);
|
|
|
|
%graphics
|
|
figure
|
|
subplot(1,2,1); imshow(im)
|
|
title('Original image')
|
|
subplot(1,2,2); imshow(imf,[])
|
|
title('Image spectrum (log)')
|
|
|
|
%dimensions of the image
|
|
[r,c,colors] = size(im);
|
|
|
|
%making gaussian low-pass filter mask
|
|
s = 0.1; %sigma in 1/pix
|
|
sigma = 0.1*min([r c]);
|
|
|
|
h = fspecial('gaussian',[r c],sigma); %gaussian mask
|
|
f = linspace(-0.5,0.5,c); %frequency grid
|
|
|
|
%graphics
|
|
figure
|
|
norm = max(max(h(r/2,:)))^-1; %normalizing coefficient
|
|
plot(f,norm*h(r/2,:),'b')
|
|
line([s s], [0 1], 'Color', 'r', 'LineWidth', 1)
|
|
line(-[s s], [0 1], 'Color', 'r', 'LineWidth', 1)
|
|
grid
|
|
title(['Gaussian filter with \sigma = ',num2str(s),' pix^{-1}'])
|
|
xlabel('frequency, pix^{-1}')
|
|
|
|
%graphics
|
|
figure
|
|
imshow(log(abs(h)+1),[])
|
|
title('Gaussian mask in frequency domain')
|
|
|
|
%applying LP filter to channels spectra
|
|
im1f_r = fftshift(fft2(im(:,:,1))).*h;
|
|
im1f_g = fftshift(fft2(im(:,:,2))).*h;
|
|
im1f_b = fftshift(fft2(im(:,:,3))).*h;
|
|
|
|
%getting image from spectra
|
|
im1_r = mat2gray(abs(ifft2(ifftshift(im1f_r))));
|
|
im1_g = mat2gray(abs(ifft2(ifftshift(im1f_g))));
|
|
im1_b = mat2gray(abs(ifft2(ifftshift(im1f_b))));
|
|
im1 = cat(3,im1_r,im1_g,im1_b);
|
|
|
|
%making image spectrum for graphics
|
|
imf1_r = mat2gray(log(abs(fftshift(fft2(im1(:,:,1))))+1));
|
|
imf1_g = mat2gray(log(abs(fftshift(fft2(im1(:,:,2))))+1));
|
|
imf1_b = mat2gray(log(abs(fftshift(fft2(im1(:,:,3))))+1));
|
|
imf1 = cat(3, imf1_r, imf1_g, imf1_b);
|
|
|
|
%graphics
|
|
figure
|
|
subplot(1,2,1); imshow(im1,[])
|
|
title('Filtered image')
|
|
subplot(1,2,2); imshow(imf1,[])
|
|
title('Filtered image spectrum (log)')
|
|
|
|
%Fourier transform of gaussian mask
|
|
hs = ifftshift(ifft2(h));
|
|
|
|
%graphics
|
|
figure
|
|
imshow(log(abs(hs)+1),[])
|
|
title('Gaussian mask in spatial domain')
|
|
|
|
uncut = 11; %size of spatial domain mask
|
|
cut = floor(11/2); %half-size of spatial domain mask
|
|
|
|
hs_cut = hs((r/2-cut+1):(r/2+cut+1),(c/2-cut+1):(c/2+cut+1)); %cut mask
|
|
H = sum(sum(abs(hs_cut)))^-1*abs(hs_cut); %normalized mask
|
|
|
|
%grapahics
|
|
figure
|
|
plot(H(cut+1,:))
|
|
grid
|
|
title({['Cut Gaussian mask of size ', num2str(uncut) ,'x'...
|
|
num2str(uncut)],[' in spatial domain']})
|
|
|
|
%applying mask to image
|
|
im2 = imfilter(im, H);
|
|
|
|
%making image spectrum for graphics
|
|
imf2_r = mat2gray(log(abs(fftshift(fft2(im2(:,:,1))))+1));
|
|
imf2_g = mat2gray(log(abs(fftshift(fft2(im2(:,:,2))))+1));
|
|
imf2_b = mat2gray(log(abs(fftshift(fft2(im2(:,:,3))))+1));
|
|
imf2 = cat(3, imf2_r, imf2_g, imf2_b);
|
|
|
|
%graphics
|
|
figurep
|
|
subplot(1,2,1); imshow(im2,[])
|
|
title('Filtered image')
|
|
subplot(1,2,2); imshow(imf2,[])
|
|
title('Filtered image spectrum (log)')
|
|
|
|
im3 = imfilter(im, H, 'circular'); % periodic boundary option
|
|
|
|
%graphics
|
|
figure
|
|
subplot(1,3,1); imshow(im1(1:50,1:50,:),[])
|
|
title('Frequency processed image')
|
|
subplot(1,3,2); imshow(im2(1:50,1:50,:),[])
|
|
title({['Spatially processed image'],['Zero boundary option']})
|
|
subplot(1,3,3); imshow(im3(1:50,1:50,:),[])
|
|
title({['Spatially processed image'],['Periodic boundary option']}) |