You are on page 1of 9

BÁO CÁO CUỐI KÌ MÔN XỬ LÝ ẢNH

Nguyễn Quang Vũ - 18DT1 - 50%


Đặng Công Minh - 18DT1 - 50%

Bài 1. Morphology
Gọi I là ảnh “circles.png” (Matlab).
Yêu cầu: lấp khoảng trống giữa các hình tròn trong ảnh I, mà không ảnh
hưởng đến các đường biên bên ngoài, như hình dưới đây (bên trái là ảnh
gốc I, bên phải là ảnh mong đợi sau khi xử lý).

Giải thích ngắn gọn cách làm.


Bài làm:
Nhóm có hai phương pháp giải như sau:
Phương pháp một dùng cách lấp đầy vào các vật thể trong lỗ hoặc đối
tượng, từ đó các điểm màu đen giữa các khoảng trống hình tròn chính là
đối tượng sẽ bị xóa bỏ. Để xác định đâu là một đối tượng thì đối tượng là
vùng sẽ không giáp bất kì phần nào khác tính từ biên vào.
Code Matlab:
I=imread('circles.png');

subplot(1,2,1);
imshow(I)
title('Original Image');

subplot(1,2,2);
out=imfill(I,'holes');
imshow(out)
title('Result Image');

Phương pháp giải thứ hai được thực hiện bằng morphology (xử lí hình
thái học). Phương pháp thực hiện phép đóng ảnh trước và mở ảnh sau vì
các phương pháp này tác động trực tiếp giống như phép co ảnh và giãn
ảnh nhưng chúng sẽ không thay đổi quá nhiều kích thước cũng như các
đặc trưng của đối tượng. Sau khi dùng phép đóng mở ảnh thì các điểm
màu đen đã bị xóa sau đó dùng phép co ảnh để đối tượng sau khi biến
đổi nhỏ hơn đối tượng đầu. Cộng hai lớp trước và sau với nhau thì các
điểm đen của đối tượng đầu bị đối tượng sau lấp đi. Sử dụng cấu trúc
mặt nạ là dạng hình đĩa do các đối tượng có đặc trưng là hình tròn.
Code Matlab:
I=imread('circles.png');
se=strel('disk',12);
I1=imclose(I,se);
I2=imopen(I1,se);
I3=imerode(I2,se);

im = I + I3;
subplot(2,3,1);
imshow(I);
title('Original Image');
subplot(2,3,2);
imshow(I1);
title('Close Image');
subplot(2,3,3);
imshow(I2);
title('Open Image');
subplot(2,3,4);
imshow(I3);
title('Erode Image');
subplot(2,3,5);
imshow(im);
title('Result Image');

Bài 2. Phân vùng


Bài tập này sử dụng ảnh “kodim03.png” (đã biết ở lớp), gọi là ảnh I.
a) Viết chương trình dựa trên K-means để phân vùng ảnh I (tự chọn số
lượng vùng một cách hợp lý), theo 2 cách.
- chỉ sử dụng thông tin RGB trong ảnh I
- kết hợp thông tin RGB và vị trí (của mỗi pixel) trong ảnh I
Giải thích ngắn gọn cách làm.
Hiển thị kết quả phân vùng và nhận xét.
b) Làm lại câu a) với hàm kmeans có sẵn trong Matlab.
c) Phân vùng ảnh I với hàm multithresh có sẵn trong Matlab. Hiển thị kết
quả và nhận xét
d) Thử thực hiện phân vùng ảnh I theo một cách khác với các cách ở trên.
Bài làm:
a)
code:
clc;
I = imread('kodim03.png');
Nrows = size(I,1);
Ncols = size(I,2);
A = reshape(I, Nrows*Ncols,3);
ncolor = 5;
T = 10;
segmented = cell(1,3);
[cluster] = RGB_kmean(A,ncolor,T);
pixel = reshape(cluster,Nrows,Ncols);

rgb_label = repmat(pixel, [1 1 3]);


