Phương pháp SVD đã được phát triển dựa trên những tính chất của ma trận trực giao và ma trận đường chéo để tìm ra một ma trận xấp xỉ với ma trận gốc.. Phương pháp này sau đó đã được ứng
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH
GVHD: NGUYỄN XUÂN MỸ
CHỦ ĐỀ 10:
ỨNG DỤNG PHÂN TÍCH SVD ĐỂ
KHỬ NHIỄU HÌNH ẢNH
Nhóm thực hiện: 10
Trang 2Giới thiệu chung
- Lớp: L16
- Nhóm: 10
- Chủ đề: 10
- Danh sách thành viên
Trang 3Mục Lục
LỜI CẢM ƠN 4
LỜI MỞ ĐẦU 5
I CƠ SỞ LÍ THUYẾT CỦA PHÂN TÍCH SVD
Mục tiêu của phân tích SVD 6
Quá trình phân tích SVD thông qua một ma trận 6
Một số ví dụ 9
II ỨNG DỤNG CỦA PHÂN TÍCH SVD TRONG KHỬ
NHIỄU HÌNH ẢNH
Đặt vấn đề - Ý nghĩa của khử nhiễu hình ảnh trong cuộc sống 10
Khử nhiễu hình ảnh qua thuật toán phân tích SVD 11
Quá trình thực hiện tổng quan phân tích SVD qua Matlab 12 III CHƯƠNG TRÌNH MATLAB 14
IV TÀI LIỆU THAM KHẢO 14
Trang 4LỜI CẢM ƠN
Trong suốt quá trình học bộ môn Đại số tuyến tính, nhóm chúng em
đã nhận được rất nhiều sự quan tâm, giúp đỡ và kiến thức từ thầy/cô,
anh/chị khóa trên và các bạn cùng khóa
Ngoài ra nhóm em xin gửi lời cảm ơn chân thành nhất đến cô Nguyễn Xuân Mỹ là giảng viên giảng dạy bộ môn Đại số tuyến tính và cũng là người hướng dẫn nhóm em thực hiện đề tài này Nhờ cô hướng dẫn
và giải đáp những thắc mắc, khó khăn nhóm gặp vướng mắc trong quá trình làm bài vô cùng kịp thời và kết quả là nhóm đã làm thành bài đúng tiến độ Sự hướng dẫn của cô là kim chỉ nam giúp nhóm chúng em làm việc hiệu quả hơn dù thành viên ít do quá trình liên lạc khó khăn, gắn kết mối quan hệ tốt giữa các thành viên trong nhóm và
giữa sinh viên với giảng viên
Lời cuối, xin một lần nữa gửi lời biết ơn sâu sắc đến các cá nhân, các thầy/cô đã dành thời gian chỉ dẫn cho nhóm Đây chính là niềm tin, nguồn động lực to lớn để nhóm có thể đạt được kết quả này Nhóm
chúng em xin chân thành cảm ơn ạ!
Trang 5Đại số tuyến tính nói chung có rất nhiều ứng dụng trong hầu hết các lĩnh vực trong khoa học: kinh tế, môi trường, công nghệ máy tính, xử lí tín hiệu, đồ họa,… Một phần nhỏ trong số đó phải nhắc đến là phương pháp phân tích SVD trong nhiều bài
toán khác nhau Phương pháp phân tích suy biến (singular value decomposition)
được viết tắt là SVD là một trong những phương pháp thuộc nhóm matrix factorization (Ma trận thừa số hóa) được phát triển lần đầu bởi những nhà hình học
vi phân Ban đầu mục đích của phương pháp này là tìm ra một phép xoay không gian sao cho tích vô hướng của các vector không thay đổi Từ mối liên hệ này khái niệm về ma trận trực giao đã hình thành để tạo ra các phép xoay đặc biệt Phương pháp SVD đã được phát triển dựa trên những tính chất của ma trận trực giao và ma trận đường chéo để tìm ra một ma trận xấp xỉ với ma trận gốc Phương pháp này sau đó đã được ứng dụng rộng rãi trong các lĩnh vực như hình học vi phân, hồi qui tuyến tính, xử lý hình ảnh, cluaxstering, các thuật toán nèn và giảm chiều dữ liệu, khử nhiễu âm thanh, khử nhiễu hình ảnh…
LỜI MỞ ĐẦU
Trang 6I CƠ SỞ LÍ THUYẾT CỦA PHÂN TÍCH SVD:
1.1 Mục tiêu của phân tích suy biến SVD
Phương pháp SVD sẽ tìm ra một lớp các ma trận xấp xỉ tốt nhất với một ma trận cho trước dựa trên khoảng cách norm Frobenios giữa 2 ma trận Người ta đã chứng minh được rằng ma trận xấp xỉ tốt nhất được biểu diễn dưới dạng tích của 3 ma trận rất đặc biệt bao gồm 2 ma trận trực giao (orthogonal matrix) và 1 ma trận đường chéo (diagonal matrix) Quá trình nhân ma trận thực chất là quá trình biến đổi các điểm dữ liệu của ma trận gốc thông qua những phép xoay trục (rotation) và phép thay đổi độ lớn (scaling) và từ đó tạo ra những điểm dữ liệu mới trong không
gian mới Điều đặc biệt của ma trận đường chéo đó là các phần tử của nó chính là những giá trị riêng của ma trận gốc Những điểm dữ liệu trong không gian mới có thể giữ được 100% thông tin ban đầu hoặc chỉ giữ một phần lớn thông tin của dữ liệu ban đầu thông qua các phép truncate SVD Bằng cách sắp xếp các trị riêng theo thứ tự giảm dần trên đường chéo chính thuật toán SVD có thể thu được ma trận xấp xỉ tốt nhất mà vẫn đảm bảo giảm được hạng của ma trận sau biến đổi và kích thước các ma trận nhân tử nằm trong giới hạn cho phép Do đó nó tiết kiệm được thời gian và chi phí tính toán và đồng thời cũng tìm ra được một giá trị dự báo cho ma trận gốc với mức độ chính xác cao
Do đó, để tiếp cận được thuật toán phân tích SVD, chúng ta cần phải nắm những kiến thức cơ bản về cơ sở tạo nên nó Gọi tắt là Cơ sở lí thuyết của việc phân tích SVD Chúng ta có thể tham khảo thêm những khái niệm, tính chất định lí liên quan đến những vấn đề dưới đây qua quyển: “Đặng Văn Vinh, Giáo trình Đại số tuyến tính, NXB ĐHQG 2020)
- Ma trận, Định thức
- Trị riêng và vecto riêng
- Khái niệm về Họ trực giao và trực chuẩn Trực giao hóa
Gram-Schmidt
- Chéo hóa ma trận, chéo hóa trực giao và những tính chất của chúng
1.2 Quá trình phân tích SVD của một ma trận dựa trên cơ sở lí
thuyết đã nêu trên:
Trang 7Singular Value Decomposition là ứng dụng nổi bật trong Đại số tuyến tính Bất kỳ một ma trận A nào với cấp mxn (không nhất thiết phải là ma trận vuông), ta đều có thể phân tích thành dạng:
𝐴𝑚× 𝑛 = 𝑄𝑚×𝑚 𝛴𝑚×𝑛(𝑃𝑛×𝑛) 𝑇(!)
Trong đó Q và P là các ma trận trực giao; và Σ là ma trận chéo không vuông (cấp
mxn) với các phần tử trên đường chéo 𝜎1 ≥ 𝜎2 ≥ ⋯ ≥ 𝜎𝑟 ≥ 0 = 0 = ⋯ = 0 , mặc
dù Σ không phải ma trận vuông nhưng, ta vẫn có thể coi nó là ma trận chéo miễn là các phần tử khác 0 của nó chỉ nằm trên đường chéo (tức là tại các vị trí có chỉ số hàng và chỉ số cột như nhau); r là Rank(A) bằng số lượng phần tử khác 0 trong ma trận đường chéo Σ
*Chú ý rằng cách biểu diễn (!) không là duy nhất, vì ta chỉ cần đổi dấu Q và P thì
vẫn thỏa mãn
Biểu diễn SVD qua các trường hợp của ma trận A:
+TH1: 𝑚 < 𝑛
+TH2: 𝑚 > 𝑛
(H1: SVD cho ma trận A khi: 𝑚 < 𝑛 (hình trên), và 𝑚 > 𝑛 (hình dưới) Σ là một ma trận
đường chéo với các phần tử trên đó giảm dần và không âm Màu đỏ càng đậm thể hiện giá trị càng cao Các ô màu trắng trên ma trận này thể hiện giá trị 0.)
Cho A là một ma trận thực mxn Ta chứng minh rằng tập hợp các trị riêng khác không của 𝐴𝐴𝑇 và 𝐴𝑇𝐴 là trùng nhau Thật vậy, giả sử 𝜆𝑜 là một trị riêng
Trang 8(eigenvalue) khác 0 của 𝐴𝐴𝑇 và 𝑋𝑜 là vector riêng (eigenvector) của 𝐴𝐴𝑇 tương ứng Khi đó :
𝐴𝐴𝑇𝑋𝑜 = 𝜆𝑜𝑋𝑜 ➪ Suy ra: 𝐴𝑇𝐴𝐴𝑇𝑋𝑜 = 𝐴𝑇𝜆𝑜𝑋𝑜 Điều này tương đương với 𝐴𝑇𝐴(𝐴𝑇𝑋𝑜) = 𝐴𝑇(𝜆𝑜𝑋𝑜) = 𝜆𝑜(𝐴𝑇𝑋𝑜).Vì 𝜆𝑜 khác 0 nên 𝐴𝑇𝑋𝑜 khác 0 Suy ra 𝜆𝑜 là trị riêng của 𝐴𝑇𝐴 và (𝐴𝑇𝑋𝑜) là vector riêng của
𝐴𝑇𝐴
Vì ma trận 𝐴𝐴𝑇 và 𝐴𝑇𝐴 là 2 ma trận đối xứng, nên chúng chéo hóa trực giao được Khi đó:
𝐴𝐴𝑇 = (𝑄𝛴𝑃𝑇)(𝑄𝛴𝑃𝑇)𝑇
= 𝑄𝛴𝑃𝑇𝑃𝛴𝑇𝑄𝑇
= 𝑄𝛴𝛴𝑇𝑄𝑇(vì 𝑃𝑇𝑃 = 𝐼, 𝐼 là ma trận đơn vị)
= 𝑄𝐷1𝑄𝑇
𝐴𝑇𝐴 = (𝑄𝛴𝑃𝑇)𝑇(𝑄𝛴𝑃𝑇)
= 𝑃𝛴𝑇𝑄𝑇𝑄𝛴𝑃𝑇
= 𝑃𝛴𝑇𝛴𝑃𝑇(vì 𝑄𝑇𝑄 = 𝐼, 𝐼 là ma trận đơn vị)
= 𝑃𝐷2𝑃𝑇
Suy ra
- Các cột của ma trận 𝑄 là các vector của 𝐴𝐴𝑇 và các 𝜎12, 𝜎22, … 𝜎𝑟2 là các trị riêng khác 0 của 𝐴𝐴𝑇
- Các cột của ma trận 𝑃 là các vector của 𝐴𝑇𝐴 và các 𝜎12, 𝜎22, … 𝜎𝑟2 là các trị riêng khác 0 của 𝐴𝑇𝐴
- 𝐷1, 𝐷2 là ma trận chéo với trị riêng tương ứng của 𝐴𝐴𝑇 và 𝐴𝑇𝐴 là
𝜎12, 𝜎22, … 𝜎𝑟2 Ta sắp xếp các 𝜎12, 𝜎22, … 𝜎𝑟2 sao cho 𝜎12 > 𝜎22 >
⋯ > 𝜎𝑟2 (hình A1)
COMPACT SVD ( SVD gọn nhẹ hơn)
Gọi 𝑄 = (𝑞1|𝑞2| … |𝑞𝑚) 𝑣à 𝑃 = (𝑝1|𝑝2| … |𝑝𝑛)
Viết lại biểu thức (!) dưới dạng tổng với Rank (A) = 1
𝐴 = 𝜎1𝑞1𝑝1𝑇 + 𝜎2𝑞2𝑝2𝑇 + ⋯ + 𝜎𝑟𝑞𝑟𝑝𝑟𝑇
Với mỗi 𝑞𝑖𝑝𝑖𝑇 là một ma trận có hạng bằng 1
Trang 9Rõ ràng với cách phân tích này, ta nhận thấy rằng ma trận 𝐴 phụ thuộc vào r cột đầu tiên của 𝑄, 𝑃 và r phần tử khác không trên đường chéo 𝛴 Ta có phân tích gọn hơn của 𝐴 gọi là Compact SVD :
𝐴 = 𝑄𝑟𝛴𝑟(𝑃𝑟)𝑇
Với 𝑄𝑟 và 𝑃𝑟 là các ma trận được tạo nên từ các cột của 𝑄 và 𝑃 tương ứng, 𝛴𝑟 là
ma trận con được tạo bởi 𝑟 hàng đầu tiên và 𝑟 cột đầu tiên của 𝛴 Nếu ma trận 𝐴 có rank nhỏ hơn rất nhiều so với số hàng và số cột 𝑟 ≪ 𝑚, 𝑛 , ta sẽ được lợi nhiều về việc lưu trữ
Dưới đây là ví dụ minh hoạ với 𝑚 = 4, 𝑛 = 6, 𝑟 = 2
(H2: Biểu diễn SVD dạng thu gọn và biểu diễn ma trận dưới dạng tổng các ma trận
có rank bằng 1.)
1.3 Sau đây, ta sẽ xét một số ví dụ về phân tích SVD của một ma
trận bất kì:
Bước 1 : Xác định ma trận A(cỡ bao nhiêu) để tiến hành phân tích SVD
Bước 2 : Thực hiện chéo hóa trực giao : 𝐴𝐴𝑇 = 𝑄𝐷1𝑄𝑇
2.1 : Viết phương trình đặc trưng của 𝐴𝐴𝑇 Từ đó chúng ta sẽ tính được các giá trị riêng của 𝐴𝐴𝑇 Viết được ma trận đường chéo 𝐷1 có các phần tử là những giá trị riêng, ta vừa tìm được.(Lưu ý phải sắp xếp nó theo thứ tự giảm dần) 2.2 : Tìm vecto riêng của 𝐴𝐴𝑇 Từ đó ta tính được ma trận 𝑄, các cột của 𝑄 là các vecto riêng của 𝐴𝐴𝑇
Bước 3 : Thực hiện chéo hóa trực giao 𝐴𝑇𝐴 = 𝑃𝐷2𝑃𝑇
Tương tự các bước 2.1, 2.2 ta tính được 𝑃 và 𝐷2
Chọn 𝛴𝑚×𝑛 bằng cách chọn ma trận cỡ tương ứng phù hợp với 𝐷1 hay 𝐷2 Sau đó lấy căn bậc 2 của tất cả những phần tử trên đường chéo
Trang 10Bước 4 : Vậy phân tích SVD của ma trận A sẽ là : 𝐴𝑚× 𝑛 = 𝑄𝑚×𝑚 𝛴𝑚×𝑛(𝑃𝑛×𝑛) 𝑇 Nhận xét: Như vậy từ dữ liệu ban đầu, chúng ta có thể viết nó dưới dạng một ma trận Quá trình chéo hóa trực giao ma trận và ma trận chuyển vị của nó, chúng ta được phân tích SVD Trên cơ sở đó, ta có thể dễ dàng ứng dụng chúng vào nhiều lĩnh vực khác nhau trong khoa học
NHIỄU HÌNH ẢNH
1 Đặt vấn đề:
Trong cuộc sống hiện nay, chúng ta bắt gặp được rất nhiều loại hình ảnh khác nhau trong từng hoàn cảnh khác nhau Chẳng hạn như: hinh ảnh được
chụp selfie, ảnh gia đình, những bức ảnh đầy tính nghệ thuật của các nhiếp ảnh gia, ảnh thẻ mà các bạn sinh viên dung làm thẻ sinh viên,….Hình ảnh là một phát kiến tuyệt vời của nhân loại, chúng ghi lại những khoảng khắc bất chợt nào
đó khiến ta dễ dàng hình dung ra những sự vật sự việc trong thời điểm
sự việc đã xảy ra rồi, chúng ta có thể chiêm ngưỡng một khung cảnh đẹp từng một khoảng cách vô cùng xa, bất cứ lúc nào, Để có đươc một bức ảnh
ta có thể sử dụng nhiều phương tiện khác như như điện thoại, máy chụp ảnh Nhưng trong nhiều trường hợp những tập tin hình ảnh đó có thể bị nhèo đi, bị nhiễu, chất lượng hình ảnh bị giảm đó là hiện tượng "Noise" ảnh hay còn gọi là nhiễu ảnh thường dễ dàng bắt gặp bằng mắt thường, nó khá giống với hiện tượng hạt nhiễu (Grain) trong ảnh film Các đốm lấm tấm nhỏ xuất hiện trên những hình ảnh
chụp trong vùng tối hoặc nơi có
điều kiện ánh sáng thấp do trong
quá trình quay, chụp ảnh hoặc do
điều kiện môi trường tác động
khiến cho hình ảnh không còn giữ
được độ chân thực của mình
Như vậy, một vấn đề cần đặt ra
rằng làm sao để khử nhiễu được
một tập tin hình ảnh mà chúng ta
mong muốn?
Trang 11 Về mặt ý nghĩa: Nếu như, chúng ta có thể xử lí tốt một tập tin hình ảnh theo các tiêu chí (trọng tâm, chính xác , hiệu quả và tiết kiệm thời gian) thì việc
đó sẽ giúp ích cho ta rất nhiều Trong nghiên cứu về hình ảnh, sẽ giúp ta tiết kiệm thời gian hơn Còn trong doanh nghiệp chuyên về lĩnh vực truyền thông đa phương tiện, nếu xử lí tốt file hình ảnh, sẽ tiết kiệm được rất nhiều chi phí trong việc thiết kế một phần mềm nào đó, hay chỉ đơn giản là tăng chất lượng hình ảnh trong quá trình thiết kế poster, trang trí, thiết kế hình ảnh quảng cáo chuyên nghiệp Từ đó nó sẽ hướng đến nhiều đối tượng khách hàng hơn với một trải nghiệm về chất lượng hình ảnh tuyệt vời, chân thật và đặt biệt không còn bị nhiễu, bị nhèo nữa
Các tập đoàn về công nghệ lớn đang ngày càng đầu tư vào lĩnh vực hình ảnh, có thể thấy rõ nét nhất trong mảng điện thoại thông minh khi các thiết
bị di động của chúng ta sử dụng hằng ngày không còn là chỉ nghe, gọi, nhắn tin mà những camera gắn lên chúng ngày càng được nâng cấp cả về số lượng lẫn chất lượng xử lí để chụp những bức ảnh kỉ niệm, selfie những bức ảnh đẹp, đó là xu thế của tương lai và nắm bắt được xu thế chính là nắm bắt được thành công
2 Khử nhiễu hình ảnh qua thuật toán phân tích SVD
a Về ứng dụng hỗ trợ:
Hiện tại có rất nhiều ứng dụng hỗ trợ xử lí hình ảnh, đặc biệt là khử nhiễu dễ sử dụng và tiếp cận với người dùng một cách nhanh chóng Có thể kể đến như:,
Adobe Photoshop, Adobe Photoshop Lightroom, Affinity Photo, CyberLink PhotoDirector, Corel PaintShop Pro,…
Điểm chung của tất cả các phần mềm này chúng đều được viết dựa trên những đoạn Code xử lí hình ảnh trong C++, C#, Pascal, Python, Matlab….Chúng ta sẽ nghiên cứu cách xử lí hình ảnh từ những ngôn ngữ lập trình này Trên phương diện khảo sát của nhóm, chúng ta sẽ thực hiện khử nhiễu hình ảnh trên Matlab bởi lẽ: nó
là một phần mềm cung cấp một môi trường hoàn hảo về công cụ tính toán cũng như lập trình Người sử dụng có thể thực hiện phép tính toán với ma trận , vẽ đồ
Trang 12imt = imread( 'pic.tif' );
imt= im2double(imt);
imt=imresize(imt,[256,256]);
figure;
imshow(imt);title( 'Ảnh Gốc' )
[X1, U1] = MSVD(imt);
imf = IMSVD(X1,U1);
thị, hàm số và tạo ra những thuật toán riêng cho mình Đồng thời matlab cũng liên kết với nhiều ngôn ngữ lập trình khác thuận tiện cho người
sử dụng
b Về thuật toán Trong Matlab, có rất nhiều phương pháp khác nhau để khử nhiễu hình ảnh như phép biến đổi Fourier hữu hạn, phân tích SVD, phân tích thành phần chính PCA…
Như đã trình bày ở phần 1.1, việc khử nhiễu bằng phân tích SVD sẽ có nhiều ưu điểm thuận lợi, thông qua
việc biến đổi những điểm dữ liệu mới trong không gian,
mà vẫn đảm bảo được hạng của ma trận và kích thước các nhân tử của ma trận trong một giới hạn cho phép Như vậy, nhờ thuật toán đó chúng ta code thể xóa bỏ những “vết nhiễu” của hình ảnh từ đó giúp đầu ra của hình ảnh được chất lượng hơn
3 Quá trình khử nhiễu hình ảnh bằng SVD thông qua Matlab:
Quá trình phân tích SVD cho một file hình ảnh trên matlab trải qua các bước cơ bản như sau
Bước 1: Giả sử, ta có một file âm thanh trong máy (đuôi có thể ở dạng
jpg,tif,png…) ta chèn nó vào matlab Ta chèn và đọc bức ảnh bằng lệnh “imread”
Bước 2: Chuyển ảnh sang dạng double bằng lên “im2double”
Bước 3: Trả về hình ảnh được chọn có tỷ lệ nhân với kích thước của hình ảnh đầu
vào Hình ảnh đầu vào có thể là hình ảnh thang độ xám, RGB, nhị phân hoặc phân
loại – Sử dụng lệnh “imresize”
Bước 4: Xuất ra màn hình ảnh gốc ban đầu – Sử dụng lệnh “figure; imshow” Bước 5: Chúng ta tiến hành phân tích SVD để khử hình ảnh bị nhiễu đó, trên
nguyên tắc mã hóa thành một ma trận gồm các nhân tử để chương trình matlab có thể nhận dạng được, từ đó bắt đầu phân tích SVD để khử nhiễu nó
Ảnh gốc “pic.tif”
Trang 13
Sử dụng:
a) MSVD bằng lệnh “function
[Y,U] = MSVD(x)”
Phân tích SVD ma trận A bởi lệnh
[U,S]= svd(A) Với ma trận A=Q.∑ 𝑃 Gán Q=U, ∑ 𝑃=S
b) IMSVD bằng lệnh
%%%%%%MSVD %%%%
% multiresolution SVD (MSVD)
% input-> x: image (spatial domain)
% outputs-> Y: one level MSVD decomposition
of x
% U: the unitary matrix (U in SVD)
% x=imresize(x,[256,256]);
[m,n] = size(x);
m = m/2; n = n/2;
A = zeros(4,m*n);
for j = 1:n
for i = 1:m
A(:,i + (j-1)*m) =
reshape(x((i-1)*2+(1:2),(j-1)*2+(1:2)),4,1);
end
end
[U,S] = svd(A);
U
S
T = U'*A;
Y.LL = reshape(T(1,:),m,n);
Y.LH = reshape(T(2,:),m,n);
Y.HL = reshape(T(3,:),m,n);
Y.HH = reshape(T(4,:),m,n);
%%%%IMSVD %%%%%
% inverse MSVD (IMSVD)
% Inputs-> Y: MSVD coefficients & U: unitary
matrix (U in SVD)
% output-> x: image (spaitial domain)
[m,n] = size(Y.LL);
mn = m*n;
T1 = zeros(4,mn);
T1(1,:) = reshape((Y.LL),1,mn);
T1(2,:) = reshape((Y.LH),1,mn);
T1(3,:) = reshape((Y.HL),1,mn);
T1(4,:) = reshape((Y.HH),1,mn);
% figure,imshow(Y.LL,[]);
A1 = U * T1;
x1 = zeros(m*2,n*2);
for j = 1:n
for i = 1:m
x1((i-1)*2+(1:2), (j-1)*2+(1:2)) =
reshape(A1(:,i+(j-1)*m),2,2);
end
end
figure,imshow(x1,[]);title( 'Ảnh đã khử
nhiễu' )