Các bước nén ảnh được thực hiện như sau: i ảnh siêu âm sẽ được biến đổi Contourlet, ii các hệ số Contourlet sẽ được lọc bớt đi bằng cách so sánh với một giá trị ngưỡng, để tối thiểu hóa
Tổng quan về nén ảnh trong miền Contourlet
Nén ảnh được chia thành hai loại chính là nén ảnh có mất dữ liệu và nén ảnh không mất dữ liệu Ở nén ảnh không mất dữ liệu thì hình ảnh ban đầu có thể được khôi phục một cách chính xác mà không có bất kỳ sự mất mát nào, nhưng nó lại có nhược điểm là tỉ lệ nén thấp
Còn nén ảnh có mất dữ liệu thì ngược lại là có tỉ lệ nén cao nhưng cũng có một số lỗi.Vì vậy những thuật toán của nén ảnh có mất dữ liệu cố gắng loại bỏ những thông tin không quan trọng trong hình ảnh, những thông tin này được loại bỏ thường dựa vào khả năng nhìn của mắt người Đối với nén ảnh có mất dữ liệu, hình ảnh được phân tích bằng cách sử dụng những biến đổi khác nhau, mục đích là để biểu diễn hình ảnh ban đầu theo một cách hiệu quả hơn Biến đổi Contourlet là một trong những biến đổi có định hướng (directional) phổ biến nhất giúp biểu diễn tốt những đường cong trơn Mã hóa hình ảnh với tốc độ bit thấp mà sử dụng biến đổi Contourlet sẽ giúp cho hình ảnh giữ lại được những đặc điểm phù hợp với mắt người hơn Wavelet Tuy nhiên, biến đổi Contourlet lại là một biến đổi dư thừa với cận trên là 4/3 Vì vậy để giảm dư thừa, người ta đã đề xuất ra biến đổi Wavelet-based Contourlet (WBCT) [1] với sự kết hợp của các băng con Wavelet và dàn lọc định hướng DFB, điều này giúp loại bỏ được sự dư thừa nhưng vẫn giữ được khả năng định hướng của biến đổi Contourlet Tuy nhiên, chính vì có sự kết hợp với biến đổi Wavelet nên biến đổi WBCT này cũng có nhược điểm của Wavelet, đó là sự chồng phổ khi giảm mẫu (downsampling) ở những subband có tần số cao.Vì thế, hình ảnh khôi phục lại sau khi qua biến đổi WBCT này có thể bị méo nhiều hơn so với biến đổi Contoutlet ở những vùng hình ảnh đường viền (contour) và hoa văn (texture) [7]
Ngoài ra chúng ta có thể sử dụng cách khác để loại bỏ sự dư thừa của Contourlet, đó là lọc bớt các mẫu không quan trọng đi [3] bằng cách sử dụng một trong ba phương pháp, đó là phương pháp ngưỡng lặp lại (iterative thresholding method), phương pháp theo đuổi tham lam (greedy pursuit method) và phương pháp dựa trên chương trình tuyến tính (linear programming based method) Trong ba phương pháp này thì lấy ngưỡng lặp lại là tốt nhất cả về độ phức tạp tính toán và khả năng loại bỏ các mẫu không quan trọng
Contourlet tuy tốt về mặt xấp xỉ không tuyến tính, tức là sử dụng những hệ số quan trọng nhất để khôi phục lại hình ảnh; nhưng chính khả năng xấp xỉ không tuyến tính này lại gây ra pseudo-Gibbs artifacts [4]
Về giải thuật nén ảnh trong miền Contourlet, hiện nay có nhiều công trình nghiên cứu về vấn đề này.Ở công trình nghiên cứu [5], các tác giả đề xuất một giải thuật nén ảnh trong miền Contourlet dành riêng cho ảnh siêu âm trong y học (medical ultrasound image) Các bước nén ảnh được thực hiện như sau: (i) ảnh siêu âm sẽ được biến đổi Contourlet, (ii) các hệ số Contourlet sẽ được lọc bớt đi bằng cách so sánh với một giá trị ngưỡng, để tối thiểu hóa việc mất thông tin quan trọng thì việc chọn ngưỡng chính là giá trị của hệ số Contourlet xuất hiện nhiều nhất, (iii) lượng tử hóa các hệ số Contourlet đã được lọc bớt đó theo kiểu scalar quantization, tức là mỗi hệ số Contourlet sẽ được lượng tử hóa riêng rẽ với nhau, và (iv) nén các hệ số Contourlet đã được lượng tử hóa bằng thuật toán Huffman Ưu điểm lớn nhất của phương pháp được đề xuất này với trọng tâm là sử dụng một ngưỡng lọc bớt các hệ số Contourlet giúp giảm được nhiễu lốm đốm trên ảnh siêu âm vừa đảm bảo được chất lượng nén
Tuy nhiên, khi tiến hành thí nghiệm, tác giả so sánh phương pháp đề xuất trong miền Contourlet với phương pháp nén bằng thuật toán SPIHT trong miền Wavelet, tác giả sử dụng hình ảnh
HVTH: Phạm Thị Huế 2 siêu âm chứa nhiều đường cong trơn mà bản thân nó đã phù hợp với biến đổi Contourlet hơn là biến đổi Wavelet nên việc tăng PSNR của phương pháp đề xuất trong miền Contourlet hơn so với thuật toán SPIHT trong miền Wavelet cũng chưa thể kết luận ngay được là phương pháp đề xuất này tốt hơn thuật toán SPIHT trong điều kiện hình ảnh không bị nhiễu lốm đốm Hơn nữa, tỉ lệ nén ở đây chỉ khoảng 4-8 lần, tác giả chưa đánh giá được tại những tỉ lệ nén cao hơn thì chất lượng nén của phương pháp đề xuất sẽ như thế nào Ở công trình nghiên cứu [4], các tác giả thực hiện nén ảnh trong miền Contourlet
Phương pháp nén ảnh được thực hiện cơ bản dựa trên việc thay đổi các hệ số Contourlet sao cho entropy của các hệ số là nhỏ nhất Các bước nén ảnh được thực hiện như sau: (i) biến đổi Contourlet ảnh đầu vào, (ii) xây dựng histogram H của các hệ số Contourlet đã được làm tròn xuống thành số nguyên, (iii) histogram H của các hệ số này sẽ được biến đổi thành histogram H’ khác bằng cách sử dụng thuật toán Viterbi, mục đích là để entropy của các hệ số là nhỏ nhất, (iv) các hệ số đã được biến đổi thành histogram H’ này sẽ được chia thành hai phần, đó là (iv- 1) các hệ số có cùng giá trị mà có số lượng nhiều nhất sẽ được lưu lại vị trí bằng một mask, mask này sẽ được nén bằng Run Length Encoding và tiếp theo là adaptive arimetic coding; và (iv-2) các hệ số còn lại được nén bằng arithmetic coding, (v) gộp lại các giá trị của các hệ số có histogram lớn nhất và các dữ liệu đã được nén Ưu điểm lớn nhất của phương pháp này là từ việc thay đổi histogram của các hệ số sẽ giúp giữ lại những chi tiết nhỏ trong hình ảnh, mặt khác cũng khắc phục được hạn chế của thuật nén ảnh dựa trên việc xấp xỉ không tuyến tính (non-linear approximation), đó là hiệu ứng pseudo-Gibbs artifacts ở những chi tiết mà có tần số thấp và vùng smooth của hình ảnh Tuy nhiên, để đạt được PSNR cao hơn 1,31 dB ở bit- rate = 0,25 bpp thì tác giả phải dùng đến biến đổi Contourlet 6 tầng, với số hướng tăng lên gấp đôi ở mỗi tầng tinh hơn (tức là số tầng cao hơn) Với số tầng nhiều như trên thì sẽ tốn thêm nhiều tài nguyên, đặc biệt là tốn nhiều bộ nhớ khi xây dựng trên phần cứng Ở công trình nghiên cứu [2],sau khi loại bỏ một số mẫu Contourlet dư thừa bằng phương pháp lấy ngưỡng lặp lại thì các hệ số trong mỗi subband sẽ được mã hóa bằng bộ mã hóa TCE
Trong 3 loại phụ thuộc giữa các hệ số biến đổi Contourlet (sự phụ thuộc giữa các subband, bên trong mỗi subband và các scale với nhau) thì sự phụ thuộc giữa các hệ số bên trong mỗi subband là lớn nhất, do đó việc dùng bộ mã hóa TCE để mã hóa mỗi subband sẽ giúp tăng tỉ lệ nén
Những thuật toán nén ảnh ở trên không thể tạo ra được chuỗi bit nhúng (embedded bit stream), tức là chuỗi bit mã hóa có thể được cắt ở bất kỳ bit nào mà vẫn có khả năng cho chất lượng ảnh khôi phục là tốt nhất có thể Trong khi hiện nay, nhiều loại thiết bị đầu cuối (terminal) và các node ở những mạng không đồng nhất (heterogeneous network) lại khác nhau về bộ xử lý, bộ nhớ, khả năng hiển thị, phân giải,…; cho nên chất lượng SNR của chuỗi bit mã hóa được cần cũng là khác nhau Muốn tùy chọn khả năng SNR thì ta có thể thực hiện bằng cách truyền lần lượt (progressive transmission) và nhúng thông tin (embedded information) [7] Điều này dẫn đến việc phải tính toán và phân vùng những thông tin quan trọng theo kiểu phân cấp, tức là thông tin nào càng quan trọng thì càng nên ở cấp cao hơn Một số thuật toán thực hiện nén ảnh kiểu này là EZW [8], SPIHT [9], EBCOT [10].Cần chú ý là những thuật toán này đều được xây dựng dựa trên biến đổi Wavelet
Như ta đã biết, biến đổi Contourlet và biến đổi Wavelet có những điểm tương đồng nhất định, chúng đều là biến đổi tạo ra những subband phân cấp.Vì vậy, một số thuật toán nén ảnh sử dụng ở miền Wavelet cũng có khả năng sử dụng được ở miền Contourlet với một số điều chỉnh nhỏ cho phù hợp hơn với Contourlet Chính vì vậy, hiện nay có nhiều công trình nghiên cứu trên thế giới về nén ảnh trong miền Contourlet đi theo xu hướng điều chỉnh thuật toán nén
HVTH: Phạm Thị Huế 3 ảnh trong Wavelet Trong các thuật toán này thì SPIHT được lựa chọn khá nhiều do nó là thuật toán cải tiến của EZW và có độ phức tạp tính toán nhỏ hơn EBCOT.Một số công trình tiêu biểu như [3], [7] và [11]
SPIHT là một thuật toán nén ảnh nhanh và hiệu quả dựa trên phương pháp phân vùng trên cây phân lớp (Set Partitioning In Hierarchical Trees, viết tắt là SPIHT) Nó chú trọng vào quá trình truyền các hệ số đi, các hệ số quan trọng sẽ được truyền đi trước (mức độ quan trọng dựa vào giá trị các hệ số, hệ số nào có giá trị càng lớn thì càng quan trọng).Nhờ vậy mà dù chỉ có một số lượng ít các hệ số ta vẫn có thể khôi phục lại được hình ảnh Để việc truyền các hệ số quan trọng đi trước được thuận lợi thì các hệ số được sắp xếp theo biên độ Các hệ số này sẽ được phân vùng bằng cách sử dụng một cây được gọi là spatial orientation trees để giữ các hệ số không quan trọng lại cùng nhau trong các tập phụ
Thuật toán SPIHT dễ dàng thực hiện trên phần mềm nhưng lại không phù hợp khi thực thi phần cứng [12] do phải sử dụng nhiều danh sách (list), điều này gây ra hậu quả là phải phụ thuộc vào biến và dữ liệu, đòi hỏi nhiều bộ nhớ, lại cần phải quản lý bộ nhớ như danh sách các node được thêm vào, di chuyển hay loại bỏ đi Mặt khác, SPIHT cũng có nhiều toán tử lặp trong mỗi một lần quét, đó là do các tập hợp cần phải được kiểm tra xem có phải là tập hợp chứa các pixel quan trọng hay không.Khi giá trị ngưỡng thay đổi thì việc kiểm tra cũng cần phải được tiến hành lại Để khắc phục nhược điểm của SPIHT, Frederick W Wheder và William A Pearlman đã đề xuất thuật nén ảnh No Lists SPIHT [13].Ở thuật toán này thì các hệ số quan trọng vẫn được sắp xếp trước, nhưng các danh sách sẽ được thay thế bằng một bảng trạng thái.Điều này sẽ giúp tránh được việc quét lặp lại.
Chi tiết một số công trình trên thế giới về nén ảnh bằng SPIHT trong miền Wavelet và
Nén ảnh bằng SPIHT trong miền Wavelet [9]
Hiện nay, một trong những phương pháp nén ảnh phổ biến nhất là sử dụng thuật toán nén ảnh SPIHT trong miền Wavelet Thật ra, thuật toán SPIHT do Amir Said và Pearlman tạo ra chính là để nén trong miền Wavelet Tuy nhiên, miền Wavelet và Contourlet lại có nhiều điểm tương đồng nên ta cũng có thể dùng SPIHT để nén trong miền Contourlet.Vì vậy, muốn áp dụng được SPIHT trong miền Contourlet thì ta phải hiểu cách SPIHT thực hiện trong miền Wavelet trước đã
Các bước thực hiện việc nén ảnh trên miền Wavelet chỉ gồm hai bước đơn giản như sau:
- Bước 1: biến đổi Wavelet ảnh đầu vào
- Bước 2: thực hiện nén bằng SPIHT các hệ số Wavelet
Biê n đ ộ nh ỏ n hấ t Original image
Hình 1: Các bước thực hiện nén ảnh trong miền Wavelet [9]
Nén ảnh bằng SPIHT trong miền Contourlet
1.2.2.1 Nén ảnh bằng thuật toán SPIHT điều chỉnh trong miền Contourlet đã được bỏ bớt hệ số
Giải thuật này đề nghị bởi tác giả Tan Peipei, Wei Zhao trong bài báo "Image coding based on sparsified Contourlet and adjusted SPIHT" Signal Processing (ICSP), 2012 IEEE 11th International Conference on Vol 2.IEEE, 2012 [3]
Theo bài báo này, việc thực hiện nén ảnh bằng thuật toán SPIHT đã được điều chỉnh trong miền Contourlet được thực hiện như sau:
Sparse contourlet using Itetive thresholding spiht
Lowpass level 3 b an d pa ss le ve l 3 b an d pa ss le ve l 2 bandpass level 1
Hình 2: Các bước thực hiện nén ảnh ở [3]
- Bước 1: Biến đổi Contourlet ảnh đầu vào Biến đổi này thực hiện với 3 tầng và số hướng ở mỗi mức là 4, 8 và 16 hướng tương ứng với mỗi tầng đầu vào
- Bước 2: Sparse Contourlet using Itetive thresholding: Do biến đổi Contourlet là một biến đổi quá mẫu nên việc các tác giả dùng biến đổi Sparsified Contourlet sẽ giúp giảm đi một số lượng
HVTH: Phạm Thị Huế 6 mẫu dư thừa, biến đổi Sparsified Contourlet này chỉ cần số lượng hệ số biến đổi ít hơn rất nhiều so với biến đổi Contourlet đơn thuần mà vẫn đạt được cùng một chất lượng hình ảnh khôi phục
Hơn nữa, trong các phương pháp biến đổi Sparsified Contourlet thì itetive thresholding (phương pháp lấy ngưỡng lặp) mà các tác giả sử dụng là có độ phức tạp tính toán ít hơn hai phương pháp còn lại (greedy pursuit và linear programming based method)
Hình 3: Cấu trúc cây Spatial Orientation Tree trong miền Contourlet [3]
Phương pháp lấy ngưỡng lặp: lọc bớt các hệ số Contourlet bằng cách áp dụng phương pháp lấy ngưỡng lặp (iterative threshoding) để tạo thành biến đổi sparsified Contourlet
Với k là chỉ số lặp lại X là vector ảnh Y là vector hệ số Contourlet
là ma trận biến đổi Contourlet
là ma trận biến đổi Contourlet ngược
HVTH: Phạm Thị Huế 7 S(x,T) là hàm lấy ngưỡng lặp: S(x,T)max(|x|T,0).x/|x| (2)
Ngưỡng T được xác định bởi một giá trị nào đó để lỗi lượng tử e có thể chấp nhận được
- Bước 3: nén các hệ số Contourlet lại bằng thuật toán SPIHT điều chỉnh: sử dụng thuật toán SPIHT với cây Spatial Orientation Tree điều chỉnh mối quan hệ cha con như hình [3] Ưu điểm của việc dùng phương pháp này để nén ảnh trong miền SPIHT là đã loại bỏ được bớt số lượng hệ số Contourlet dư thừa mà vẫn giữ được ưu điểm của biến đổi Contourlet
Tuy nhiên, cũng chính vì sử dụng thêm phương pháp lấy ngưỡng lặp để lọc bớt hệ số Contourlet, mà độ phức tạp tính toán của phương pháp mã hóa lại tập trung ở đây nên nó khiến cho phương pháp nén ảnh này có độ phức tạp cao hơn đang kể so với phương pháp nén dựa trên Wavelet và Contourlet đơn thuần [2] Điều đó dẫn đến sự không thích hợp của nó khi làm trên phần cứng
1.2.2.2 Contourlet image coding based on adjusted SPIHT [7]
Giải thuật này được đề nghị bởi tác giả Haohao Song, Songyu Yu, Li Song, Hongkai Xiong, trong bài báo “Contourlet image coding based on adjusted SPIHT”, Advances in Multimedia Information Processing (PCM), 2005
Trong công trình nghiên cứu này, Haohao Song cùng các cộng sự đã đề xuất nén ảnh bằng thuật toán SPIHT có điều chỉnh cho phù hợp với biến đổi Contourlet Có 3 sự điều chỉnh đã được thực hiện: (i) đối với các subband bandpass, vì thuật toán SPIHT nhấn mạnh việc truyền các hệ số quan trọng đi trước nên các tác giả đã sắp xếp lại vị trí các subband theo độ quan trọng, theo đó subband nào có càng nhiều hệ số quan trọng thì càng được mã hóa trước;
(ii) đối với các subband lowpass, các tác giả cũng tiến hành phân chia subband này thành các subband nhỏ với tần số ảo; và (iii) LIS process thuộc sorting pass chỉ được kiểm tra khi mức lượng tử giảm từ n1 xuống n2, với n1 là giá trị bit-plane cao nhất của các hệ số lowpass, còn n2 là giá trị bit-plane cao nhất của các hệ số bandpass
Các bước thực hiện thuật nén SPIHT điều chỉnh:
- Bước 1: ảnh đầu vào được biến đổi Contourlet sử dụng hai bộ lọc là 9/7 và pkva Biến đổi Contourlet được phân tích thành 4 tầng, mỗi tầng có 16 hướng Sau khi phân tích ta được kết quả gồm có 1 ma trận lowpass và 16 ma trận subband bandpass ở mỗi level
- Bước 2: xây dựng subband lowpass ảo Ma trận chứa các hệ số Contourlet ở ảnh lowpass sẽ được biến đổi thành 16 subband tần số thấp ảo Subband tần số thấp ảo này có cùng kích cỡ và cũng chứa các pixels giống như ma trận lowpass ban đầu, nhưng nó được phân vùng thành 16 subband con Mục đích của việc phân chia các hệ số ở lowpass thành 16 subband ảo giống vị trí của 16 bandpass là để dễ dàng tạo mối liên hệ cha-con khi lập cây spatial orientation tree
Việc có cả các hệ số của lowpass tham gia tạo thành cây sẽ khiến cây càng cao, từ đó dẫn đến độ nén càng cao
- Bước 3: sắp xếp lại các subband bandpass theo độ quan trọng Subband nào có càng nhiều hệ số quan trọng thì subband đó càng quan trọng nên sẽ được xếp lên trước Sắp xếp lại sẽ giúp các hệ số quan trọng sẽ được mã hoá nhiều nhất có thể khi bitstream bị cắt ở bất kỳ điểm nào Để xác định độ quan trọng của subband thì ta so sánh các hệ số trong các subband đó với một giá trị ngưỡng, nếu càng có nhiều hệ số lớn hơn giá trị ngưỡng thì subband đó càng quan trọng
HVTH: Phạm Thị Huế 8 Về giá trị chọn làm ngưỡng thì thông thường, khi so sánh với một giá trị ngưỡng cao, nếu một subband có nhiều hệ số quan trọng hơn subband khác thì khi so với một giá trị ngưỡng thấp, nó cũng sẽ có nhiều hệ số quan trọng hơn các subband khác Bằng việc test nhiều hình ảnh, các tác giả đã chỉ ra rằng với ngưỡng = 32 thì thứ tự quan trọng của các subband là không thay đổi
Hình 4: Các bước thực hiện nén ảnh ở [7]
- Bước 4: nén bằng thuật toán SPIHT điều chỉnh Phần lowpass và bandpass sau khi được tách ra xử lý xong thì sẽ được gộp lại để tạo thành cây Spatial Orientation Tree Thuật toán SPIHT điều chỉnh ở hai chỗ: (i) bước quantization có hai mức ngưỡng là n1 và n2, với n1 là giá trị bit- plane cao nhất của các hệ số lowpass, n2 là giá trị bit-plane cao nhất của các hệ số bandpass,
HVTH: Phạm Thị Huế 9 chứ không phải chỉ có một mức ngưỡng n1 như SPIHT truyền thống; và (ii) bước sorting pass: danh sách LIS chỉ được kiểm tra khi n1 giảm đến giá trị n2, chứ không cần kiểm tra với các mức lượng tử ở giữa n1 và n2 giống như SPIHT truyền thống Ưu điểm của phương pháp nén ảnh này là đã xây dựng được bước tiền xử lý các hệ số Contourlet để điều chỉnh sao cho thuật toán SPIHT phù hợp hơn với biến đổi Contourlet, ví dụ như tận dụng được tất cả các hệ số Contourlet khi xây dựng cây Spatial Orientation Tree, bớt được một số bit mã hóa khi dùng đến hai mức lượng tử,… Tuy nhiên, việc cho toàn bộ các hệ số ở ảnh lowpass vào trong danh sách các pixel không quan trọng LIP khi thực hiện thuật nén ảnh SPIHT, nếu thực hiện như vậy trên phần cứng thì sẽ không thuận lợi do phải lưu nhiều giá trị một lần và thực hiện tính toán nhiều lần với nhiều giá trị đó
1.2.2.3 Nén ảnh bằng thuật toán SPIHT điều chỉnh ở trong miền
Biến đổi Contourlet
Phân tích Laplacian Pyramid
Phân tích multiscale sử dụng Laplacian Pyramid (LP) đƣợc giới thiệu bởi Burt và Adelson.Phõn tớch LP ở mỗi mức sẽ tạo ra phần lowpass của ảnh gốc với kớch thước bằng ẵ ảnh gốc và sự khác nhau giữa phần lowpass và ảnh gốc là ảnh bandpass có kích thước bằng ảnh gốc
Hình 7: Phân tích Laplacian Pyramid
Hình trên mô tả cách thực hiện việc phân tích LP: Đầu tiên, ta lấy xấp xỉ thô a của tín hiệu ban đầu x bằng cách lọc thông thấp H và hạ mẫu M Dựa trên phiên bản thô, chúng ta dự đoán tín hiệu ban đầu bằng cách tăng mẫu và lọc thông thấp, sau đó tính toán chênh lệch giữa tín hiệu ban đầu và tín hiệu dự đoán ta có được phần chi tiết b của ảnh Thông thường để xây dựng lại tín hiệu gốc, ta kết hợp phần chi tiết b với phần xấp xỉ thô a
Phân tích DFB
Cấu trúc của bộ phân tích DFB cơ bản dựa trên dàn lọc Quincunx (QFB) và bộ lọc Fan filter [6]
Dàn lọc này có thể là một trong hai ma trận Q0 hoặc Q1:
Các ma trận này vừa có tác dụng giảm mẫu, vừa có tác dụng quay ảnh đầu vào một góc 45 độhoặc−45 độ theo hướng dọc
Bộ lọc Fan filter có thể là một trong hai bộ lọc H0 hoặc H1.Trong đó, H0 là bộ lọc phân tích thông thấp, còn H1 là bộ lọc phân tích thông cao của loại bộ lọc mà ta dùng cho phân tích DFB Đối với DFB tầng 1 và tầng 2, sơ đồ của DFB là :
Hình 8: Hai tầng đầu tiên của DFB
Phân tích DFB từ mức thứ ba, để đạt được mức phân chia tần số nhỏ hơn, dàn lọc quincunx sẽ được kết hợp với toán tử resampling R Có bốn loại resampling cho QFB, đó là R0, R1, R2 và R3.Trong đú, hai loại resampling cho QFB là R0 và R1 sẽ được sử dụng cho ẵ số kênh DFB ở phía trên, làm cho ảnh đầu vào quay một góc 45 độ hoặc -45 độ theo hướng dọc Cũn hai loại resampling cho QFB là R2 và R3 sẽ được sử dụng cho ẵ số kờnh DFB ở phía dưới, làm cho ảnh đầu vào quay một góc 45 độ hoặc -45 độ theo hướng còn lại, tức là hướng ngang
Hình 9: Phân tích DFB 4 tầng
Hình 10: Ví dụ về 2 toán tử Q0 và Q1
Hình 11: Ví dụ về 4 toán tử R0, R1, R2 và R3
Giải thuật nén ảnh SPIHT
Tổng quan về giải thuật nén ảnh SPIHT
Thuật toán nén ảnh SPIHT được dùng trong trường hợp nén ảnh có mất mát.Nó dùng để nén các hệ số sau khi đã qua biến đổi unitary hierarchical subband transform, ví dụ như Wavelet Để nén ảnh ta có thể chỉ dùng thuật toán nén SPIHT, hoặc cũng có thể kết hợp SPIHT với một thuật toán nén khác, ví dụ như arithmetic coding Ưu điểm khi kết hợp 2 phương pháp nén là sẽ giúp giảm sai số bình phương trung bình MSE, tức là tăng PSNR từ 0.3-0.6 dB; tuy nhiên như vậy thì độ phức tạp tính toán sẽ tăng lên, thời gian thực hiện mã hóa và giải mã cũng sẽ lâu hơn [4]
Về cơ bản thì thuật toán nén SPIHT sẽ nén các hệ số đã qua biến đổi bằng cách loại bỏ bớt các hệ số mà có biên độ nhỏ, đồng thời bỏ bớt những bit có trọng số thấp (LSB) của các hệ số có biên độ cao Như vậy, khi khôi phục lại thì tất cả các hệ số được khôi phục sẽ có giá trị xấp xỉ giá trị ban đầu Việc loại bỏ bao nhiêu số hệ số có biên độ nhỏ và bỏ bao nhiêu số bit có trọng số thấp là do ta lựa chọn, như vậy tức là ta có thể chọn tỉ lệ nén như mong muốn
Khi ta dùng phương thức truyền lần lượt (progressive image transmission) thì điều quan trọng là làm sao truyền đi được những thông tin quan trọng nhất, nhờ thế sẽ giảm được độ méo là nhiều nhất Việc lựa chọn thông tin quan trọng nhất có thể dựa theo một số tiêu chí khác nhau Một trong số đó là việc dựa vào việc đo độ méo theo sai số bình phương trung bình Mean Squared-error (MSE):
Với N là số lượng hệ số của ảnh, p i , j là giá trị hệ số (i,j) của ảnh, p i , j
^ là giá trị ước lượng của hệ số p i , j
Từ công thức trên ta thấy rằng hai hệ số mà có giá trị bằng nhau thì sai số MSE cũng sẽ bằng nhau, và nếu hệ số c i , j được gửi giá trị chính xác đến bộ giải mã thì sai số MSE sẽ giảm đi |c i , j | 2 /N
Điều này cho ta thấy rằng những hệ số mà biên độ càng lớn thì càng nên truyền đi trước bởi vì chúng có khả năng giảm được độ méo nhiều hơn Mở rộng điều này, ta có thể thấy rằng đối với từng hệ số được truyền đi dưới dạng nhị phân thì ta cũng nên truyền những bit có trọng số lớn hơn đi trước (most significant bits MSB)
Như vậy, ý tưởng chính của thuật toán SPIHT gồm 2 điểm chính, đó là (1) sắp xếp lại các hệ số theo biên độ, như vậy các hệ số có biên độ lớn sẽ được mã hóa trước; và (2) mã hóa các bit MSB của các hệ số có biên độ lớn trước
Hai điểm này được diễn giải cụ thể như sau:
(1) Sắp xếp lại các hệ số theo biên độ: các hệ số sẽ được sắp xếp theo thứ tự từ biên độ lớn đến nhỏ theo từng nhóm trong nhiều lần lặp, cứ một lần lặp thì sẽ sắp một nhóm các hệ số có biên độ từ 2 đến n 2 n 1 VD các hệ số sau khi biến đổi của một ảnh có biên độ dao động từ 0 đến (2 -1) thì ở lần lặp đầu tiên sẽ sắp xếp cho nhóm 1 lên trước gồm các hệ số có biên độ từ 8 2 đến (7 2 - 1), ở lần lặp thứ hai sẽ cho nhóm 2 xếp sau nhóm 1 gồm các hệ số có biên độ từ 8 2 đến (6 2 -1), và cứ sắp xếp các nhóm như vậy cho đến khi có đủ số hệ số quan trọng mà ta 7 mong muốn
(2) Mã hóa các bit MSB của các hệ số có biên độ lớn trước: ta vừa sắp xếp các hệ số theo biên độ vừa mã hóa các bit MSB của các hệ số lớn trước VD các hệ số sau khi biến đổi của một ảnh có biên độ dao động từ 0-(2 - 1) thì ở lần lặp đầu tiên sẽ sắp xếp cho nhóm 1 gồm 8 các hệ số có biên độ từ 2 đến ( 7 2 -1) lên trước, đồng thời truyền đi các bit thứ 8 của các hệ số 8 ở nhóm 1 này; ở lần lặp thứ hai sẽ cho nhóm 2 gồm các hệ số có biên độ từ 2 đến ( 6 2 -1) xếp 7 sau nhóm 1, đồng thời truyền đi các bit thứ 7 của các hệ số ở cả nhóm 1 và 2; và cứ sắp xếp và truyền các bit MSB của các hệ số ở các nhóm như vậy cho đến khi có đủ lượng bit mà ta mong muốn
Việc sắp xếp các hệ số từ lớn đến nhỏ theo từng nhóm trong nhiều lần lặp song song với việc truyền các bit MSB đi trước dẫn đến hệ quả là ta có thể chọn tỉ lệ nén ảnh thông qua số lần lặp cho việc sắp xếp và mã hóa số bit MSB Nếu số lần lặp càng nhiều thì số lượng nhóm của các hệ số được sắp xếp sẽ càng nhiều và càng nhiều bit MSB được mã hóa, như vậy tỉ lệ nén sẽ giảm; và ngược lại Tuy chỉ truyền một số lượng ít các bit của các hệ số ban đầu nhưng chất lượng ảnh sau khi khôi phục lại vẫn đạt chất lượng tốt do nửa số bit được truyền đi là những bit quan trọng, những bit này giúp khôi phục lại được các hệ số ban đầu với sai số MSE nhỏ
Như vậy, tóm lại thuật toán SPIH là một thuật toán nén ảnh nhanh và hiệu quả Nó có hai điểm đặc biệt là (i) mã hóa các hệ số quan trọng trước (dựa vào giá trị các hệ số, hệ số nào
HVTH: Phạm Thị Huế 16 có giá trị càng lớn thì càng quan trọng), nhờ vậy mà dù chỉ có một số lượng ít các hệ số ta vẫn có thể khôi phục lại được hình ảnh; (ii) trong một lượt mã hóa thì không phải mã hóa hết hệ số này rồi mới đến hệ số kia, mà là mã hóa đồng thời bit thứ n MSB (most significant bit) của tất cả các hệ số Khi dùng thuật toán này để nén ảnh thì ta có thể chọn tỉ lệ nén như mong muốn, tất nhiên cái giá phải trả là tỉ lệ nén càng cao thì sai số giữa ảnh khôi phục và ảnh ban đầu sẽ càng lớn Thông thường, những hình ảnh chất lượng tốt có thể được khôi phục khi chỉ cần một phần tương đối nhỏ các pixel được truyền đi, ví dụ với ảnh Barbara chuẩn 8 bpp, cỡ 512x512 thì chỉ cần nén với bit-rate = 0,25 bpp.
Cách thực hiện thuật toán SPIHT
Thuật nén SPIHT gồm 4 bước là: khởi tạo, sorting pass, refinement pass và quantization-step update Ta có thể miêu tả tóm tắt thuật toán dưới dạng sơ đồ như sau:
Hình 12: Ý tưởng của thuật toán nén ảnh SPIHT Ý tưởng của thuật toán nén ảnh SPIHT bắt nguồn từ thuật toán EZW [8], với bước đệm là sử dụng một cây được gọi là spatial orientation trees, cây này dựa trên giả thuyết là nếu một hệ số biến đổi ở mức thô (coarse scale), tức là node cha ở trên cây là không quan trọng (nhỏ hơn giá trị ngưỡng) thì tất cả các hệ số mà ở vùng không gian giống như hệ số đó mà ở trên subband ở mức tinh hơn (finer scale), tức là các node con, cháu, chắt,… trên cây thì cũng không quan trọng Thực tế chỉ ra rằng giả thuyết này thường là đúng bởi vì các hệ số có sự tự tương quan giữa các subband Tức là đối với những hệ số đã qua biến đổi unitary hierarchical subband transform thì mỗi một hệ số ở scale đã cho sẽ liên quan tới một tập các hệ số ở finer scale mà ở cùng hướng
Cây Spatial Orientation Trees được tạo như sau:
Giả sử ta có các hệ số đã qua biến đổi unitary hierarchical subband transform nằm ở các subband như trong hình vẽ, hệ số nào ở mức thô nhất thì sẽ là node cha (các hệ số nằm ở subband I), hệ số nào ở mức tinh hơn thì sẽ là node con (các hệ số ở subband II, III, IV), còn các hệ số ở mức tinh hơn nữa thì sẽ là node cháu, chắt,… Mỗi node cha sẽ luôn có 2x2 node con hoặc là không có node con nào Các node sẽ được chia vào các tập hợp như sau:
+ Tập O(i,j): là tập các tọa độ của node con của hệ số có tọa độ (i,j) Mỗi node sẽ có 4 node con hoặc không có node con nào VD tập O(0,1) bao gồm tọa độ của các hệ số b1, b2, b3 và b4
+ Tập D(i,j): là tập bao gồm tất cả các con, cháu, chắt,… của hệ số có tọa độ (i,j).VD D(0,1) bao gồm tọa độ của các hệ số b1…b4, b11…b14…b44
+ Tập H: là tập của tất cả các node gốc – là band I trên hình vẽ
+ Tập L(i,j): là tập các cháu, chắt,… (không có con) của node có tọa độ (i,j)
Khi thực hiện thuật toán, tác giả dùng ba danh sách để biểu thị việc sắp xếp cây Spatial Orientation Trees, đó là danh sách các hệ số quan trọng LSP, danh sách các hệ số không quan trọng LIP và danh sách các nhóm hệ số không quan trọng LIS LSP và LIP sẽ chứa tọa độ của các node riêng lẻ, còn LIS sẽ chứa các tọa độ của node con cháu chắt… được biểu diễn qua tập D của các node cha
Như vậy, ý tưởng của thuật toán nén ảnh SPIHT có thể được biểu diễn tương đương ở trên thông qua các danh sách như sau:
Hình 13: Cách thực hiện thuật toán SPIHT
Ví dụ về cách thực hiện thuật toán SPIHT trong miền Wavelet
Giả sử ta có các hệ số biến đổi Wavelet như sau:
Ta tiến hành mã hóa qua 3 pass và tạo ra chuỗi bit để truyền đi; sau đó tiến hành giải mã từ các bit này
Sorting pass: n = 4 => giá trị ngưỡng = 2 4 = 16
Hệ số ở tọa độ (0,0) = 26 >2 4 hệ số ở tọa độ này là quan trọng truyền bit 1, tiếp theo là bit 1 để chứng tỏ hệ số này là dương và chuyển tọa độ đến LSP Ba hệ số còn lại là không quan trọng truyền 3 bit 0 và vẫn để chúng ở LIP
Kiểm tra các con cháu chắt… của tọa độ (0,1) (tức là 13, 10, 6 và 4) tất cả đều không quan trọng truyền 1 bit 0 Tương tự, con cháu chắt… của tọa độ (1,0) và (1,1) đều không quan trọng truyền 2 bit 0
Refinement pass: không có phần tử nào nên không làm gì
Qua bước first pass ta truyền đi 8 bit: 11 000 000 Quantization-step update: giảm n đi 1: n=3
Giá trị ngưỡng 2 n 2 3 8 LIP: cả 3 hệ số đều không quan trọng truyền 3 bit 0
HVTH: Phạm Thị Huế 21 Đầu tiên kiểm tra con cháu chắt,…của tọa độ (0,1) hai hệ số 13 và 10 lớn hơn giá trị ngưỡng nên chúng quan trọng, tức là D(0,1) là quan trọng ta gửi đi 1 bit 1 và kiểm tra con của tọa độ (0,1), tức là O(0,1) Con đầu tiên có giá trị là 13 quan trọng và dương gửi đi 1 bit 1 và 1 bit dấu 1; con thứ 2 cũng tương tự gửi đi 1 bit 1 và 1 bit 1; ta chuyển tọa độ của 2 con đến LSP; 2 node con tiếp theo đều không quan trọng gửi đi 2 bit 0 và chuyển chúng đến LIP Vì L ( 0 , 1 ) nên ta loại D(0,1) ra khỏi LIS Tương tự với D(1,0)và D(1,1), ta thấy các phần tử đều không quan trọng gửi đi 2 bit 0
LSP từ pass trước: chỉ có 1 phần tử có hệ số là 26 MSB thứ 3 của 26 là 1 truyền bit 1
Qua bước second pass ta truyền đi 13 bit: 000 11111 00 1
Quantization-step update: giảm n đi 1: n=2
HVTH: Phạm Thị Huế 22 Ngưỡng n2 2 4
Cách làm tương tự trên, chuỗi bit sẽ là: 10111010101101100110000010
Danh sách được cập nhật lại là:
Giá trị được truyền đi ở first pass: n = 4 và chuỗi bit 11000000
Ta giả sử rằng giá trị ban đầu của n được truyền đến bộ giải mã (n=4), nhờ đó ta thiết lập được giá trị ngưỡng ban đầu là 16 Chuỗi bit được truyền đi ở first pass là 11 000 000, như vậy hệ số đầu tiên của LIP là quan trọng và dương, còn lại tất cả các hệ số khác đều không quan trọng Hệ số quan trọng được khôi phục sẽ có giá trị được tính là 2 n 2 n 1 2 4 2 3 24
Như vậy qua first pass, các hệ số được khôi phục lại là:
Danh sách các tập hợp được cập nhật lại như sau:
Giảm n đi 1 (n=3) và xem xét chuỗi bit được truyền đi 000 11111 00 00 1 Từ việc 3 bit đầu tiên là 0 và chỉ có 3 phần tử trong LIP nên tất cả các phần tử ở LIP đều là không quan trọng Các bit tiếp theo nói lên thông tin ở trong tập LIS
Bit tiếp theo là 1=> tập hợp có node gốc ở tọa độ (0,1) là quan trọng, theo danh sách LIS thì tập này là loại D nên giá trị hệ số được giải mã tiếp theo sẽ là node con của (0,1)
Bit tiếp theo là 111100 chứng tỏ hai con đầu tiên của (0,1) là quan trọng và dương, còn 2 con sau thì không quan trọng Do đó, ta chuyển hai con đầu tiên đến LSP và 2 con sau đến
LIP Giá trị của hai hệ số quan trọng này được khôi phục đều là 2 3 2 2 12 Ta chuyển
Hai bit tiếp theo là 00 chứng tỏ là hai tập tiếp theo trong LIS là không quan trọng
Bit cuối cùng tương ứng với bước refinement pass có giá trị là 1, ta cập nhật giá trị khôi phục của hệ số ở tọa độ (0,0) là 242 3 1 28
Như vậy các hệ số khôi phục qua bước second pass là:
Và các danh sách được cập nhật lại là:
Giảm n đi 1 (n=2), như vậy giá trị ngưỡng là 4 Giải mã chuỗi bit được truyền ở third pass (10111010101101100110000010) ta cập nhật được các hệ số khôi phục có giá trị như sau:
Và danh sách được cập nhật là: Ở third pass, tập LIS không còn phần tử nào nên ta chỉ đơn giản cập nhật giá trị của các hệ số.
Ví dụ về cách thực hiện SPIHT trong miền Contourlet
Giả sử ta có các hệ số biến đổi Contourlet 2 levels, mỗi level có 4 hướng như sau:
Ta tiến hành mã hóa qua 2 pass và tạo ra chuỗi bit để truyền đi; sau đó tiến hành giải mã từ các bit này
Cần chú ý là độ dài của chuỗi bit mã hóa sẽ khác nhau, tức là tỉ lệ nén sẽ khác nhau, nếu như ta lựa chọn cây Spatial Orientation Tree khác nhau Ở trong ví dụ này, ta chọn cây Spatial Orientation Tree như sau:
Tất cả mỗi hệ số Contourlet đều có 4 node con.Các hệ số Contourlet a, b, c, d là các node gốc Node a có 4 con là {a1, a2, a3, a4}, node con a1 có 4 node cháu là {a11, a12, a13, a14} Tương tự với các node khác
Sorting pass – LIP Process: giá trị ngưỡng = 128
Các hệ số ở tọa độ (0,0) và (0,1) có giá trị nhỏ hơn ngưỡng nên không quan trọng -> truyền đi một bit 0 cho mỗi tọa độ Tiếp theo hệ số ở tọa độ (1,0) quan trọng -> truyền đi một bit 1 để chứng tỏ là hệ số quan trọng và một bit 1 nữa để biểu thị hệ số này là dương; đồng thời ta chuyển hệ số này sang LSP Hệ số cuối cùng không quan trọng -> truyền đi một bit 0 Hệ số nào không quan trọng thì vẫn để ở LIP
Tất cả các con, cháu của cả bốn node gốc đều nhỏ hơn ngưỡng -> ta truyền đi 4 bit 0
Do không có hệ số nào nên không làm gì cả
Qua bước first pass ta truyền đi 9 bit: 00110 0000
Khởi tạo: 3 danh sách được cập nhật lại như sau:
Giá trị ngưỡng 2 n 2 6 64 Sorting pass – LIP:
Do cả ba hệ số trong LIP đều lớn hơn ngưỡng 64 -> ta truyền đi hai bit 1 cho mỗi hệ số Sorting pass – LIS process:
HVTH: Phạm Thị Huế 29 Ba tập phụ còn lại (0,1)D, (1,0)D, (1,1)D đều không quan trọng -> truyền đi 3 bit 0
Ta xét tiếp tập các node cháu của tọa độ (0,0), tức là (0,0)L -> tập này có giá trị lớn nhất là 134 lớn hơn ngưỡng -> truyền đi một bit 1 để chứng tỏ là tập này quan trọng và chuyển (0,0)L thành tọa độ của bốn node con loại D, tức là (2,0)D, (2,1)D, (3,0)D,(3,1)D
Tiếp tục xét tập (2,0)D -> tập này quan trọng -> truyền đi một bit 1 Hai node con đầu tiên của tập này không quan trọng -> truyền đi hai bit 0, còn hai node con sau quan trọng và dương -> truyền đi bốn bit 1 và loại (2,0)D ra khỏi LIS
Tương tự với tập (2,1)D -> ta truyền đi bảy bit là 1 00 1111; tập (3,0)D -> chín bit 1 11 11 11 11; tập (3,1)D -> chín bit 1 11 11 11 11 Ta loại cả 3 tập này khỏi LIS
Danh sách LSP ở first pass chỉ gồm một hệ số là (1,0) -> 142 Bit ở vị trí thứ 6 của giá trị 142 là 1 -> ta truyền một bit 1 đi
Như vậy sau bước second pass ta truyền đi 52 bit là 111111 111111111000 1 1001111 1001111 111111111 111111111 1
Khởi tạo: n=7 Sorting pass – LIP process:
HVTH: Phạm Thị Huế 30 Giá trị n ban đầu được truyền đến bộ giải mã (n=7) ->giá trị ngưỡng = 128 Chuỗi bit được truyền ở first pass là 00110 0000, như vậy hai hệ số đầu tiên ở LIP là không quan trọng, bit thứ 3 và 4 là 11 chứng tỏ hệ số thứ 3 là quan trọng và dương, ta chuyển hệ số (1,0) này sang LSP với giá trị được khôi phục ban đầu là 2 7 2 6 192
Các bit còn lại đều là 0 -> chứng tỏ các hệ số còn lại đều không quan trọng
Ba danh sách được cập nhật lại là:
Chuỗi bit truyền tiếp theo là 111111 -> chứng tỏ cả ba hệ số ở danh sách LIP đều quan trọng và dương -> ta chuyển ba hệ số này sang LSP với cùng giá trị khôi phục là 2 6 2 5 96Sorting pass – LIS process:
HVTH: Phạm Thị Huế 31 Chuỗi bit tiếp theo được truyền đi là 1 11111111 000 Bit đầu tiên là 1 -> chứng tỏ phần tử đầu tiên trong LIS, tức (0,0)D, là quan trọng Ta xét tiếp bốn node con của node (0,0), 8 bit tiếp theo đều là 1 -> bốn node con của (0,0) cũng là quan trọng và dương -> ta chuyển tọa độ của bốn node con này sang LSP với giá trị khôi phục là 2 6 2 5 96; đồng thời đánh dấu (0,0) là loại L và chuyển xuống cuối danh sách LIS
Ba bit tiếp theo đều là 0 -> chứng tỏ ba phần tử tiếp theo của LIS đều không quan trọng -> giữ nguyên chúng tại LIS
Bit tiếp theo là 1 -> chứng tỏ con cháu của node (0,0) là quan trọng -> ta chuyển tọa độ của (0,0) thành tọa độ của bốn node con và đánh dấu là loại D
Chuỗi bit tiếp theo là 1 00 1111 -> chứng tỏ node tiếp theo trong danh sách LIS, tức (2,0)D, là quan trọng và node này có hai con đầu là không quan trọng, còn hai con sau là quan trọng và dương Giá trị khôi phục của hai node con sau là 2 6 2 5 96
HVTH: Phạm Thị Huế 32 Chuỗi bit tiếp theo là 1 00 1111 -> chứng tỏ node tiếp theo trong danh sách LIS, tức (2,1)D, là quan trọng và node này có hai con đầu là không quan trọng, còn hai con sau là quan trọng và dương Giá trị khôi phục của hai node con sau là 2 6 2 5 96
Chuỗi bit tiếp theo là 1 11111111 -> chứng tỏ node tiếp theo trong danh sách LIS, tức (3,0)D, là quan trọng và node này có bốn con cũng là quan trọng và dương Giá trị khôi phục của bốn node con là 2 6 2 5 96
Chuỗi bit cuối cùng là 1 11111111 -> chứng tỏ node tiếp theo trong danh sách LIS, tức (3,1)D, là quan trọng và node này có bốn con cũng là quan trọng và dương Giá trị khôi phục của bốn node con là 2 6 2 5 96
Như vậy sau khi giải mã qua 2 pass thì ta khôi phục được các hệ số ở hình bên dưới như sau (hình bên trên là các hệ số ban đầu):
ĐỀ XUẤT CẢI TIẾN GIẢI THUẬT NÉN ẢNH SPIHT TRONG MIỀN
Phân tích việc phân phối của các hệ số của các subband ở mỗi tầng của biến đổi
Để điều chỉnh phương pháp nén ảnh SPIHT được phù hợp hơn với biến đổi Contourlet thì ta cần làm rõ sự phân phối của các hệ số Contourlet quan trọng
Số lượng các hệ số Contourlet quan trọng ở mỗi subband được tính bằng công thức sau:
Dựa vào kết quả phân tích ở [7], mức ngưỡng T phù hợp được lựa chọn có giá trị = 32 p(x,y) là biên độ của hệ số ở tọa độ (x,y) của mỗi subband
Số lượng các hệ số quan trọng ở mỗi subband quyết định mức độ quan trọng của chính subband đó, nghĩa là subband nào càng có nhiều hệ số quan trọng thì subband đó càng quan trọng Subband quan trọng nhất tức là subband có nhiều hệ số quan trọng nhất
Với cách tính số lượng các hệ số Contourlet quan trọng như trên, ta vẽ được đồ thị thể hiện sự phân phối của các hệ số quan trọng ở mỗi subband của mỗi tầng Những đồ thị phân phối này là của 8 ảnh test chuẩn (8 bpp, 512x512) ở 4 tầng biến đổi Contourlet (Goldhill, Cameraman, Barbara, Lena, Baboon, Mandrill, Pepper và Pirate)
Hình 14: Sự phân phối hệ số Contourlet ở các subbandcủa ảnh Goldhill level 1 level 2 level 3 level 4
Hình 15: Sự phân phối các hệ số Contourlet ở các subband của ảnh Cameraman
Hình 16: Sự phân phối các hệ số Contourlet ở các subband của ảnh Barbara
Hình 17: Sự phân phối các hệ số Contourlet ở các subband của ảnh Lena level 1 level 2 level 3 level 4 level 1 level 2 level 3 level 4 level 1 level 2 level 3 level 4
Hình 18: Sự phân phối các hệ số Contourlet ở các subband của ảnh Baboon
Hình 19: Sự phân phối các hệ số Contourlet ở các subband của ảnh Mandrill
Hình 20: Sự phân phối các hệ số Contourlet ở các subband của ảnh Pepper level 1 level 2 level 3 level 4 level 4 level 3 level 2 level 1 level 1 level 2 level 3 level 4
Hình 21: Sự phân phối các hệ số Contourlet ở các subband của ảnh Pirate
Qua những đồ thị trên ta rút ra được hai nhận xét như sau: (i) đối với biến đổi Contourlet thì nhìn chung đối với mỗi ảnh, số các hệ số quan trọng chỉ tập trung ở một số subband nhất định (ví dụ ở ảnh Pirate thì thường số hệ số quan trọng tập trung ở subband thứ 4 và 13 ở mỗi tầng), như vậy ta có thể áp dụng phương pháp mã hóa subband quan trọng hơn với nhiều bit hơn, (ii) vị trí subband quan trọng nhất ở các ảnh khác nhau là khác nhau, như vậy trước khi tiến hành mã hóa thì đối với từng ảnh, ta cần phải xác định vị trí của các subband dựa trên tiêu chí mức độ quan trọng.
Giải thuật đề nghị
Dựa trên việc phân tích ở trên, một phương pháp nén ảnh dùng SPIHT cải tiến trong miền Contourlet được đề xuất Về cơ bản thì phương pháp này sẽ sắp xếp lại các subband theo độ quan trọng và các subband càng quan trọng thì càng được mã hóa bằng nhiều bit hơn Nhờ đó việc khôi phục các subband quan trọng sẽ chính xác hơn
Phương pháp cải tiến SPIHT đề nghị được mô tả cụ thể như sau:
Hình 22: Sơ đồ chung của phương pháp nén ảnh đề xuất level 1 level 2 level 3 level 4
Biến đổi Contourlet ảnh đầu vào
Ma trận ảnh đầu vào có kích thước 512x512 được biến đổi Contourlet Biến đổi Contourlet được dùng có 4 tầng, mỗi tầng có 16 hướng, hai bộ lọc được dùng cho phân tích LP và DFB lần lượt là “9-7” và “pkva” Ta có mô tả biến đổi Contourlet như hình vẽ bên dưới:
Hình 23: Biến đổi Contourlet ảnh đầu vào
Xây dựng các subband lowpass ảo [7]
Ma trận chứa các hệ số của ảnh lowpass ban đầu có kích thước 32x32 sẽ được phân chia vào 16 subband ảo, mỗi subband có kích thước là 4x16 và các subband sẽ được xếp từ trên xuống dưới
Hình 24:Xây dựng các subband lowpass ảo
HVTH: Phạm Thị Huế 38 Việc phân chia này được thực hiện bằng lệnh reshape trong matlab
Sắp xếp lại các subband theo độ quan trọng [7] Độ quan trọng của một subband được xác định bằng số lượng các hệ số quan trọng ở trong subband, tức là subband nào mà có càng nhiều hệ số quan trọng thì subband đó càng quan trọng Số lượng các hệ số quan trọng được tính bằng cách so sánh với ngưỡng 32
Với mỗi một ảnh, ta ghi lại độ quan trọng của tất cả subband ở 4 tầng biến đổi Contourlet vào một bảng (64 subband), bảng này gồm bốn cột, ghi lại thông tin của subband là subband ở vị trí thứ mấy, thuộc tầng nào, số lượng các hệ số quan trọng và vị trí mới của subband đó sau khi sắp xếp
Sau đó, căn cứ vào bảng vừa lập ra, ta xếp 16 subband ở mỗi tầng ra một ma trận Các subband này được xếp lần lượt vào ma trận từ trên xuống dưới theo vị trí quan trọng mới của nó và được giữ nguyên kích cỡ như subband ban đầu
Nén ảnh bằng thuật toán SPIHT theo số lượng bit mã hóa quy định trước
Cấu trúc cây Spatial Orientation Tree được tạo như hình vẽ bên dưới:
Hình 25: Cấu trúc cây Spatial Orientation Tree đề xuất
Mỗi subband có cùng mức quan trọng ở 4 tầng sẽ tạo thành 64 cây Spatial Orientation Tree (mỗi cây có một gốc là một hệ số của ảnh lowpass) Nhóm 64 cây nào mà quan trọng hơn thì ta mã hóa bằng nhiều bit hơn Bằng thực nghiệm ta thấy mỗi nhóm liền kề hơn kém nhau 200 bit thì sẽ đạt được chất lượng tốt nhất Để tiết kiệm bộ nhớ khi thực hiện trên phần cứng thì ta không mã hóa một subband một lần, mà chỉ mã hóa theo block 4 cây Spatial Orientation Tree một lần.
Kết quả mô phỏng giải thuật
Phương pháp đề xuất được thực hiện trên Matlab 7.7 R2010b Để kiểm tra phương pháp này, 8 hình chuẩn (8-bit, 512x512) được lựa chọn, đó là Lena, Goldhill, Barbara, Mandrill, Baboon, Cameraman, Peppers và Pirate Ở phần thực nghiệm, bộ lọc 9-7 được dùng cho lowpass stage và bộ lọc pkva được dùng cho DFB stage.Biến đổi Contourlet sẽ được phân tích thành 4 tầng với 16 hướng ở mỗi tầng.Chuỗi bitstream đầu ra của thuật nén ảnh SPIHT sẽ không được nén tiếp với thuật toán arithmetic Phương pháp đề xuất được so sánh với hai phương pháp khác là Contourlet với SPIHT điều chỉnh [7] and Wavelet với SPIHT truyền thống [9]
Bảng 1: So sánh PSNR của phương pháp đề xuất với 2 phương pháp khác
Phương pháp đề xuất (dB)
Contourlet với SPIHT điều chỉnh [7] (dB)
Wavelet với SPIHT truyền thống [9] (dB)
Average performance of 8 test images
Bảng trên biểu thị kết quả khi thực hiện với 8 ảnh Nhìn chung, phương pháp đề xuất cao hơn hai phương pháp kia, đặc biệt là ở tốc độ bit-rate thấp Ví dụ đối với ảnh Cameraman, kết quả là tốt nhất, ở bit-rate = 0.15 bpp tăng được 0,655 dB so với phương pháp Contourlet với SPIHT điều chỉnh và 3.051 dB so với phương pháp Wavelet với SPIHT truyền thống
Tuy nhiên, PSNR của phương pháp đề xuất lại giảm khi ta tăng bit-rate Ví dụ với ảnh Cameraman, tại bit-rate = 0.25 bpp, PSNR của phương pháp đề xuất tăng 0,535 dB so với phương pháp Contourlet với SPIHT điều chỉnh, nhưng lại thấp hơn Wavelet với SPIHT truyền thống 0,346 dB
Hình 26 Ảnh Barbara được nén ở bit-rate=0.25 bpp (a) Thuật toán nén ảnh đề xuất, PSNR = 24.083 dB, (b) Contourlet với SPIHT điều chỉnh [7], PSNR = 24.086 dB, (c) Wavelet với SPIHT truyền thống ở [9], PSNR = 24.791 dB
HVTH: Phạm Thị Huế 41 Hình 27 Ảnh Goldhill được nén ở bit-rate = 0.25 bpp
(a) Thuật toán nén ảnh đề xuất, PSNR = 27.824 dB, (b) Contourlet với SPIHT điều chỉnh [7], PSNR = 27.992 dB, (c) Wavelet với SPIHT truyền thống [9], PSNR = 27.926 dB
Hình 28 Ảnh Mandrill được nén ở bit-rate = 0.25 bpp
HVTH: Phạm Thị Huế 42 (a) Thuật toán nén ảnh đề xuất, PSNR = 24.230 dB, (b) Contourlet với SPIHT điều chỉnh [7], PSNR = 24.002, (c) Wavelet với SPIHT truyền thống [9], PSNR = 23.992 dB
Hình 29 Ảnh Peppers được nén ở bit-rate = 0.25 bpp
(a) Thuật toán nén ảnh đề xuất, PSNR = 29.265 dB, (b) Contourlet với SPIHT điều chỉnh [7], PSNR = 28.956 dB, (c) Wavelet với SPIHT truyền thống [9], PSNR = 30.064 dB
Hình 30 Ảnh Lena được nén ở bit-rate = 0.25 bpp
HVTH: Phạm Thị Huế 43 (a) Thuật toán nén ảnh đề xuất, PSNR = 29.700 dB, (b) Contourlet với SPIHT điều chỉnh [7], PSNR = 29.392 dB, (c) Wavelet với SPIHT truyền thống [9], PSNR = 30.221 dB
Những hình bên trên cho thấy chất lượng của ba phương pháp trên dưới góc độ quan sát bằng mắt thường Ta thấy rõ ràng rằng hình ảnh nén sử dụng phương pháp Wavelet với SPIHT truyền thống sẽ không thấy rõ đối tượng bên trong ảnh bằng hai phương pháp dựa trên biến đổi Contourlet Như vậy, phương pháp đề xuất không chỉ tăng về PSNR mà còn cải thiện được khả năng quan sát đối tượng bên trong ảnh
XÂY DỰNG LÕI IP CHO PHẦN CỨNG NÉN ẢNH
Mô tả chung
Sơ đồ khối của lõi IP nén ảnh được cho trong hình 32 sink_fifo source_fifo spiht_core control_data din_ready din_valid din_startofpacket din_endofpacket din_data[23:0] dout_ready dout_valid dout_startofpacket dout_endofpacket dout_data[23:0] data_in almost_full full_source data_out[23:0] data_in[23:0] empty_sink height[15:0] width[15:0] data_valid_in
SPIHT_IP avl_mm_slave_address[7:0] avl_mm_slave_read avl_mm_slave_write avl_mm_slave_readdata[31:0] avl_mm_slave_writedata[31:0] rd y wrreq wrreq rdreq
Hình 32: Cấu trúc khối spiht_ip
HVTH: Phạm Thị Huế 45 Cấu trúc phần cứng của IP nén ảnh SPIHT được chia làm bốn khối chính:
- Sink_fifo: Giao tiếp chuẩn avalon-st sink, lưu dữ liệu nhận được vào fifo
- Control_data: Điều khiển dữ liệu vào ra và hoạt động của các khối khác
- Spiht_core: Xử lý giải thuật nén ảnh, giao tiếp chuẩn avalon với Nios2
Khối sink_fifo
sink_fifo din_ready din_valid din_startofpacket din_endofpacket din_data[23:0] data_in[23:0] almost_empty height[15:0] width[15:0]
Hình 33: Sơ đồ tín hiệu vào ra khối sink_fifo
Khối sink_fifo [Hình 33] có chức năng giao tiếp chuẩn avalon-st sink Ngõ vào của khối là chuẩn Avalon-ST Ngõ ra là dữ liệu nhận được Tín hiệu almost_empty bật lên ‘1’ khi dữ liệu trong fifo là trống Ngoài ra khối này còn xuất ra thông tin kích thước khung hình nhận được (height và width).Khối này được chia thành hai khối nhỏ là sink_control và khối FIFO [Hình 34] sink_control
FIFO wrreq data[23:0] full sink_fifo din_ready din_valid din_startofpacket din_endofpacket din_data[23:0] data_in[23:0] almost_empty height[15:0] width[15:0]
Hình 34: Sơ đồ khối chi tiết khối sink_fifo
HVTH: Phạm Thị Huế 46 sink_control: được thiết kế là một máy trạng thái để giao tiếp chuẩn avalon-st sink fifo: Lưu dữ liệu nhận được vào fifo trước khi đưa vào khối core để xử lý Kích thước fifo có thể thay đổi được tuỳ thuộc vào ứng dụng và kích thước khung hình.
Khối spiht_core
raster2block contourlet_spiht block2raster spiht_core avalon_MM data_in[23:0] data_out[23:0] rdy data block 8x8 data_valid data block 8x8 data_valid data_valid_out data_valid_in
Hình 35: Sơ đồ tín hiệu vào ra của khối spiht_core
Khối spiht_core có chức năng xử lý thuật toán nén ảnh SPIHT Dữ liệu đầu vào và đầu ra là chuẩn YCbCr 4:4:4 Ngoài ra khối còn có giao tiếp chuẩn Avalon-MM để giao tiếp với Nios Khối này được chia làm ba khối nhỏ: o Khối raster2block o Khối Contourlet_spiht o Khối block2raster
Sơ đồ khối raster2block được cho trong hình sau raster2block data_in[23:0] rdy data block 8x8 data_valid_out data_valid_in
Hình 36: Sơ đồ tín hiệu vào ra khối raster2block Khối này có chức năng chuyển đổi kiểu dữ liệu nối tiếp raster sang kiểu dữ liệu song song từng block 8x8 pixel Raster là kiểu truyền điểm ảnh theo kiểu truyền từng hàng điểm ảnh
HVTH: Phạm Thị Huế 47 từ điểm ảnh đầu tiên ở góc trái trên cùng cho đến điểm cuối bên phải và từ hàng trên cùng đến hàng cuối cùng Chân tín hiệu rdy cho biết khối đã sẵn sàng nhận dữ liệu Chân data_valid_in và data_valid_out cho biết dữ liệu ngõ vào và ra hợp lệ
CT spiht_Cal ICT din_CL1 din_CL2 dout_CL1 dout_CL2 din_data_8x8 dout_data_8x8 avalon_MM
Hình 37: Sơ đồ khối Contourlet_spiht
Khối Contourlet_spiht xử lý tính toán nén ảnh SPIHTtheo từng block 8x8 pixel Dữ liệu ngõ vào, ra theo từng block 8x8 Giao tiếp Avalon MM để cấu hình và xử lý dữ liệu trên Nios2 Khối Contourlet_spiht được chia thành ba khối chính:
- CT (Contourlet Transform): Khối biến đổi thuận Contourlet(tham khảo từ luận văn của Lê Quốc Bảo Trí, ĐHBK, 2013) - spiht_cal: Khối xử lý giải thuật nén ảnh SPIHT
- ICT (Inverse Contourlet Transform): Khối biến đổi ngược Contourlet (tham khảo từ luận văn của Lê Quốc Bảo Trí,ĐHBK, 2013)
3.3.2.1 Cấu trúc phần cứng của khối Contourlet Transform(CT):
Cấu trúc của khối CT bao gồm bốn khối con: Laplacian Pyramid Level 1 (LP_L1), Laplacian Pyramid Level 2 (LP_L2), Directional Filter Bank Level 1 (DFB_L1), Directional Filter Bank Level 2 (DFB_L2) Sơ đồ khối của khối CT được trình bày ở hình 38
Khối LP_L1 và khối DFB_L1 tạo ra các hệ số Contourlet level 1 của ảnh ban đầu Khối LP_L2 nhận thành phần lowpass level 1 và tạo ra bandpass level 2 cho DFB_L2 Sau đó chúng ta sẽ có được các hệ số Contourlet level 2 từ ngõ ra của khối DFB_L2
Sơ đồ khối chi tiết của khối LP_L1 và LP_L2 sẽ được trình bày ở hình 39 và hình 40
Các khối LP phân rã (decomposition) ở mỗi mức tạo ra 1 low pass (haft size) và 1 bandpass (full size)
Hình 38:Sơ đồ khối của khối Contourlet Transform
Hình 39:Sơ đồ khối của LP_L1
Hình 40:Sơ đồ khối của LP_L2
Trong các khối LP_L1 và LP_L2 thì có các khối chung như H_row, H_col, G,SUB
Khối H_row có chức năng nhần chập theo hàng với bộ lọc H và hạ mẫu theo cột Khối H_col có chức năng là nhân chập theo cột với bộ lọc H và hạ mẫu theo hàng Khối G có tác dụng là vừa tăng mẫu theo hàng và cột vừa nhân chập với bộ lọc G.Khối SUB có chức năng là từ 2 ma trận cùng kích thước với nhau Ở đây H và G là các bộ lọc phân tách và phục hồi tương tự như các bộ lọc của wavelet (ở đây ta sử dụng bộ lọc 2D Haar) Các bộ lọc được thực hiện bởi các bộ cộng và bộ trừ đơn giản Còn các bộ register chỉ là các bộ chốt dữ liễu theo kiểu ta mong muốn
Các bộ lọc hướng 2 chiều (2-D DFB) bằng cách phân tích cây nhị phân như hình 41 của level 1 và hình 42 của level 2 Cấu trúc gốc của DFB là bộ lọc Quincunx với diamond-shaped
HVTH: Phạm Thị Huế 49 filter (lọc theo tần số).Nhưng ở đây ta sẽ dùng bộ lọc Quincunx với Fan-shaped Filter (lọc theo hướng) Bộ Fan-shaped Filter sẽ được điều chế từ Diamond_shaped Filter Các khối DFB_L1 và DFB_L2 bao gồm các khối H0 và H1 là các bộ lọc Fan Filter dùng để nhân chập với tín hiệu vào theo kiều Quincunx và các bộ register là dùng để thực hiện công viêc Quincunx downsampling Ngõ ra các khối DFB_L1 và DFB_L2 là các hệ số Contourlet
Hình 41:Sơ đồ khối của DFB_L1
Hình 42:Block diagram of DFB_L2
Khối spiht_cal có chức năng để tính toán giải thuật nén SPIHT.Sơ đồ tín hiệu vào ra của khối này được mô tả ở Hình 43.Đầu vào là bộ hệ số Contourlet được lấy từ khối biến đổi
HVTH: Phạm Thị Huế 50 thuận Contourlet.Ngõ ra là bộ hệ số sau khi đã tính toán được đưa vào bộ biến đổi ngược Contourlet.Khối này có cổng giao tiếp avalon-MM với Nios2 để xử lý và lưu dữ liệu vào bộ nhớ spiht_cal avl_mm_slave_address[7:0] avl_mm_slave_read avl_mm_slave_write avl_mm_slave_readdata[31:0] avl_mm_slave_writedata[31:0 din_0[31:0][1:5] din_1[31:0][1:5] din_0[47:0][6:9] din_1[47:0][6:9] din_2[47:0][6:9] din_3[47:0][6:9] dout_0[31:0][1:5] dout_1[31:0][1:5] dout_0[47:0][6:9] dout_1[47:0][6:9] dout_2[47:0][6:9] dout_3[47:0][6:9]
Hình 43: Sơ đồ tín hiệu vào ra của khối spiht_cal data wrreq data_in fifo_in fifo_in fifo_in avalon_MM fifo_in fifo_in fifo_out data_out data rdreq alv_mm_interface
Hình 44: Sơ đồ khối chi tiết khối spiht_cal Khối spiht_cal [Hình 44] được chia làm ba khối chính:
- fifo_in: lưu bộ hệ số Contourlet, giúp nios có thể đọc data từ bộ này lên xử lý
HVTH: Phạm Thị Huế 51 - avl_mm_interface: giao tiếp chuẩn Avalon MM và thực hiện tính toán SPIHT Quá trình tính toán được xử lý trên NIOS - fifo_out: lưu dữ liệu đã xử lý
3.3.2.3 Cấu trúc phần cứng của khối Inverse Contourlet Transform (ICT):
Bước cuối cùng của quá trình triệt nhiễu video là biến đổi ngược Contourlet,biến đổi này được thực hiện bởi khối ICT trong hình 45 Thiết kế của khối ICT bao gồm 4 khối con là:
Directional Filter Bank Reconstruction Level 2 (DFBR_L2), Laplacian Pyramid Reconstruction Level 2 (LPR_L2), Directional Filter Bank Reconstruction Level 1 (DFBR_L1), Laplacian Pyramid Reconstruction Level 1 (DFBR_L1).Các hệ số Contourlet sau khi được nén và giải nén sẽ được xử lý bởi các khối DFBR_L1 và DFBR_L2 đổi phục hồi lại tín hiệu bandpass Sau đó lowpass và bandpass được đưa đến khối LPR để khôi phục lại dữ liệu ảnh ban đầu
Hình 45:Sơ đồ khối của khối ICT
Khối control_data
control_data full_source empty_sink height[15:0] width[15:0] data_valid_out rdy wrreq rdreq
Hình 51: Sơ đồ tín hiệu vào ra khối control_data
Khối này có chức năng điều khiển hoạt động của IP Khối yêu cầu đọc data từ bộ fifo sink thông qua tín hiệu rdreq Sau khi xử lý sẽ cho phép yêu cầu ghi dữ liệu vào bộ fifo source thông qua tín hiệu wrreq Tín hiệu data_valid_out = 1 cho phép dữ liệu output từ fifo sink là hợp lệ, đồng thời khối spiht_core sẽ hoạt động Khi bộ fifo_sink empty hoặc fifo_source full, tin hiệu data_valid_out = 0 để ngưng hoạt động của IP.
Khối source_fifo
source_fifo dout_ready dout_valid dout_startofpacket dout_endofpacket dout_data[23:0] almost_full data_out[23:0] data_valid_out width[15:0] height[15:0]
Hình 52: Sơ đồ tín hiệu khối source_fifo
HVTH: Phạm Thị Huế 54 Khối sink_fifo có chức năng giao tiếp chuẩn avalon-st source.Ngõ ra của khối là chuẩn avalon-st source.Ngõ vào là dữ liệu sau khi xử lý giải thuật nén ảnh SPIHT Tín hiệu almost_full bật lên ‘1’ khi dữ liệu trong fifo là full để báo cho khối control_data tạm dừng ghi dữ liệu vào fifo Thông tin kích thước khung hình nhận được (height và width) Kích thước fifo có thể thay đổi được tuỳ thuộc vào ứng dụng và kích thước khung hình
THẨM TRA THIẾT KẾ LÕI IP
Kết quả mô phỏng trên modelsim
Các khối chức năng được mô tả bằng ngôn ngữ verilog và được mô phỏng bằng phần mềm Modelsim
Hình 53: Khối control data, khi tín hiệu request data =1
Hình 54: Khối control data, khi tín hiệu request data =0
IP được thiết kế có clock latency=1, Khi tín hiệu request=1 yêu cầu đọc dữ liệu từ FIFO sink, thì sau 1 xung clock, có dữ liệu data ngõ vào (dout_valid=1) Khi request=0, thì sau 1 clock, sẽ dừng đọc dữ liệu từ bộ FIFO sink
Hình 31 mô tả dạng sóng ngõ vào của bộ spiht_core Dữ liệu ngõ vào theo từng block 8x8 pixel
Hình 56: Khối raster2block (block 8x8)
Tín hiệu block_valid_out =1, báo dữ liệu đầu ra hợp lệ mỗi block 8x8 data ngõ ra của khối raster2block
Khối CT, nhận dữ liệu khối 8x8 từ tín hiệu di0 di7 Sau khoảng thời gian xử lý 80 chu kỳ clock, dữ liệu thông số Contourlet được tính xong và đưa ra các ngõ do0, do1, ….do12_3
Hình 57: Dữ liệu hệ số đầu ra khối CT
Hình 58: Dữ liệu vào khối iCT (lowpass level 2 và các hệ số Contourlet)
Khối ICT nhận dữ liệu vào là các hệ số Contourlet, bao gồm các tín hiệu di1_0, di1_1, …di9_3
Hình 59: Dữ liệu ra của khối ICT
Khối ICT có dạng sóng tương tự khối CT Dữ liệu ra là dạng block 8x8 được tái tạo từ các thông số Contourlet
Hình 60:Dữ liệu ra khối CT (lowpass level 2 và các hệ số Contourlet)
Hình 61: Dữ liệu vào khối spiht_cal (các hệ số Contourlet)
Thử nghiệm thiết kế trên kit FPGA DE2 115
Toàn bộ hệ thống nén ảnh được thử nghiệm trên kit DE2-115 sử dụng FPGA Cyclone IV.Thiết kế phần cứng được tổng hợp bằng phần mềm Quartus II 13.1
Sơ đồ khối tổng quát của hệ thống được mô tả bởi Hình 63.Dữ liệu hình ảnh được Nios đọc từ SDCARD, sau đó truyền cho bộ spiht_ip thông qua bộ source_data Dữ liệu sau khi bộ spiht_ip xử lý xong sẽ truyền ngược lại lên Nios thông qua bộ sink_data Nios sẽ truyền ảnh khôi phục lên PC thông qua UART
Hình 62: Sơ đồ Qsys của hệ thống
- NIOS sẽ đọc 1 file ảnh gray (ảnh xám) 8bit từ SDcard ghi vào Sram
- Bộ DMA controller sẽ truy cập vào Sram thông qua IP Sram_controller để xuất ảnh đó ra màn hình VGA (ảnh gốc)
- Ảnh này được NIOS gửi xuống bộ source_data
- Bộ source_data nhận dữ liệu và gửi cho bộ SHPIT xử lý nén ảnh Dữ liệu được NIOS xử lý và gửi ngược về SHPIT để xử lý giải nén
- SHPIT nhận dữ liệu từ NIOS, xử lý giải nén rồi source ra cho bộ sink_data Sink_data gửi dữ liệu về NIOS thông qua giao tiếp Avalon-MM Thông tin này được đưa tới
PC thông qua UART và kiểm tra sai số (đây là ảnh đã giải nén)
SD_card_controller i_avalon_chip_select i_avalon_address[7:0] i_avalon_read i_avalon_write i_avalon_byteenable[3:0] o_avalon_readdata[31:0] i_valon_writedata[31:0] o_avalon_waitrequest i_clock i_reset_n
- NIOS sẽ thông qua khối này để giao tiếp với SDcard
Các hàm được sử dụng:
Prototype alt_up_sd_card_dev* alt_up_sd_card_open_dev(const char *name)
Input name – tên của SD Card IP Core trong hệ thống SOPC
Output alt_up_sd_card_dev* - là con trỏ chỉ đến địa chị nền của SD Card
IP Core trong hệ thống SOPC description khởi tạo SD Card IP Core HAL device driver Return NULL nếu tên IP không tồn tại
Prototype short int alt_up_sd_card_fopen(char *name, bool create)
Input char *name – tên tập tin muốn mở bool create : true – tạo tập tin có tên name.false – open tập tin có tên name output false : kết quả trả về -1 : tên file bị trùng với file đã có sẵn trong sdcard tạo file thành công : trỏ vào file cần ghi true : kết quả trả về -2 : file đã được mở kết quả trả về -1 : file không thế mở mở file thành công : trỏ vào file cần đọc description sử dụng để mở hoặc tạo file trong sdcard
Prototype short int alt_up_sd_card_read(short int file_handle) input file_handle – giá trị trả về khi open file thành công trong lệnh alt_up_sd_card_fopen output nếu đọc thành công, 1 byte data là mã ASCII của ký tự trong
SDCARD Nếu thất bại, trả về -1, file không có dữ liệu, hoặc dữ liệu đã đọc hết -2 file không thể mở bằng giao tiếp SDcard description đọc 1 byte trong file đã được trỏ tới trong lệnh alt_up_sd_card_fopen
Prototype bool alt_up_sd_card_write(short int file_handle, unsigned char byte_of_data) input file_handle : giá trị trả về khi lệnh tạo file alt_up_sd_card_fopen thành công byte_of_data : 1 byte data cần ghi
HVTH: Phạm Thị Huế 62 output true : ghi thành công fasle : ghi thất bại description ghi 1 byte vào file đã được tạo
Prototype bool alt_up_sd_card_is_Present(void) input none output true : thẻ SDcard đã được cắm vào khe cắm fasle : chưa cắm thẻ SDcard vào khe cắm description kiểm tra đã cắm thẻ hay chưa
Prototype bool alt_up_sd_card_is_FAT16(void) input none output true – SDcard chứa FAT16 data fasle – ngược lại description kiểm tra SDcard có đúng chuẩn FAT16
Prototype bool alt_up_sd_card_fclose(short int file_handle) input file_handle : dữ liệu trả về trong lệnh alt_up_sd_card_fopen output true : thành công fasle : thất bại description close file
SRAM_controller address[19:0] read write byteenable[3:0] readdata[31:0] writedata[31:0]
SRAM_UB_N SRAM_CE_N SRAM_OE_N SRAM_WE_N
- NIOS sẽ thông qua khối này để giao tiếp với SRAM (đọc – ghi) - Dữ liệu cần lưu trữ có thể lưu vào SRAM để xử lý
4.2.1.3 Khối Source_data core FIFO source_avalon dout_ready dout_valid dout_startofpacket dout_endofpacket dout_data[23:0] rdreq empty data source_fifo wrreq data[23:0] full source_data
- Có chức năng giao tiếp, nhận dữ liệu từ NIOS thông qua giao tiếp Avalon- MM và đưa vào FIFO
- NIOS cũng thông qua IP này để kiểm tra tình trạng của FIFO (full hoặc sẵn sàng nhận dữ liệu
- Khối core gồm 3 thanh ghi chính :
Control_reg : có chức năng nhận lệnh đọc hoặc ghi từ NIOS Chân wrrep của
FIFO sẽ được nối với bit 0 của thanh ghi này
State_reg : chứa thông tin tình trạng của FIFO
Fifo_data : có chức năng nhận data từ NIOS Thanh ghi này được nối với đường data của FIFO Khối Source_fifo Khối này được mô tả như ở phần 5.5
4.2.1.4 Khối Sink_data sink_control FIFO core din_ready din_valid din_startofpacket din_endofpacket din_data[23:0] wrreq data[23:0] full rdreq empty data sink_fifo
- Có chức năng đọc dữ liệu từ FIFO Giao tiếp với NIOS thông qua giao tiếp Avalon- MM
- NIOS cũng thông qua IP này để kiểm tra tình trạng của FIFO là có dữ liệu hay không
- Khối CORE gồm 3 thanh ghi chính:
Control_reg: có chức năng nhận lệnh đọc hoặc ghi từ NIOS Chân rdrep của FIFO sẽ được nối với bit 0 của thanh ghi này
State_reg: chứa thông tin tình trạng của FIFO
Fifo_data: có chức năng đọc dữ liệu từ FIFO theo lệnh của NIOS rồi gửi dữ liệu lên NIOS thông qua giao tiếp o Avalon-MM
Khối sink_fifo Khối này được mô tả như ở phần 5.2
4.2.2 Phương pháp thử nghiệm đánh giá
Hệ thống sẽ dùng NIOS để đọc dữ liệu là một ảnh dạng text file từ sdcard, sau đó sẽ cấp dữ liệu ảnh này cho IP nén ảnh thông qua khối source_fifo Dữ liệu sau khi xử lý sẽ được nios truyền tới PC bằng UART thông qua bộ sink_fifo.Sử dụng Matlab để tính PSNR của ảnh gốc và ảnh sau khi đã nén Ngoài ra, Nios còn lưu kết quả trung gian của chuỗi bit sau khi nén SPIHT để so sánh với kết quả mô phỏng trên matlab
Hình 63: Các IP sử dụng trong Qsys
Hình 64: Kết quả tổng hợp trên Quartus, v13.1
Kết quả tổng hợp trên phần mềm quartus II, IP có thể chạy được với tần số 50Mhz Hệ thống chiếm 5% số cổng logic của tài nguyên FPGA Tần số hoạt động tối đa là 119.82Mhz
Hình 65: Kit thực nghiệm hệ thống