for k = 1:ncolor
color = I;
color(rgb_label ~=k) = 0;
segmented{k} = color;
end
figure
subplot(3,2,1);
imshow(I),title('original');
subplot(3,2,2);
imshow(segmented{1},[]),title('image cluster1');
subplot(3,2,3);
imshow(segmented{2},[]),title('image cluster2');
subplot(3,2,4);
imshow(segmented{3},[]),title('image cluster3');
subplot(3,2,5);
imshow(segmented{4},[]),title('image cluster4');
subplot(3,2,6);
imshow(segmented{5},[]),title('image cluster5');
B)
Code:
I=imread('kodim03.png');
figure
subplot(3,2,1)
imshow(I), title('original ');

cform=makecform('srgb2lab');
lab_img=applycform(I,cform);
ab=double(lab_img(:,:,2:3));
nrows=size(ab,1);
ncols=size(ab,2);
ncolors=5;
ab=reshape(ab,nrows*ncols,2);
[cluster_idx,cluster_center]=kmeans(ab,ncolors,'distance','s
qEuclidean','Replicates',3);
pixel_labels=reshape(cluster_idx,nrows,ncols);
segmented=cell(1,3);
rbg=repmat(pixel_labels,[1,1,3]);
for k=1:ncolors
color=I;
color(rbg~=k)=0;
segmented{k}=color;
end
subplot(3,2,2);
imshow(segmented{1}), title('objects in cluster 1');
subplot(3,2,3);
imshow(segmented{2}), title('objects in cluster 2');
subplot(3,2,4);
imshow(segmented{3}), title('objects in cluster 3');
subplot(3,2,5);
imshow(segmented{4}), title('objects in cluster 4');
subplot(3,2,6);
imshow(segmented{5}), title('objects in cluster 5');

Bài 3. PCA

Bài tập này sử dụng ảnh tập ảnh “New” (đã biết ở lớp).

a) Tìm các thành phần chính từ tập ảnh trên. Hiển thị một vài thành phần
quan trọng nhất (ví dụ 5). Giải thích cách làm.
b) Chọn và hiển thị hai thành phần quan trọng nhất. Chiếu các ảnh trong tập
“New” lên hai thành phần này. Hiển thị kết quả chiếu và nhận xét.

Chú ý: có thể giảm kích thước ảnh (dùng lệnh imresize) nếu cần thiết.

Bài làm

Code:

clc;
clear all;
close all;
images = [];
image = 'new/';
imagefiles = dir('new\*.jpg');
nfiles = length(imagefiles);
for i=1:nfiles
currentfilename = strcat( image,imagefiles(i).name);
I = imread(currentfilename);
I = rgb2gray(I);
I = imresize(I, [64 (size(I,2)*64)/size(I,1)]);
I = reshape(I, [1,size(I,1)*size(I,2)]);
images = [images;I];
end
images = double(images);
N = size(images,1);
x = images(1,:);
for i = 2:N
x = x + images(i,:);
end
x = x/N;
for i = 1:N
X(i,:) = images(i,:) - x;
end
S = X'*X/N;
[v,d] = eig(S);
%a)
figure,subplot(121), imshow(reshape(images(1,:),[64, size(images(1,:),2)/64]),[]);
title('original')

K = 15;
m = v(:,end-K+1:end);
j = X*m;
A = j*m';
A = A(1,:) + x;
subplot(122), imshow(reshape(A,[64, size(A,2)/64]),[]);
title(strcat('K = ',int2str(K)))

%b)
figure;
K = 2;
m = v(:,end-K+1:end);
j = X*m;

plot(j(:,1), j(:,2), 'x');

A)
Giải thích cách làm :
1. Tính vector kì vọng của toàn bộ dữ liệu

2. Trừ mỗi điểm dữ liệu đi vector kỳ vọng của toàn bộ dữ liệu

3. Tính ma trận hiệp phương sai

4. Tính các trị riêng và vector riêng có norm bằng 1 của ma trận này, sắp xếp chúng theo thứ
tự giảm dần của trị riêng
5. Chọn K vector riêng ứng với K trị riêng lớn nhất để xây dựng ma trận UK có các cột tạo
thành một hệ trực giao. K vectors này, còn được gọi là các thành phần chính, tạo thành
một không gian con gần với phân bố của dữ liệu ban đầu đã chuẩn hoá.
Kết quả :
B)
Kết quả:

Nhận xét : kết quá chiếu các ảnh trong tập new phân bố rời rạc, không đồng đều về mặt vị trí.

You might also like