ĐẠI HỌC THÁI NGUYÊN ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ ĐIỆN TỬ VÀ TRUYỀN THÔNG -----&---- BÁO CÁO TIỂU LUẬN MÔN: MATLAB Chủ đề: TÌM HIỂU NÉN ẢNH BẰNG GIẢI THUẬT PHÂN TÍCH GIÁ TRỊ RIÊNG Giảng viên: Th.s. Vũ Thúy Hằng Sinh viên thực hiện: 1. Vũ Đình Cường 2. Hoàng Quang Vinh 3. Nguyễn Bùi Bảo 4. Nguyễn Công Trình 5. Đinh Lương Bình Lớp : Kỹ thuật Y sinh Khóa: 13 Thái Nguyên, tháng 10, năm 2016 MỞ ĐẦU Mục đích của việc nén ảnh số là mã hoá các dữ liệu ảnh về một dạng thu gọn, tối thiểu hoá cả số bit dùng để biểu diễn ảnh lẫn các sai khác do quá trình nén gây ra. Tầm quan trọng của vấn đề nén ảnh có thể thấy rõ qua các số liệu cụ thể: với một bức ảnh trắng đen kích thước 512x512 pixels, mỗi pixel được biểu diễn bởi 8 bits (biểu diễn một trong 256 giá trị mức xám), cần khoảng 256 Kbytes dữ liệu. Với ảnh màu cần gấp ba lần con số này. Với các dữ liệu video, cần 25 frames trên một giây, như vậy một đoạn video chỉ 30s phải cần đến 540MB dữ liệu, một con số quá lớn. Do đó vấn đề nén ảnh là hết sức cần thiết. Nói chung, các phương pháp nén ảnh chủ yếu được phân thành 2 nhóm: nhóm không tổn hao và nhóm có tổn hao. Các phương pháp nén ảnh không tổn hao cho phép biểu diễn ảnh với chất lượng hoàn toàn ngang bằng với ảnh gốc. Các phương pháp này dựa trên các giải thuật nén được áp dụng cho tất cả các đối tượng dữ liệu nói chung chứ không chỉ riêng dữ liệu ảnh, ví dụ mã Huffman, mã số học, mã Golomb, ... Tuy nhiên, các phương pháp này không lợi dụng được những đặc tính riêng của dữ liệu ảnh và tỷ lệ nén rất thấp. Do đó, trong thực tế, các phương pháp nén có tổn hao là các phương pháp được sử dụng chủ yếu. Với các phương pháp này, luôn có sự đánh đổi giữa dung lượng ảnh với chất lượng ảnh.
ĐẠI HỌC THÁI NGUYÊN ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA CÔNG NGHỆ ĐIỆN TỬ VÀ TRUYỀN THÔNG - BÁO CÁO TIỂU LUẬN MƠN: MATLAB Chủ đề: TÌM HIỂU NÉN ẢNH BẰNG GIẢI THUẬT PHÂN TÍCH GIÁ TRỊ RIÊNG Giảng viên: Th.s Vũ Thúy Hằng Sinh viên thực hiện: Vũ Đình Cường Hoàng Quang Vinh Nguyễn Bùi Bảo Nguyễn Cơng Trình Đinh Lương Bình Lớp : Kỹ thuật Y sinh Khóa: 13 Thái Nguyên, tháng 10, năm 2016 MỞ ĐẦU Mục đích việc nén ảnh số mã hoá liệu ảnh dạng thu gọn, tối thiểu hoá số bit dùng để biểu diễn ảnh lẫn sai khác trình nén gây Tầm quan trọng vấn đề nén ảnh thấy rõ qua số liệu cụ thể: với ảnh trắng đen kích thước 512x512 pixels, pixel biểu diễn bits (biểu diễn 256 giá trị mức xám), cần khoảng 256 Kbytes liệu Với ảnh màu cần gấp ba lần số Với liệu video, cần 25 frames giây, đoạn video 30s phải cần đến 540MB liệu, số lớn Do vấn đề nén ảnh cần thiết Nói chung, phương pháp nén ảnh chủ yếu phân thành nhóm: nhóm khơng tổn hao nhóm có tổn hao Các phương pháp nén ảnh không tổn hao cho phép biểu diễn ảnh với chất lượng hoàn toàn ngang với ảnh gốc Các phương pháp dựa giải thuật nén áp dụng cho tất đối tượng liệu nói chung khơng riêng liệu ảnh, ví dụ mã Huffman, mã số học, mã Golomb, Tuy nhiên, phương pháp không lợi dụng đặc tính riêng liệu ảnh tỷ lệ nén thấp Do đó, thực tế, phương pháp nén có tổn hao phương pháp sử dụng chủ yếu Với phương pháp này, ln có đánh đổi dung lượng ảnh với chất lượng ảnh PHƯƠNG PHÁP PHÂN TÍCH GIÁ TRỊ RIÊNG (SVD) I, Cơ sở lý thuyết Phương pháp phân tích trị riêng (SVD – Singular Value Decomposition) đề tài quan tâm đại số tuyến tính Phương pháp có nhiều ứng dụng thực tế, số ứng dụng kỹ thuật nén ảnh Đặc điểm quan trọng phương pháp áp dụng cho ma trận thực m x n Nội dung là: phân tích ma trận A cho trước thành ma trận U, S, V, cho: A = USV (4.1) T U V ma trận trực giao S ma trận đường chéo Ma trận U ma trận gồm vector riêng trái A, ma trận V ma trận gồm vector riêng phải A ma trận S ma trận đường chéo, phần tử đường chéo trị riêng A Các trị riêng đường chéo theo thứ tự sau: s1 > s = > > s r > s r +1 = = s với r hạng ma trận A p = min{m,n} p Để tìm ma trận S, U, V, ta thực bước sau: Bước 1: Tìm ma trận V Nhân T A vào hai vế (4.1), ta có: AT A = (USVT )T USVT = V.ST UT U.S.V T = V.ST S.V T = V.S2.V T Do UT.U=I Như vậy, để tìm ma trận S V, ta cần tìm trị riêng vector riêng AT A từ (4.1) ta thấy trị riêng AT A bình phương phần tử S cịn vector riêng AT A cột V Bước 2: Tìm ma trận U Nhân hai (4.1) với AT sử dụng: VTV =I ta có : AAT = U.S2 U T Vậy cột U vector riêng T AA Cuối cùng, ta phân tích ma trận A dạng sau: σ1 VT1 … … σr A=(u1 … ur … um) … VTr … VTn A S ma trận kích thước mxn, U ma trận mxm V ma trận nxn II Ứng dụng SVD để nén ảnh số Bằng cách phân tích ma trận ảnh A dạng A=USV T , ta biểu diễn xấp xỉ ma trận A phần tử Nếu hạng ma trận A r [U,S,V] = svd(A) Chúng ta sử dụng hàm kết hợp với phương trình (4.2) để viết hàm nén ảnh dùng giải thuật SVD Ví dụ hàm svdcompr Cú pháp là: >> im = svdcompr (infile,singvals,outfile) infile outfile tên file ảnh gốc ảnh nén, singvals số trị riêng lớn giữ lại Ta có hàm svdcompr() : function [im] = svdcompr (infile,singvals,outfile) % IMCOMPR (infile,singvals,outfile) % Image compression based on Singular Value Decomposition % Written by Luigi Rosa – L’Aquila - Italia % infile is input file name present in the current directory % singvals is the number of largest singular values (positive integer) % outfile is output file name which will be created % Compression ratio is equal to k(n+m+k) / n*m % where k is the number of singular values (singvals) % and [n,m]=size(input_image) %***************************************************** if (exist(infile)==2) a = imread(infile); figure('Name','Input image'); imshow(a); else warndlg('The file does not exist.',' Warning '); im=[]; return end if isrgb(a) if isa(a(:,:,1),'uint8') red = double(a(:,:,1)); green = double(a(:,:,2)); blue = double(a(:,:,3)); [u,s,v] = svds(red, singvals); imred = uint8(u * s * transpose(v)); [u,s,v] = svds(green, singvals); imgreen = uint8(u * s * transpose(v)); [u,s,v] = svds(blue, singvals); imblue = uint8(u * s * transpose(v)); im(:,:,1) = imred; im(:,:,2) = imgreen; im(:,:,3) = imblue; imwrite(im, outfile); figure('Name','Output image'); imshow(im); return; end if isa(a(:,:,1),'uint16') red = double(a(:,:,1)); green = double(a(:,:,2)); blue = double(a(:,:,3)); [u,s,v] = svds(red, singvals); imred = uint16(u * s * transpose(v)); [u,s,v] = svds(green, singvals); imgreen = uint16(u * s * transpose(v)); [u,s,v] = svds(blue, singvals); imblue = uint16(u * s * transpose(v)); im(:,:,1) = imred; im(:,:,2) = imgreen; im(:,:,3) = imblue; imwrite(im, outfile); figure('Name','Output image'); imshow(im); return; end if isa(a(:,:,1),'double') red = double(a(:,:,1)); green = double(a(:,:,2)); blue = double(a(:,:,3)); [u,s,v] = svds(red, singvals); imred = (u * s * transpose(v)); [u,s,v] = svds(green, singvals); imgreen = (u * s * transpose(v)); [u,s,v] = svds(blue, singvals); imblue = (u * s * transpose(v)); im(:,:,1) = imred; im(:,:,2) = imgreen; im(:,:,3) = imblue; imwrite(im, outfile); figure('Name','Output image'); imshow(im); return; end end if isgray(a) dvalue=double(a); [u,s,v] = svds(dvalue, singvals); if isa(a,'uint8') im = uint8(u * s * transpose(v)); end if isa(a,'uint16') im = uint16(u * s * transpose(v)); end if isa(a,'double') im = (u * s * transpose(v)); end imwrite(im, outfile); figure('Name','Output image'); imshow(im); return; end III Ví dụ : Ví dụ : Thực giải thuật nén SVD dùng hàm svdcompr: Trong ví dụ ta giữ lại 30 số hạng phương trình (4.2) in = imread(‘2.bmp’) ; out=svdcompr(‘2.bmp’,30,’svd.bmp’); imshow(in),figure, imshow(out); Ví dụ 2: close all [A,map]=imread(‘lena.gif’); B=im2double(A,’indexed’); imshow(B,map) [u,s,v]=svd(B); C=zeros(size(B)); for j=1:k C=C+s(j,j)*u(:,j)*v(:,j).’; end C=floor(C); imshow(C,map) k=find(C