You are on page 1of 17

Buổi 1:

1.1. Code xoay ảnh 1 góc anpha


Bài 1 : Viết chương trình xoay ảnh một góc alpha
img = imread('01.png');
alpha = 60;

[height, width, ~] = size(img);

centerX = width / 2;
centerY = height / 2;

R = [cosd(alpha) -sind(alpha); sind(alpha) cosd(alpha)];

T = [R [centerX; centerY]; 0 0 1];

newWidth = ceil(abs(cosd(alpha)) * width + abs(sind(alpha)) *


height);
newHeight = ceil(abs(cosd(alpha)) * height + abs(sind(alpha))
* width);

rotatedImg = uint8(zeros(newHeight, newWidth, 3));

for x = 1:newWidth
for y = 1:newHeight
temp = inv(T) * [x; y; 1];
oldX = round(temp(1));
oldY = round(temp(2));
if oldX >= 1 && oldX <= width && oldY >= 1 && oldY <=
height
rotatedImg(y, x, :) = img(oldY, oldX, :);
end
end
end

subplot(2,2,1);imshow(img);
subplot(2,2,2) ;imshow(rotatedImg);
kết quả :

Ảnh sau khi quay một góc anpha 60.


1.2. Code tạo ảnh gif

Code:

folder='D:\baitapxulianh';
imgList = {'01.png', '02.png', '03.png', '04.png', '05.png',
'06.png', '07.png'};

n=numel(imgList);

cnt=0;
while(cnt ~= 7)
for i=1:n
imshow(fullfile(folder, imgList{i}));
pause(1);
end
cnt=cnt+1;
end

Buổi 2:
3.2 chia 1 ảnh thành 16 ảnh sau đó sắp xếp lộn xộn lại các ảnh đó
Code: array = randperm(16) - 1;
image = imread('05.png');
[height, width, ~] = size(image);
w = width / 4;
h = height / 4;
cnt = 1;
img = zeros([16, h, w, 3], 'uint8');
for k = 1:4
for r = 1:4
for x = 1:h
for y = 1:w
img(cnt, x, y, :) = image((h*(k-1)+x), (w*(r-
1)+y), :);
end
end
cnt = cnt + 1;
end
end
I = zeros([height, width, 3], 'uint8');
i = 1;
for k = 1:4
for r = 1:4
for x = 1:h
for y = 1:w
I((h*(k-1)+x), (w*(r-1)+y), :) = img(array(i)
+1, x, y, :);
end
end
i = i + 1;
end
end
imshow(I);

Kết quả:

Buổi 3:
3.1. Vẻ Histogram của một ảnh xám
Code:
img = imread('01.png');
img=rgb2gray(img);
[height, width] = size(img);
num_bins = 256;
histogram = zeros(1, num_bins);

for i = 1:height
for j = 1:width
pixel_value = img(i, j);
histogram(pixel_value + 1) = histogram(pixel_value +
1) + 1;
end
end
figure;
subplot(1,2,1);
imshow(img);
title('ảnh xám');

subplot(1,2,2);
bar(0:num_bins-1, histogram);
xlim([0 num_bins-1]);
title('Histogram');
xlabel('Giá tri pixel');
ylabel('Tần số');
Kết quả :

Histogram được tạo bởi hàm imhist

Nhận xét:histogram của hàm tạo ra giống như histogram đã code


3.2. Cân bằng Histogram

Code:

