Professional Documents
Culture Documents
centerX = width / 2;
centerY = height / 2;
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.
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ả :
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
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 So sánh hai ảnh thì kết quả hai ảnh giống nhau hoàn toàn. Nhận xét: khi
ảnh qua lần lượt bộ lọc H1(m*1) và H2(n*1) thì có kết quả giống như qua bộ
lọc của phép nhân 2 ma trận H1 và H2 (m*n) nhưng khi ảnh có kích thước lớn
thì khi chập 2 ma trận thì tốc độ thời gian xử lí lâu hơn khi dùng ma trận được
ghép bởi 2 ma trận đó.
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ả:
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
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);
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ả:
[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ả:
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
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 .
7.4 Kmeans
Code: A = imread('08.png');
figure,subplot(121),imagesc(A);title('RGB Image');hold on;
A = double(A);
num_clusters = 4;
Tval = 1;
Global_Tval = 3;
RX = randi(size(A,1),1,num_clusters);
RY = randi(size(A,2),1,num_clusters);
RGB_val = zeros([num_clusters,3]);
RGB_new = zeros([num_clusters,3]);
flag = 1;
for i = 1:num_clusters
RGB_val(i,:) = A(RX(i),RY(i),:);
end
myvox = zeros([size(A,1) size(A,2) num_clusters]);
Rcomp = A(:,:,1); %RED CHANNEL
Gcomp = A(:,:,2); %GREEN CHANNEL
Bcomp = A(:,:,3); %BLUE CHANNEL
it = 0;
while flag==1
for j = 1: num_clusters
myvox(:,:,j) = sqrt((A(:,:,1)-RGB_val(j,1)).^2+(A(:,:,2)-
RGB_val(j,2)).^2+(A(:,:,3)-RGB_val(j,3)).^2);
end
[Y,ClusterMap] = min(myvox,[],3);
for j = 1:num_clusters
RGB_new(j,1) = mean(Rcomp(ClusterMap(:)==j));
RGB_new(j,2) = mean(Gcomp(ClusterMap(:)==j));
RGB_new(j,3) = mean(Bcomp(ClusterMap(:)==j));
end
DiffVal = abs(RGB_val-RGB_new);
if(sum(DiffVal(:)) < Global_Tval)
flag = 0;
else
if(sum(DiffVal(:,1))>Tval)
RGB_val(:,1) = RGB_new(:,1);
end
if(sum(DiffVal(:,2))>Tval)
RGB_val(:,2) = RGB_new(:,2);
end
if(sum(DiffVal(:,3))>Tval)
RGB_val(:,3) = RGB_new(:,3);
end
end
it=it+1;
end
subplot(122),imagesc(ClusterMap);title('Clusters');colormap(jet);
m=2;
n = round(num_clusters/m);
for k=1:num_clusters
F = repmat(logical(ClusterMap==k),1,1,3).*double(A);
figure(2),subplot(n,m,k),imagesc(uint8(F));hold on;
end
kết quả
Nhận xét:
Buổi 8: Nhận dạng biển số xe