1. Trang chủ
  2. » Luận Văn - Báo Cáo

SVD và ứng dụng của SVD trong việc xử lý nhiễu hình ảnh

14 195 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề SVD và Ứng Dụng của SVD trong Việc Xử Lý Nhiễu Hình Ảnh
Người hướng dẫn Nguyễn Xuân Mỹ
Trường học Trường Đại Học Bách Khoa TP.HCM
Chuyên ngành Khoa Học & Ứng Dụng
Thể loại báo cáo bài tập lớn
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 14
Dung lượng 885,57 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA TP HCM KHOA KHOA HỌC ỨNG DỤNG BỘ MÔN TOÁN ỨNG DỤNG BÁO CÁO BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH CHỦ ĐỀ 10 ỨNG DỤNG SVD ĐỂ KHỬ NHIỄU HÌNH ẢNH GV HƯỚN.

Trang 1

ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM

KHOA KHOA HỌC & ỨNG DỤNG

BỘ MÔN TOÁN ỨNG DỤNG

BÁO CÁO BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH

CHỦ ĐỀ 10:

ỨNG DỤNG SVD

ĐỂ KHỬ NHIỄU HÌNH ẢNH

GV HƯỚNG DẪN: NGUYỄN XUÂN MỸ

Lớp DL01_Nhóm 10

Trang 2

Danh sách thành viên:

STT MSSV Họ và tên Ghi chú

1 1835044 Nguyễn Viết Việt Nhóm trưởng

2 1713971 Lê Thành Vinh Tìm tài liệu

3 2115377 Lê Như Ý Phân tích

4 2010786 Lưu Nguyễn Phú Vinh Viết Code

5 1915966 Bùi Sỹ Tuấn Vũ Viết Code

Trang 3

Mục lục

CHƯƠNG I: CƠ SỞ LÝ THUYẾT CỦA PHÂN TÍCH SVD 6

1 Mục tiêu của phân tích suy biến SVD 6

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 7

3 Ví dụ về phân tích SVD của một ma trận bất kì: 9

CHƯƠNG II: ỨNG DỤNG CỦA PHÂN TÍCH SVD TRONG VIỆC KHỬ NHIỄU HÌNH ẢNH 10

1 Đặt vấn đề 10

2 Khử nhiễu hình ảnh thông qua thuật toán phân tích SVD 11

3 Quá trình khử nhiễu hình ảnh bằng SVD thông qua Python 12

4 Chương trình Python 13

Trang 4

LỜI CẢM ƠN

Để hoàn thành đề tài bài tập lớn lần này, trước hết nhóm chúng em xin chân thành cảm ơn sự hướng dẫn, giúp đỡ, quan tâm từ quý thầy cô, bạn bè trong lớp Nhóm đặc biệt cảm ơn cô Trần Xuân Mỹ đã ra sức truyền đạt kiến thức về môn Đại số tuyến tính hỗ trợ chúng em để có thể hoàn thành đề tài này

Cảm ơn sự hợp tác của các thành viên, mọi người đã cùng nhau góp sức để hoàn thành bài báo cáo

Vì còn tồn tại những hạn chế về mặt kiến thức, trong quá trình làm bài chúng

em không tránh khỏi những sai sót, kính mong nhận được sự góp ý của cô và các bạn Điều này sẽ là động lực để nhóm 10 chúng em hoàn thiện hơn

Trang 5

MỞ ĐẦU MÔN HỌC

Đại số tuyến tính là môn học có tầm quan trọng không chỉ đối với sinh viên trường đại học Bách Khoa Thành phố Hồ Chí Minh nói riêng mà còn đối với sinh viên ngành khoa học kỹ thuật, công nghệ nói chung

Đạ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 đượ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…

Trang 6

CHƯƠNG I: CƠ SỞ LÝ THUYẾT CỦA PHÂN TÍCH SVD

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à vector 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

Trang 7

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

Singular 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:

𝐴𝑚× 𝑛 = 𝑄𝑚×𝑚 𝛴𝑚×𝑛(𝑃𝑛×𝑛) 𝑇(1)

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 (1) không là duy nhất, vì ta chỉ cầMn đổ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: m<n

Hình 1: SVD cho ma trận A khi: 𝑚 < 𝑛

▪ TH2: m>n

Hình 2: SVD cho ma trận A khi: 𝑚 > 𝑛

Trang 8

Σ 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