img = imread('01.png');
img = rgb2gray(img);
h = imhist(img);
cdf = cumsum(h) / numel(img);
img_eq = uint8(255 * cdf(img + 1));
subplot(221); imshow(img); title('Anh goc');
subplot(223); imshow(img_eq); title('Anh da can bang
histogram');
subplot(222); imhist(img);
subplot(224); imhist(img_eq);

Kết quả :

Nhận xét:Ảnh sau khi cân bằng historam thì các khoảng ảnh tối và ảnh sáng cân bằng hơn
giúp cho ảnh rõ ràng và sáng hơn.

Buổi 4:
4.1. Bộ lọc

I=imread('01.jpg');
I_gray=rgb2gray(I);
H1 = ones(3,3)/9;
H2 = ones(5,5)/25;
H3 = ones(9,9)/81;

Y1 = uint8(conv2(I_gray,H1,’same’));
Y2 = uint8(conv2(I_gray,H2,’same’));
Y3 = uint8(conv2(I_gray,H3,’same’));

figure
subplot(221);
imshow(I_gray); xlabel('Anh goc');
subplot(222);
imshow(Y1); xlabel('Anh qua bo loc H1');
subplot(223);
imshow(Y2); xlabel('Anh qua bo loc H2');
subplot(224);
imshow(Y3); xlabel('Anh qua bo loc H3');
Kết quả:

Nhận xét:
Độ lớn của bộ lộc càng lớn thì ảnh càng mờ dần,chứng tỏ bộ lọc có tác dụng làm mờ
ảnh
4.2. Lọc có nhiễu

img=imread('01.png');
I=rgb2gray(img);

M = floor(size(I,1));
N = floor(size(I,2));

o =50;
rand =randn(M,N);

I_gauss=double(I)+o*rand;

H1 = ones(3,3)/9;
H2 = ones(5,5)/25;
H3 = ones(9,9)/81;

Y1 = uint8(conv2(I_gauss,H1,'same'));
Y2 = uint8(conv2(I_gauss,H2,'same'));
Y3 = uint8(conv2(I_gauss,H3,'same'));

figure
subplot(221);
imshow(I_gauss);
subplot(222);
imshow(Y1);
subplot(223);
imshow(Y2);
subplot(224);
imshow(Y3);

kết quả:

Nhận xét: Cả ba bộ lọc được sử dụng đều cótác dụng làm mượt ảnh và giảm nhiễu. Các bộ
lọc được áp dụng bằng cách tính trung biǹ h các giátrịpixel xung quanh nó. Trong đó:
 Bộ lọc H1 sẽ làm mịn ảnh nhẹ nhàng hơn so với H2 và H3 vì nó chỉ tính trung bình của các
pixel xung quanh nó trong vòng 3x3. Vì vậy, nó sẽ giảm nhiễu nhẹ và làm mất chi tiết hình
ảnh nhẹ.
 Bộ lọc H2 là bộ lọc trung bình có trọng số 5x5, sẽ làm mịn ảnh mạnh hơn so với H1 và giảm
nhiễu tốt hơn. Tuy nhiên, nó có thể làm mất nhiều chi tiết hơn so với H1.
 Bộ lọc H3 là bộ lọc trung bình có trọng số 9x9, sẽ làm mịn ảnh mạnh hơn H2 và làm mất
nhiều chi tiết hơn. Bộ lọc H3 cótác dụng làm giảm nhiễu tốt nhất nhưng khiến ảnh mất đi
nhiều chi tiết quan trọng hơn

4.3. Nhân 2 bộ lọc

I=imread('01.png');
I=rgb2gray(I);

H1 = ones(3,3)/9;
H2 = ones(5,5)/25;

Y1 = uint8(conv2(I,H1,'same'));
Y2 = uint8(conv2(Y1,H2,'same'));

H=1/16*[1 2 1
2 4 2
1 2 1
];
Y3 = uint8(conv2(I,H,'same'));

figure
subplot(121); imshow(Y2); xlabel('Y2');
subplot(122); imshow(Y3); xlabel('Y3');

Kết quả:

Nhận xét Ảnh Y2 (sử dụng bộ lọc H1 và H2) sẽ có độ mờ cao hơn ảnh Y3 (sử dụng bộ lọc
H), do kích thước của bộ lọc H2 lớn hơn H1 và H có trọng số khác nhau cho mỗi pixel trong
vùng lân cận. Khi làm mờ ảnh bằng các bộ lọc trung bình, các pixel được lấy trung bình giá
trị của các pixel trong vùng lân cận, dẫn đến việc làm mất nhiều chi tiết hình ảnh và làm giảm
độ phân giải của ảnh.
ảnh Y2 là phép nhân của hai ma trận còn ảnh Y3 là phép chập của 2 ma trận,về cơ bản là ảnh
Y2 nó sẽ tạo ra một bộ lọc mới nhưng vẫn còn bị mờ còn ảnh Y3 là phép chập của 2 ma trận
nên ảnh sẽ rõ hơn ảnh Y2

Buổi 5:
Ảnh mosaic

img = imread('12.png');
[h, w, t] = size(img)
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
for i=2:2:h
R(i,:) = 0;
end
for j=2:2:w
R(:,j) = 0;
end

for i=1:2:h
for j=1:2:w
G(i,j) = 0;
end
end
for j=2:2:w
for i=2:2:h
G(i,j) = 0;
end
end
for i=1:2:h
B(i,:) = 0;
end
for j=1:2:w
B(:,j) = 0;
end
I = img;
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;figure
imshow(I,[])
WRB = [1 2 1;2 4 2;1 2 1] / 4;
WG = [0 1 0; 1 4 1; 0 1 0] / 4;
R = conv2(R,WRB,'same');
G = conv2(G, WG,'same');
B = conv2(B, WRB,'same');
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;

figure
imshow(I,[])
Kết quả:

Buổi 6:
Phương pháp demosaic
img = imread('12.png');
[h, w, t] = size(img)
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
for i=2:2:h
R(i,:) = 0;
end
for j=2:2:w
R(:,j) = 0;
end

for i=1:2:h
for j=1:2:w
G(i,j) = 0;
end
end
for j=2:2:w
for i=2:2:h
G(i,j) = 0;
end
end
for i=1:2:h
B(i,:) = 0;
end
for j=1:2:w
B(:,j) = 0;
end
I = img;
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;figure
imshow(I,[])
WRB = [1 2 1;2 4 2;1 2 1] / 4;
WG = [0 1 0; 1 4 1; 0 1 0] / 4;
R = conv2(R,WRB,'same');
G = conv2(G, WG,'same');
B = conv2(B, WRB,'same');
I(:,:,1) = R;
I(:,:,2) = G;
I(:,:,3) = B;

figure
imshow(I,[])

Code:
Kết quả:

ảnh mosiac ảnh gốc


Nhận Xét: Ảnh được nội suy song tuyến hồi phục được màu từ moisac tuy nhiên
có vấn đề là một số vùng ảnh bị sai màu nhất là vùng ảnh giao nhau giữa các
mảng màu do nội suy bị sai.

Buổi 7:
7.1, Tính toán biến đổi fourier
Code: img1 = imread('bien.jpg');
img2 = imread('nha.jpg');
img3 = imread('dibo.jpg');
img4 = imread('cay.jpg');
img5 = imread('ban.jpg');
Arr = [2 4 6 8 10];
Arr = Arr(randperm(length(Arr)))
figure
subplot(3,4,1);imshow(img1,[]);
subplot(3,4,3);imshow(img2,[]);
subplot(3,4,5);imshow(img3,[]);
subplot(3,4,7);imshow(img4,[]);
subplot(3,4,9);imshow(img5,[]);
if size(img1, 3) == 3
img1 = rgb2gray(img1);
end
if size(img2, 3) == 3
img2 = rgb2gray(img2);
end
if size(img3, 3) == 3
img3 = rgb2gray(img3);
end
if size(img4, 3) == 3
img4 = rgb2gray(img4);
end
if size(img5, 3) == 3
img5 = rgb2gray(img5);
end

F1 = fft2(double(img1));
F2 = fft2(double(img2));
F3 = fft2(double(img3));
F4 = fft2(double(img4));
F5 = fft2(double(img5));

F1 = fftshift(F1);
F2 = fftshift(F2);
F3 = fftshift(F3);
F4 = fftshift(F4);
F5 = fftshift(F5);

F_mag1 = abs(F1);
F_mag2 = abs(F2);
F_mag3 = abs(F3);
F_mag4 = abs(F4);
F_mag5 = abs(F5);
subplot(3,4,Arr(1));imshow(log(1+F_mag1), []);
subplot(3,4,Arr(2));imshow(log(1+F_mag2), []);
subplot(3,4,Arr(3));imshow(log(1+F_mag3), []);
subplot(3,4,Arr(4));imshow(log(1+F_mag4), []);
subplot(3,4,Arr(5));imshow(log(1+F_mag5), []);

kết quả :

Nhận xét: những ảnh có nhiều góc cạnh thì khi chuyển sang biểu diễn ở miền tần số sẽ có
nhiều đường sáng chạy qua tâm, những đường đó thể hiện sự chuyển đổi mức năng lượng
(các góc cạnh) từ vùng này sang vùng khác trong ảnh.
7.2.Bộ lọc thông thấp butterworh, gauss cho ảnh mosaic

7.2.1 Tính biến đổi Fourier của

Biến đổi fourier hàm gauss trên là:

7.2.2.Bộ lọc thông thấp butterworh cho ảnh mosaic


Code:
% ??c hình ?nh và chuy?n ??i sang ?nh xám

img = imread('19.png');
img=double(img);
[m,n,h]=size(img);
mr=zeros(m,n);
mr(1:2:end,1:2:end)=1;
mb=zeros(m,n);
mb(2:2:end,2:2:end)=1;
mg=1-mr-mb;
Im=img(:,:,1).*mr+img(:,:,2).*mg+img(:,:,3).*mb;

[P, Q] = size(I);

% T?o b? l?c Ideal


D0 = 100;
hIdeal = zeros(P, Q);
for i = 1:P
for j = 1:Q
if ((i - P/2)^2 + (j - Q/2)^2) <= D0^2
hIdeal(i, j) = 1;
end
end
end

% T?o b? l?c Butterworth


n = 5;
hButterworth = zeros(size(I));
for i = 1:P
for j = 1:Q
D = sqrt((i - P/2)^2 + (j - Q/2)^2);
hButterworth(i, j) = 1 / (1 + (D/D0)^(2*n));
end
end

% T?o b? l?c Gaussian


hGauss = zeros(size(I));
sig = 50;
a = 1 / (2 * pi * sig^2);
b = 2 * sig^2;
for i = 1:P
for j = 1:Q
D = (i - P/2)^2 + (j - Q/2)^2;
hGauss(i, j) = a .* exp(-D ./ b);
end
end

% Tính FFT c?a ?nh xám ??u vào


fftI = fft2(I);

% Áp d?ng b? l?c Ideal và Tái t?o ?nh


H1 = fftshift(hIdeal);
G1 = fftI .* H1;
gIdeal = ifft2(G1);

% Áp d?ng b? l?c Butterworth và Tái t?o ?nh


H2 = fftshift(hButterworth);
G2 = fftI .* H2;
gButterworth = ifft2(G2);

% Áp d?ng b? l?c Gaussian và Tái t?o ?nh


H3 = fftshift(hGauss);
G3 = fftI .* H3;
gGauss = ifft2(G3);

% Hi?n th? k?t qu?


subplot(2, 2, 1), imshow(I, []), title('hinh anh goc');
subplot(2, 2, 2), imshow(gIdeal, []), title('bo loc ideal');
subplot(2, 2, 3), imshow(gButterworth, []), title('bo loc Butterworth');
subplot(2, 2, 4), imshow(gGauss, []), title('bo loc Gaussian');

kết quả :
Nhận xét: ta nhận thấy rằng ảnh lọc thông tần số lý tưởng có các biên rõ ràng hơn,
trong khi ảnh lọc Butterworth có vẻ mịn hơn. Ảnh lọc Gaussian mịn hơn cả và có các
chi tiết ảnh bị mất đi.
7.2.1: bộ lọc butterworth
Code: img = imread('19.png');
img=double(img);
[m,n,h]=size(img);
mr=zeros(m,n);
mr(1:2:end,1:2:end)=1;
mb=zeros(m,n);
mb(2:2:end,2:2:end)=1;
mg=1-mr-mb;
Im=img(:,:,1).*mr+img(:,:,2).*mg+img(:,:,3).*mb;
% Compute the 2D Fourier transform of the image
s = fft2(double(Im));
figure
subplot(131)
imshow(Im,[]);
title('ANH GOC');
Fil = zeros(size(s));
[M N] = size(s);
r = (M+1)/2;
c = (N+1)/2;
D0 = min(N/8,M/8);
for i = 1:N
for j = 1:M
Duv = sqrt((i-c)*(i-c) + (j-r)*(j-r));
Fil(j,i) = exp(-Duv*Duv/(2*D0*D0));
end
end
subplot(133)
imshow(Fil,[]);
title('Bo LoC');
S1 = fftshift(s).*Fil;
S1 = ifftshift(S1);
I1 = ifft2(S1);
subplot(132)
imshow(real(I1),[]);
title('ANH Bo LoC');
kếtquả:

7.2.2.phổ của ảnh mosiac


Code: img = imread('19.png');
gray = rgb2gray(img);
gray = fft2(gray);
gray = fftshift(gray);
magnitude1 = abs(gray);

[w,h,k]= size(img);
mr = zeros(w,h);
mb = zeros(w,h);
mr(1:2:end,1:2:end) = 1;
mb(2:2:end,2:2:end)= 1;
mg = 1 - mr - mb;
img = double(img);
image1 = img(:,:,1).*mr + img(:,:,2).*mg + img(:,:,3).*mb;
fft2img = fft2(image1);
fft2imgshift = fftshift(fft2img);
magnitude2 = abs(fft2imgshift);
subplot(131); imshow(uint8(image1));
subplot(132); imshow(log(magnitude1),[]);
subplot(133); imshow(log(magnitude2),[]);
Kết quả:

7.3.Bộ lọc thông dãi với nhiều vòng


Code: img = im2double(imread('23.png'));
red = img(:,:,1);
green = img(:,:,2);
blue = img(:,:,3);

mosaic_R = red;
mosaic_G = green;
mosaic_B = blue;

[m, n, ~] = size(img);
mosaic = zeros(2*m,2*n);
mosaic(1:2:end, 1:2:end) = mosaic_R;
mosaic(1:2:end, 2:2:end) = mosaic_G;
mosaic(2:2:end, 2:2:end) = mosaic_B;

figure
imshow(mosaic);

S = fftshift(fft2(mosaic));
S_I = abs(S);
ang_I = angle(S);

Im = img(:,:,1).*mosaic_R + img(:,:,2).*mosaic_G +
img(:,:,3).*mosaic_B;
fL = [-2 3 -6 3 -2; 3 4 2 4 3; -6 2 48 2 -6; 3 4 2 4 3; -2 3 -
6 3 -2]/64;
L = conv2(Im,fL,'same');

C = Im - L;
C1 = C.* mosaic_R;
C2 = C.* mosaic_G;
C3 = C.* mosaic_B;

img_gray = rgb2gray(img);
S_gray = fftshift(fft2(img_gray));
S_I_gray = abs(S_gray);

figure

subplot(2, 3, 1); imshow(img_gray); title('Origin');


subplot(2, 3, 2); imshow(log(S_I_gray+1),[]); title('pho bien
do cua anh xam');
subplot(2, 3, 3); imshow(mosaic); title('Mosaic');
subplot(2, 3, 4); imshow(log(S_I+1),[]); title('pho bien do
cua anh Mosaic');
subplot(2, 3, 5); imshow(L,[]); title('Luminance');
subplot(2, 3, 6); imshow(C,[]); title('Chrom');

Kết quả:

Nhận xét:ta nhận thấy rằng phổ của ảnh mosisac có các điểm đen nằm ở ảnh chứng tỏ
rằng ở giữa đó chứa các tần số thấp ,ảnh Luminance t hì điểm sáng tối rõ hơn ảnh gốc,
còn ảnh chrome chỉ thấy cấu trúc của ảnh .
Buổi 8: Nhận dạng biển số xe

You might also like