Tài liệu Biến hình và xử lí ảnh: Trường Khoa Học Tự Nhiên
09
Biến hình và xử lí ảnh
Nguyễn Đức Thành 0511214
Giáo viên hướng dẫn :Phạm Thế Bảo
Nội Dung
1.Giới thiệu
Nội dung của bài báo cáo này trình bày quá trình làm ảnh động trên mái nhà.Để dễ hiểu quá trình giống như ta thay mái nhà bằng một màn hình.Quá trình trên được xây dựng trên những tấm ảnh,một là ảnh nền chứa ngôi cần làm mái chứa ảnh động,và chia làm hai giai đoạn:
Giai đoạn 1: biến ảnh cần đặt trên mái nhà về dạng mái nhà của ảnh nền
Giai đoạn 2: Làm cho mái nhà chứa ảnh động
2.Giai đoạn 1
2.1 Xác định tọa độ của mái nhà
Để xác định tọa độ bốn góc của mái nhà,trong Matlab ta dùng hàm imtool để lấy tọa độ bốn đỉnh của mái nhà và lưu chúng trong một ma trận.Với hàm này ta chỉ cần chỉ con trỏ tới vị trí cần xác định tọa độ và trên màn hình cho ta chỉ số của tọa độ trục x và trục y.
Với hình trên ta có tọa độ bốn góc như sau:
bs=[419 295;234 114;735 259;793 315];
2.2 Biến đổi hình dạng của ảnh
Trong trường hợp tổng quát,với mái nhà ...
9 trang |
Chia sẻ: hunglv | Lượt xem: 1319 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Biến hình và xử lí ảnh, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Trường Khoa Học Tự Nhiên
09
Biến hình và xử lí ảnh
Nguyễn Đức Thành 0511214
Giáo viên hướng dẫn :Phạm Thế Bảo
Nội Dung
1.Giới thiệu
Nội dung của bài báo cáo này trình bày quá trình làm ảnh động trên mái nhà.Để dễ hiểu quá trình giống như ta thay mái nhà bằng một màn hình.Quá trình trên được xây dựng trên những tấm ảnh,một là ảnh nền chứa ngôi cần làm mái chứa ảnh động,và chia làm hai giai đoạn:
Giai đoạn 1: biến ảnh cần đặt trên mái nhà về dạng mái nhà của ảnh nền
Giai đoạn 2: Làm cho mái nhà chứa ảnh động
2.Giai đoạn 1
2.1 Xác định tọa độ của mái nhà
Để xác định tọa độ bốn góc của mái nhà,trong Matlab ta dùng hàm imtool để lấy tọa độ bốn đỉnh của mái nhà và lưu chúng trong một ma trận.Với hàm này ta chỉ cần chỉ con trỏ tới vị trí cần xác định tọa độ và trên màn hình cho ta chỉ số của tọa độ trục x và trục y.
Với hình trên ta có tọa độ bốn góc như sau:
bs=[419 295;234 114;735 259;793 315];
2.2 Biến đổi hình dạng của ảnh
Trong trường hợp tổng quát,với mái nhà có hình dáng bất kì (như gồ ghề,bị lõm,hay có hình dạng phức tạp …) thì rất phức tạp để đưa một ảnh bất kì về hình dáng mái nhà như trên.Nhưng trong bài báo cáo này chỉ xét trường hợp đơn giản bề mặt mái nhà phẳng và có hình dáng của hình bình hành.Để biến đổi hình dáng của ảnh cần đưa lên mái nhà ta cũng xác định bốn góc của bức ảnh(cũng là kích thước của bức ảnh) bằng những lệnh sau
kt=size(anh);
in=[1 kt(1);1 1;kt(2) 1;kt(2) kt(1)];
Sau đó ta chọn phép biển đổi để biến đổi hình dạng bức ảnh trong trường hợp này ta dùng phép chiếu tform=cp2tform(in,bs,'projective');
Trong đó :
in là tọa độ bốn góc của bức ảnh cần biến đổi,
bs là tọa độ bốn góc của mái nhà
Cuối cùng để đưa ảnh cần biến đổi về dạng mái nhà ta dùng hàm sau:
kq1=imtransform(anh,tform,'XData',[1 800],'YData',[1 600]);
trong đó
anh là ảnh cần đưa về dạng mái nhà
tform chính là phép biến đổi thu được của hàm cp2tform
với một tấm ảnh có kích thước có hình dạng bất kì (khác với kích thước của ảnh nền ) thì sau khi đưa về hình dáng của mái nhà thì kích thước của ảnh sau khi biến đổi có thể khác với kích thước của ảnh nền.Do đó để kích thước của tấm ảnh sau khi biến đổi có kích thước của ảnh nên thì ta cần đưa thêm hai tham số vào hàm trên đó là ‘XData’ và ‘YData’ và truyền thông số kích thước của tấm ảnh(chính là kích thước của ảnh nền) ở đây là [1 800] và [1 600].
Ảnh kết quả thu được như sau :
Đoạn kết miêu tả quá trình trên
bs=[419 295;234 114;735 259;793 315];
kt=size(anh);
in=[1 kt(1);1 1;kt(2) 1;kt(2) kt(1)];
tform=cp2tform(in,bs,'projective');
mai=imtransform(anh,tform,'XData',[1 size(nen,2)],'YData',[1 size(nen,1)]);
2.3 Xác định biên
Mục đích của xác định biên là làm mờ biên,nếu không làm mờ biên thì sau khi thay mái nhà bằng một hình khác thì biên của ảnh này sẽ rất rõ và làm cho bức ảnh sẽ không thật,vì vậy ta cần làm mờ biên để sự chuyển đổi từ hình ảnh của ảnh nền sang ảnh ghép vào mái nhà có trạng thái chuyển đổi từ từ không đột ngột như vậy bức ảnh sau khi ghép trông có vẻ thật hơn.
Ý tưởng của thuật toán xác định biên là những pixel nào có ba thành phần khác không thì ta chuyển sang màu trắng.Với ảnh cuối cùng thu được ở phần 2.2 ,những vị trí nào có thành phần G,R,B khác 0 thì chuyển sang màu trắng.
Bức ảnh thu được sau quá trình trên:
2.4 Làm mờ biên
Có rất nhiều cách làm mờ biên chẳng hạn làm mờ biên bằng những hàm phi tuyến hay tuyến tính.Ý tưởng chính của thuật toán làm mờ biên là ứng với mỗi lần nới rộng biên ra(hoặc thu hẹp biên lại ) thì mức xám của biên sẽ giảm xuống theo hàm mà ta chọn.Trong trường hợp này ta dùng phương pháp làm mờ biên tuyến tính được minh họa như hình sau.
L
0 … (1-i)/L… 1
L bề rộng làm mờ biên
i có giá trị từ 0 đến L
sau mỗi lần nới rộng biên (1 pixel) thì độ xám của biên sẽ giảm 1/l và nới rộng đến lần thứ L thì giá trị của biên bằng 0.
Trong trường với biên như trên ,trong matlab ta sẽ dùng hàm imdilate(tam,h) để nới rộng biên.Ý tưởng nới rộng biên của hàm này là dùng một mặt nạ h di chuyển dọc theo bức ảnh nếu phần giao của mặt nạ h với hình có dạng mái nhà khác rỗng thì những pixel thuộc mặt nạ h mà không thuộc vào mái nhà thì sẽ được chuyển từ giá trị không đến giá trị được mô tả như trên.Và ta cũng lập lại quá trình trên với số lần cho trước (bề rộng biên thích hợp do người làm chọn sao cho thích hợp).
h Maia mái nhà
Đoạn code sau miêu tả quá trình làm mờ biên ở trên:
function kq=lam_mo_bien(a,l)
tam = a;
m = zeros(size(a,1),size(a,2));
for i=1:l
tam1=tam;
tam =gian_anh(tam1,1);
be = tam-tam1;
for(j=1:size(be,1))
for(k=1:size(be,2))
if be(j,k)
m(j,k)=(l-i)/l;
end
end
end
end
kq=m+im2double(a);
a là ảnh nhị phân biên của mái nhà
l là bề rộng làm mờ biên
hàm lam_mo_bien(a,l) đầu tiên sẽ nới rộng biên bằng hàm gian_anh(tam1,l) với số lần là l.Ứng với mỗi lần giãn như thế thì giá trị biên mới giãn sẽ là (l-i)/l với i là số lần lặp lại và ta sẽ lưu lại biên này bằng một ma trận tam.Cụ thể ban đầu ta khởi tạo ma trận m chính là ma trận a và cứ mỗi lần nới rộng biên ra thì ta sẽ lưu lại biên này bằng cách những vị trí của pixel trong anh tam trùng với vị trí những pixel của biên nới sẽ được gán giá trị của biên nới rộng,và quá trình này tương tự đối với những biên được nới rộng tiếp theo.Cuối cùng ta sẽ thu được ảnh mà biên đã được làm mờ.
Bây giờ ta sẽ xét hàm gian_anh()
function kq=gian_anh(a,n)
h=[1 1 1 ;1 1 1;1 1 1 ];
tam = a;
for(i=1:n)
tam=imdilate(tam,h);
end
kq = tam;
a là ảnh nhị phân chứa biên cần làm giãn biên
n số lần lập lại hàm imdilate()
h là mặt nạ làm giãn biên ,ta có thể chọn một mặt nạ khác thích hợp với biên tương úng
ham imdilate(tam,h) sẽ làm giãn mở rộng biên bằng cách rê mặt nạ h lên toàn bộ ảnh nếu phần giao của mặt nạ với biên khác rỗng thì những pixel nào có vị trí nằm trong mặt nạ sẽ có giá trị 1.Ta lặp lại quá trình trên n lần ta sẽ được biên được mở rộng theo mong muốn .
2.5 Trộn ảnh
Để trộn ba ảnh(ảnh nền,ảnh cần biến đổi về mái nhà,ảnh được làm mờ biên) ta dùng công thức sau:
Anh_kq(i,j,:)=bien(i,j)*anh_nen(i,j,:)+(1-bien(i,j))*ảnh_can_ghep(i,j,:);
Bien : biên đã được làm mờ
Anh_nen ảnh nền
Anh_can_ghep ảnh thay cho mái nhà
Thuật toán cụ thể như sau
function kq=tron_anh_voi_bien_bat_ki(a,b,bien,l)
m=lam_mo_bien(bien,l);
for(i=1:size(a,1))
for(j=1:size(a,2))
tam(i,j,:)=m(i,j)*a(i,j,:)+(1-m(i,j))*b(i,j,:);
end
end
kq=tam;
a,b,biên lần lượt là ba ảnh trên từ trái sang phải
l bề rộng làm mờ biên
những pixel ở ngoài biên thì có giá trị của ảnh a (ảnh nền),những pixel nằm trong biên sẽ có giá trị của ảnh có dạng mái nhà (ảnh b) và những pixel nào nằm trong vùng biên làm mờ sẽ được trộn giữa giá trị của ảnh a và ảnh b cụ thể theo công thức sau:
tam(i,j,:)=m(i,j)*a(i,j,:)+(1-m(i,j))*b(i,j,:);
cuối cùng ta sẽ thu được ảnh ghép của ba ảnh trên với biên mái nhà được làm mờ ,ảnh sau khi trộn
3 Giai đoạn 2
Với các bước tương tự như trên ta thu được những ảnh trộn khác và lưu những bức ảnh này trong mạng bốn chiều :
function kq=tao_mov()
%buoc 1: ghep cac anh vao mai nha
c=imread('bien_mai_nha.jpg');
bien=im2bw(c);
%nen=imread('nen.jpg'); %nha giau
nen= imread('nhatranh.jpg');
for i=1:3
so=num2str(i); %chuyen so sang chuoi
tam=imread(strcat(so,'.jpg')); %strcat: ghep hai chuoi voi nhau ->tam=imread('i.jpg')
mang(:,:,:,i)=tron_anh(nen,tam,bien);
% mang(:,:,:,i)=ghepanh(nen,tam); %nha giau %ghep anh tam vao mai nha cua anh nen -> luu keq qua vao mang bon chieu(mang)
end
kq=immovie(mang);
Ta sẽ chuyển những ảnh cần làm cho chuyển động trên mái nhà thành những và ghép chúng vào ảnh nền như quá trình được trình bày ở trên lưu chúng trong một ma trận bốn chiều mang.Sau đó ta sẽ gọi hàm immovie(mang).Cuối cùng để tạo ra ảnh động trên mái nhà ta dùng hàm
Movie(kq,n,f)
n là số lần lặp lại
f là tần số
4 Tổng kết
Ta thấy với cách làm trên còn nhiều khuyết điểm,với hình dạng mái nhà phức tạp thì áp dụng cách trên không thể thực thi,quá trình trên áp dụng cho được xây dựng trên những bức ảnh do đó ta có thể mở rộng bài toán cho những đoạn video,bằng cách tách những frame riêng biệt và ta cũng xử lí như quá trình trên.Với những mái nhà có hình dạng bất kì (gồ ghề …) thì ta có thể xem mái nhà được ghép bởi những dạng hình học cơ bản về ta cũng xử lí như trên.
tài liệu tham khảo
Giáo trình Biến Hình và Xử lí ảnh Phạm Thế Bảo
Gonzalez ,T,C and woods ,R,E[2002] Digital Image Processing ,2nd ed..prentice hall,upper Saddle River
Image Processing Toolbox ,users Guide,version 4[2003]The MathWorks,Inc,Matick,Ma
Các file đính kèm theo tài liệu này:
- bienhinh_xla.docx
- code_thuchanh.rar