Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab
Biểu diễn ảnh
Một ảnh được biểu diễn dưới dạng một hàm f(x,y)
Đối với ảnh số đơn sắc, giá trị f tại (x,y) được gọi
là mức xám
Kết quả của quá trình lấy mẫu và lượng tử hóa là
một ma trận số liệu.
Một ảnh có kích thước M x N là một ma trận có M
hàng và N cột, mỗi một giá trị trên ma trận gọi là
một điểm ảnh (pixel)
Bạn đang xem 20 trang mẫu của tài liệu "Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Xử lý tín hiệu nâng cao - Chương 6: Xử lý ảnh trong Matlab
Xử lý tín hiệu nâng cao -Advanced signal processing- Chương 6 Xử lý ảnh trong Matlab Tín hiệu hai chiều (ảnh số) Biểu diễn ảnh Một ảnh được biểu diễn dưới dạng một hàm f(x,y) Đối với ảnh số đơn sắc, giá trị f tại (x,y) được gọi là mức xám Kết quả của quá trình lấy mẫu và lượng tử hóa là một ma trận số liệu. Một ảnh có kích thước M x N là một ma trận có M hàng và N cột, mỗi một giá trị trên ma trận gọi là một điểm ảnh (pixel). Biểu diễn ảnh Một ma trận tọa độ ảnh trong Matlab được biểu diễn Các kiểu ảnh trong Matlab Ảnh được định chỉ số (Indexed Images) Ảnh cường độ (Intensity Images) Ảnh nhị phân (Binary Images) Ảnh RGB (RGB Images) Ảnh được định chỉ số (Indexed Images) Một ảnh chỉ số bao gồm một ma trận dữ liệu X và ma trận bản đồ màu map. Ma trận dữ liệu có thể có kiểu thuộc lớp uint8, uint16 hoặc kiểu double. Ma trận bản đồ màu là một mảng mx3 kiểu double bao gồm các giá trị dấu phẩy động nằm giữa 0 và 1. Mỗi hàng của bản đồ chỉ ra các giá trị mà: red, green và blue của một màu đơn. Một ảnh chỉ số sử dụng ánh xạ trực tiếp giữa giá trị của pixel ảnh tới giá trị trong bản đồ màu. Màu sắc của mỗi pixel ảnh được tính toán bằng cách sử dụng giá trị tương ứng của X ánh xạ tới một giá trị chỉ số của map. Giá trị 1 chỉ ra hàng đầu tiên, giá trị 2 chỉ ra hàng thứ hai trong bản đồ màu Một bản đồ màu thường được chứa cùng với ảnh chỉ số và được tự động nạp cùng với ảnh khi sử dụng hàm imread để đọc ảnh. Tuy nhiên, ta không bị giới hạn khi sử dụng bản đồ màu mặc định, ta có thể sử dụng bất kì bản đồ màu nào. Ảnh cường độ (Intensity Images) Một ảnh cường độ là một ma trận dữ liệu ảnh I mà giá trị của nó đại diện cho cường độ trong một số vùng nào đó của ảnh. Matlab chứa một ảnh cường độ như một ma trận đơn, với mỗi phần tử của ma trận tương ứng với một pixel của ảnh. Ma trận có thể thuộc lớp double, uint8 hay uint16. Trong khi ảnh cường độ hiếm khi được lưu với bản đồ màu, Matlab sử dụng bản đồ màu để hiển thị chúng. Những phần tử trong ma trận cường độ đại diện cho các cường độ khác nhau hoặc độ xám. Những điểm có cường độ bằng 0 thường được đại diện bằng màu đen và cường độ 1,255 hoặc 65535 thường đại diện cho cường độ cao nhất hay màu trắng. Ảnh nhị phân (Binary Images) Trong một ảnh nhị phân, mỗi pixel chỉ có thể chứa một trong hai giá trị nhị phân 0 hoặc 1. Hai giá trị này tương ứng với bật hoặc tắt (on hoặc off). Một ảnh nhị phân được lưu trữ như một mảng logic của 0 và 1. Ảnh RGB (RGB Images) Một ảnh RGB - thường được gọi là true-color, được lưu trữ trong Matlab dưới dạng một mảng dữ liệu có kích thước 3 chiều mxnx3 định nghĩa các giá trị màu red, green và blue cho mỗi pixel riêng biệt. Ảnh RGB không sử dụng palette. Màu của mỗi pixel được quyết định bởi sự kết hợp giữa các giá trị R, G, B (Red, Green, Blue) được lưu trữ trong một mặt phẳng màu tại vị trí của pixel. Định dạng file đồ hoạ lưu trữ ảnh RGB giống như một ảnh 24 bits trong đó R, G, B chiếm tương ứng 8 bit một. Điều này cho phép nhận được 16 triệu màu khác nhau. Một mảng RGB có thể thuộc lớp double, uint8 hoặc uint16. Trong một mảng RGB thuộc lớp double, mỗi thành phần màu có giá trị giữa 0 và 1. Một pixel mà thành phần màu của nó là (0, 0, 0) được hiển thị với màu đen và một pixel mà thành phần màu là (1, 1, 1 ) được hiển thị với màu trắng. Ba thành phần màu của mỗi pixel được lưu trữ cùng với chiều thứ 3 của mảng dữ liệu. Chẳng hạn, giá trị màu R, G, B của pixel (10, 5) được lưu trữ trong RGB(10, 5, 1), RGB(10, 5, 2) và RGB(10, 5, 3) tương ứng. Để tính toán màu sắc của pixel tại hàng 2 và cột 3 chẳng hạn, ta nhìn vào bộ ba giá trị được lưu trữ trong (2, 3, 1:3). Giả sử (2, 3, 1) chứa giá trị 0.5176; (2, 3, 2) chứa giá trị 0.1608 và (2, 3, 3) chứa giá trị 0.0627 thì màu sắc của pixel tại (2, 3) sẽ là (0.5176, 0.1608, 0.0627). Đọc và hiển thị 1 ảnh Xóa các biến và các cửa sổ ảnh clear, close all Đọc ảnh I = imread('pout.tif'); Hiển thị ảnh imshow(I) Có thể xem các thông tin về biến trong workspace bằng lệnh whos whos Name Size Bytes Class I 291x240 69840 uint8 array Grand total is 69840 elements using 69840 bytes Thực hiện cân bằng Histogram trên ảnh Ta thấy, pout.tif là một hình ảnh có độ tương phản hơi thấp. Để xem sự phân bố cường độ trong pout.tif, ta có thể tạo ra một lược đồ histogram bằng cách gọi hàm imhist. Trước khi gọi hàm imhist, sử dụng lệnh figure để lược đồ histogram không ghi đè lên màn hình hiển thị của ảnh I trong cửa sổ hiện tại. 1600 figure, imhist(I) 0 50 100 150 200 250 0 200 400 600 800 1000 1200 1400 Phạm vi cường độ khá hẹp. Nó không che hết phạm tiềm năng của [0, 255], và thiếu các giá trị cao và thấp sẽ cho kết quả tương phản tốt. Thực hiện cân bằng Histogram trên ảnh Hộp công cụ cung cấp nhiều cách để cải thiện độ tương phản trong một hình ảnh. Hàm histeq để dàn trải các giá trị cường độ trên toàn bộ phạm vi ảnh, gọi là quá trình cân bằng histogram. I2 = histeq(I); Xem thêm hàm histeq, imadjust, adapthisteq Thực hiện cân bằng Histogram trên ảnh Hiển thị ảnh sau khi đã được cân bằng histogram figure, imshow(I2) Xem lược đồ histogram của ảnh I2 figure, imhist(I2) 0 50 100 150 200 250 0 200 400 600 800 1000 1200 1400 1600 Thực hiện cân bằng Histogram trên ảnh Ảnh trước và sau khi được cân bằng histogram 0 50 100 150 200 250 0 200 400 600 800 1000 1200 1400 1600 0 50 100 150 200 250 0 200 400 600 800 1000 1200 1400 1600 Lưu một ảnh từ ma trận ra một file Dùng lệnh imwrite: imwrite (I2, 'pout2.png') Xem các thông tin của ảnh Dùng lệnh imfinfo imfinfo('pout2.png') Ví dụ 2 Đọc và hiển thị ảnh Xóa các biến trong workspace, đóng các cửa sổ figure, và đóng tất cả các Image Viewers. clear, close all, imview close all Đọc và hiển thị ảnh rice.png. I = imread('rice.png'); imview(I) Ví dụ 2 Ước lượng giá trị của điểm ảnh Background: Ví dụ gọi hàm imopen để thực hiện các thao tác mở về hình thái học. Chú ý lời gọi đến hàm strel, tạo ra một phần tử cấu trúc hình đĩa với bán kính 15. Để loại bỏ các hạt gạo từ hình ảnh, các phần tử cấu trúc phải đủ lớn để nó không thể đặt vừa toàn bộ bên trong một hạt gạo. background = imopen(I,strel('disk',15)); Để xem ảnh background ước lượng, gõ lệnh: imview(background) Ví dụ 2 Xem xấp xỉ Background như một bề mặt. Sử dụng lệnh surf để tạo ra một màn hình hiển thị bề mặt của xấp xỉ nền. Lệnh surf tạo bề mặt màu tham số cho phép bạn xem các hàm toán học trong một vùng chữ nhật . Hàm surf yêu cầu dữ liệu lớp double, do đó, trước tiên bạn cần phải chuyển đổi nền bằng lệnh double figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]); set(gca,'ydir','reverse'); 0 10 20 30 40 0 10 20 30 40 0 50 100 150 200 250 Ví dụ 2 Tạo một hình ảnh với Uniform Background Để tạo một nền đồng nhất, trừ ảnh nền, hình nền, từ hình ảnh ban đầu I I2 = imsubtract(I,background); Vì phép trừ, giống như nhiều phép toán trong MATLAB, chỉ hỗ cho dữ liệu lớp double, bạn phải sử dụng hàm imsubtract Image Processing Toolbox. Hiển thị hình ảnh với nền đồng nhất hơn. imview(I2) Ví dụ 2 Điều chỉnh độ tương phản trong ảnh đã xử lý Sau phép trừ, hình ảnh có một nền thống nhất nhưng ảnh hơi tối quá. Sử dụng imadjust để điều chỉnh độ tương phản của hình ảnh. I3 = imadjust(I2); imadjust làm tăng độ tương phản của hình ảnh bằng cách làm bão hòa 1% dữ liệu ở cả hai cường độ thấp và cao của I2 và bằng cách trải dài các giá trị cường độ để điền đầy phạm vi động uint8. Hiển thị ảnh I3 đã được điều chỉnh. imview(I3); Ví dụ 2 Tạo ra một Phiên bản nhị phân của ảnh Tạo một phiên bản nhị của hình ảnh bằng cách sử dụng ngưỡng. • Hàm Graythresh tự động tính ra một ngưỡng thích hợp sử dụng để chuyển đổi ảnh cường độ sang ảnh nhị phân. • Hàm Im2bw thực việc chuyển đổi. level = graythresh(I3); bw = im2bw(I3,level); imview(bw) Ví dụ 2 Tạo ra một Phiên bản nhị phân của ảnh ảnh nhị phân bw tạo ra bởi lệnh im2bw thuộc lớp logical, xem bằng lệnh whos whos Ví dụ 2 Xác định số lượng đối tượng trong Image Sau khi chuyển đổi ảnh sang một ảnh nhị phân, có thể sử dụng hàm bwlabel để xác định số hạt cơm trong hình ảnh. Hàm bwlabel gán nhãn tất cả các thành phần trong ảnh nhị phân bw và trả về số lượng các thành phần mà nó tìm thấy trong ảnh tại tham số đầu ra, numObjects [labeled,numObjects] = bwlabel(bw,4) numObjects = 101 Ví dụ 2 Xác định số lượng đối tượng trong Image Độ chính xác của kết quả phụ thuộc vào một số yếu tố, bao gồm: • Kích thước của các đối tượng • Có hay không có đối tượng được chạm vào (trong trường hợp chúng được gán nhãn là một trong những đối tượng) • Độ chính xác của xấp xỉ nền • Các kết nối được chọn . • Tham số 4, trong hàm bwlabel, có nghĩa là điểm ảnh được chạm dọc theo một cạnh để được xem xét kết nối Ví dụ 2 Xem xét ma trận nhãn Để hiểu rõ hơn về ma trận nhãn trả về bởi hàm bwlabel, bước này khám phá các giá trị điểm ảnh trong hình ảnh. Có một số cách để có được một cái nhìn cận cảnh các giá trị điểm ảnh, ví dụ: • sử dụng imcrop để chọn một phần nhỏ của hình ảnh. • sử dụng imview để hiển thị ma trận nhãn và sử dụng các tính năng của Image Viewer để kiểm tra giá trị điểm ảnh. imview(labeled) Ví dụ 2 Xem xét ma trận nhãn Ví dụ 2 Hiển thị Ma trận Nhãn như một ảnh chỉ số PseudoColor Một cách tốt để xem một ma trận nhãn là để hiển thị nó như một ảnh chỉ số PseudoColor. Trong hình ảnh PseudoColor, con số xác định một đối tượng trong bản đồ ma trận nhãn với một màu sắc khác nhau trong ma trận bản đồ màu được liên kết . Các màu trong ảnh làm các đối tượng dễ phân biệt được. Để xem một ma trận nhãn theo cách này, sử dụng hàm label2rgb. Sử dụng hàm này, bạn có thể chỉ định bản đồ màu, màu nền, và cách các đối tượng trong bản đồ ma trận nhãn có màu nào bản đồ màu. pseudo_color = label2rgb(labeled, @spring, 'c', 'shuffle'); imview(pseudo_color); Ví dụ 2 Hiển thị Ma trận Nhãn như một ảnh chỉ số PseudoColor pseudo_color = label2rgb(labeled, @spring, 'c', 'shuffle'); imview(pseudo_color); Phép lọc tuyến tính Trong Matlab, sử dụng hàm fspecial để tạo mặt nạ lọc >> H= fspecial('type',parameter) 'average' averaging filter 'disk' circular averaging filter 'gaussian' Gaussian lowpass filter 'motion' motion filter 'prewitt' Prewitt horizontal edge-emphasizing filter 'sobel' Sobel horizontal edge-emphasizing filter 'unsharp' unsharp contrast enhancement filter Phép lọc tuyến tính Tự tạo bộ lọc >>h=1/10*[1 1 1; 1 2 1; 1 1 1] Sử dụng hàm imfilter để lọc ảnh >> I2=imfilter(I1,H) Trong đó: •I1: ma trận chứa dữ liệu điểm ảnh •H: mặt nạ lọc •I2: Ảnh đã qua phép lọc Phép lọc tuyến tính Mặt nạ average H= fspecial('average',[r c]) Bộ lọc trung bình, kích thước mặc định 3x3 Ví dụ: 111 111 111 9 1 Phép lọc tuyến tính Mặt nạ disk H= fspecial('disk',r) Bộ lọc tròn chung bình, r có mặc định bằng 5 Mặt nạ lọc có kích thước 2r+1 Ví dụ: H= fspecial('disk',3) Mặt nạ gaussian H= fspecial('gaussian',[r c],sig) Mặc định là 3x3 và sig=0.5 Các hệ số của là các phần tử rời rạc của phân bố Gauss Phép lọc tuyến tính Mặt nạ motion H= fspecial('motion',len,theta) Giá trị mặc định len=9, theta=0 Được sử dụng để làm nhòe ảnh có hướng Ví dụ: I = imread('saturn.tif'); subplot(1,2,1);imshow(I);title('Original'); H = fspecial('motion',50,45); I2 = imfilter(I,H); subplot(1,2,2);imshow(I2);title('Motion Blurred'); Phép lọc tuyến tính Mặt nạ prewitt H=fspecial('prewitt') Mặt nạ sobel H=fspecial('sobel') −−− 111 000 111 −−− 121 000 121 Phép lọc tuyến tính Mặt nạ unsharp H= fspecial('unsharp',alpha) Tăng cường độ nét và tương phản Kích thước 3x3, tham số alpha mặc định = 0.2 Ví dụ: I = imread('moon.tif'); h =fspecial('unsharp'); imshow(I) I2 = imfilter(I,h); figure,imshow(I2) Phép lọc tuyến tính Lọc tuyến tính Mặt nạ Lapalacian fspecial('laplacian', alpha) Tăng độ sắc nét cho ảnh Phép lọc tuyến tính Ví dụ I=imread('cameraman.tif'); H = fspecial('average'); I2 = imfilter(I,H); imshow(I);figure,imshow(I2); Loại bỏ viền đen Loại bỏ viền đen Để loại bỏ viền đen I3 = imfilter(I,H,'replicate'); imshow(I2);figure,imshow(I3); Phép lọc phi tuyến Mục đích giảm nhiễu xung Các loại bộ lọc phi tuyến Bộ lọc hạng bậc Bộ lọc trung vị Bộ lọc co giãn Bộ lọc bậc r Bộ lọc k láng giềng Lọc phi tuyến Bộ lọc hạng: là phương pháp lọc trong đó mức xám tại một điểm được tính dựa trên sự xếp hạng các điểm ảnh lân cận. Hàm ordfilt2 cung cấp cho ta bộ lọc dạng này g= ordfilt2(f, order, domain) Ví dụ g=ordfilt2(f,1,ones(m,n)); g=ordfilt2(f,m*n,ones(m,n)); Bộ lọc phi tuyến Lọc trung vị g=ordfilt2(f,median(1:m*n),ones(m,n)); Matlab cũng cung cấp hàm medfilt2 để thực hiện lọc trung vị. g=medfilt2(f); Ví dụ I = imread('eight.tif'); J = imnoise(I,'salt & pepper',0.02); K = medfilt2(J); imshow(J), figure, imshow(K) Khôi phục ảnh Khôi phục ảnh tập trung vào việc loại bỏ hay giảm thiểu sự biến dạng xảy ra trong quá trình thu nhận ảnh. Sự biến dạng ảnh có thể bao gồm : Nhiễu-là những sai khác trong giá trị của pixel, Ảnh hưởng quang học : sự mở do việc chuyển động của camera Ta có dạng tổng quát của ảnh bị biến dạng: g(x,y) = f(x,y)*h(x,y) + n(x,y) Khôi phục ảnh Nhiễu muối tiêu I2= imnoise(I1,'salt & pepper') Khôi phục ảnh Nhiễu gaussian t = imnoise(image,’gaussian’) Khôi phục ảnh Các phương pháp Sử dụng bộ lọc trung bình Bộ lọc hạng Bộ lọc chắn dải Bộ lọc thông dải Tách biên ảnh Biên ảnh là các điểm có cường độ thay đổi nhanh. Tìm biên ảnh bằng cách sử dụng một trong hai tiêu chuẩn tổng quát sau: Tìm các nơi đạo hàm bậc nhất của cường độ sáng có biên độ hơn một ngưỡng. Tìm các nơi đạo hàm bậc hai của cường độ sáng có sự thay đổi qua mức 0 Tách biên ảnh Trong Matlab ta sử dụng hàm edge, cú pháp I2 = edge (I1,'method') Trong đó 'method' gồm : Sobel, Prewitt, Roberts, Cany... Ví dụ I= imread('rice.tif'); BW1 = edge(I,'prewitt'); BW2 = edge(I,'canny'); imshow(BW1) figure, imshow(BW2) Tách biên ảnh Kết quả
File đính kèm:
- xu_ly_tin_hieu_nang_cao_chuong_6_xu_ly_anh_trong_matlab.pdf