• NGUỒN GỐC SVD

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 (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 đó:

Suy ra

- Các cột của ma trận 𝑄 là những cơ sở của các không gian con riêng của ma trận

𝐴𝐴𝑇 sau khi trực giao hóa Gram - Schmidt 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à những cơ sở của các không gian con riêng của ma trận

của 𝐴𝑇𝐴 sau khi trực giao hóa Gram - Schmidt và các 𝜎12, 𝜎22, … 𝜎𝑟2 là các trị riêng khác 0 của 𝐴𝑇𝐴

Trang 9

- 𝐷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

• COMPACT SVD

Gọi 𝑄 = (𝑞1|𝑞2| … |𝑞𝑚) 𝑣à 𝑃 = (𝑝1|𝑝2| … |𝑝𝑛)

Viết lại biểu thức (1) 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

Rõ 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

Hình 3: 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.

3 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

Trang 10

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 𝐴𝐴𝑇 Sau đó trục giao hóa Gram - Schmidt những cơ sở của không gian con riêng đó 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

Bước 4: 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

Bước 5:Vậy phân tích SVD của ma trận A sẽ là :𝐴𝑚× 𝑛 = 𝑄𝑚×𝑚 𝛴𝑚×𝑛(𝑃𝑛×𝑛) 𝑇

CHƯƠNG II: ỨNG DỤNG CỦA PHÂN TÍCH SVD TRONG

VIỆC KHỬ 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ư: hình ảnh trường ĐHBK TP.HCM, hình ảnh giao thông, hình ảnh thành phố, hình ảnh chân dung con người,…

Hình 4: Hình ảnh TP.HCM về đêm

Trang 11

Có những hình ảnh chúng ta lưu lại tuy nhiên vì những lý do không tên đã làm cho chúng không còn sắc nét, bị giảm chất lượng, và nhiễu… khiến cho người xem rất khó chịu

Hình 5: Hình ảnh bị nhiễu

Như vậy, vấn đề đặt ra là làm sao để khử nhiễu một tập tin ảnh mong muốn

2 Khử nhiễu hình ảnh thông qua thuật toán phân tích SVD

− Hiện nay có rất nhiều ngôn ngữ lập trình có thể xử lý hình ảnh, đặc biệt là chỉnh sửa hình ảnh để mọi người có thể tiếp cận đó là Python, Matlab…Về phương diện khảo sát nhóm, chúng em đã chọn Python bởi lẽ: là một ngôn ngữ cung cấp môi trường hoàn hảo về công cụ tính toán, tốc độ xử lý nhanh, sở hữu lượng lớn các khối cơ sở dữ liệu, phục vụ hiệu quả cho các chương trình mang tính thương mại

− Trong Python, 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 ở trên, 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

Trang 12

phép Như vậy, nhờ thuật toán đó chúng ta có 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 chất lượng hơn

3 Quá trình khử nhiễu hình ảnh bằng SVD thông qua Python

Bước 1: Các thư viện chúng em dùng để phân tích trong bài này là pandas,

matplotlib.pyplot, numpy, imageio,scipy Chèn ảnh đã bị nhiễu bằng lệnh image_path Bước 2: Chuẩn hóa ảnh bị nhiễu bằng mức xám sử dụng lệnh img =

imread(image_path, as_gray=True)

Hình 6: Ảnh được chuẩn hóa

Bước 3: 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 Python có thể nhận dạng được, từ đó bắt đầu phân tích SVD để khử nhiễu nó Phân tích SVD ma trận A bởi lệnh u,

s, vh = np.linalg.svd(img, full_matrices=False)

Bước 4: Trải qua quá trình phân tích ma trận A thành SVD, chọn các điểm trong không gian chính là những điểm nhiễu để xử lí.Sau khi xử lí hoàn tất, ta dùng câu lệnh plt.show() để hiển thị hình ảnh mà ta vừa xử lí, để đối chiếu so sánh

Trang 13

4 Chương trình Python

import pandas as pd

import matplotlib.pyplot as plt

from matplotlib.pyplot import imsave

import numpy as np

from imageio import imread

import scipy

image_path = 'E:\Onedrive\Desktop\DSTT\BTTL\_noise_image.png'

start= 0.5

steps = 0.1

img = imread(image_path, as_gray=True)

plt.imshow(img)

plt.suptitle('Original Image in gray scale')

plt.axis('off')

plt.show()

u, s, vh = np.linalg.svd(img, full_matrices=False)

threshold = start

while (threshold < 1.0):

tmp = len(s)

new_s = s[:]

for i in range (tmp):

j = tmp - i - 1

if (i >= tmp * threshold):

break

new_s[j] = 0.0

denosed = np.array(np.dot(u * new_s, vh), dtype=int)

plt.imshow(denosed)

plt.axis('off')

plt.suptitle(f'threshold: {str(round(threshold,2))}')

plt.show()

imsave(image_path.split('.')[0] +'_'+ str(round(threshold,2))+'_denoised.jpg', denosed) threshold += steps

Trang 14

Nhận xét: Qua quá trình khử nhiễu SVD bằng chương trình Python , ta thấy hình ảnh đã bớt nhiễu, tuy nhiên chất lượng hình ảnh đã giảm đáng kể

Hình 7: Ảnh sau khi đã được khử nhiễu

Ngày đăng: 17/12/2022, 15:01

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w