Matlab trong xử lý ảnh: Cơ bản ảnh Grayscale (part 1)

Lu ROm

Administrator
Staff member
25 Tháng bảy 2014
481
119
43
31
One piece
vimach.net
1, Biểu diễn hình ảnh:
- Trong phần này, chúng ta sẽ tìm hiểu về ảnh Grayscale (ảnh xám) bởi vì ảnh xám là định dạng thích hợp để xử lý ảnh. Ngay cả trong trường hợp yêu cầu nhiều màu sắc, một hình ảnh màu RGB có thể bị phân tách và xử lý thành ba hình ảnh grayscale riêng biệt. Hình ảnh Indexed cũng được chuyển đổi sang màu xám hoặc RGB cho hầu hết các thao tác. Một số định nghĩa về các loại hình ảnh trong bài này.
- Lưu ý rằng phạm vi giá trị phụ thuộc vào lớp kiểu dữ liệu: ví dụ, [0,1] là kiểu double. Nếu đó là uint8, phạm vi mà Matlab hiểu sẽ là [0:255].
a, Ảnh Grayscale
- Dưới đây là một hình ảnh và được load vào matlab. Bạn có thể kiếm riêng cho mình một ảnh trên web hoặc lấy ảnh phía dưới.
Einstein.jpg

- Đầu tiên, ta cần load ảnh đó vào matlab:
Mã:
img = imread('Einstein.jpg');
imshow(img);
- Chúng ta sử dụng hàm size() để kiểm tra kích thước ảnh và giá trị pixel( cường độ) của ảnh:
Mã:
>> size(img)
ans =
   845   915     3
- Hình ảnh trên có giá trị là 845x915 với 3 là biểu diễn màu RGB. Vì thế, ảnh trên thực chất chất không phải là một ảnh xám.
- Tiếp túc chúng ta kiểm tra từng giá trị pixel :
Mã:
>> img(400,400,:)
ans(:,:,1) =
   22
ans(:,:,2) =
   24
ans(:,:,3) =
   19

>> img(350,500,:)
ans(:,:,1) =
  113
ans(:,:,2) =
  117
ans(:,:,3) =
  116
- Các giá trị của ba thành phần gần giống hệt nhau, nó gần như là một ảnh xám nếu ta chỉ nhìn vào mà không kiểm tra. Vì thế, để chuyển đổi hình ảnh trên thành màu xám hoàn toàn, ta cần dùng câu lệnh sau rgb2gray(). Hàm rgb2gray() chuyển đổi hình ảnh RGB thành ảnh xám bằng cách loại bỏ các thông tin màu sắc và độ bão hòa trong khi giữ lại độ sáng.
Mã:
img = imread('Einstein.jpg');
gray = rgb2gray(img);
imshow(gray);
- Bây giờ ta tiếp tục kiểm tra kích thước bằng hàm size():
Mã:
>> size(gray)
ans =
   845   915
- Gía trị của ảnh bây giờ là 845x915, số 3 đã mất, và hình ảnh trên không còn là ảnh RGB nữa. Tiếp tục kiểm tra từng giá trị pixel ta được:
Mã:
>> gray(400,400,:)
ans =
   23
>> gray(350,500,:)
ans =
  116
- Mỗi pixel chỉ có một giá trị duy nhất, phù hợp với định nghĩa của ảnh xám.
b, Chuyển đổi sang màu xám thủ công
Cách ở trên ta dùng hàm rgb2gray() chuyển đổi các hình ảnh RGB thành hình ảnh màu xám. Nhưng có một cách khác mà chúng ta có thể thực hiện việc chuyển đổi mà không dùng hàm bằng cách sử dụng công thức chuyển đổi tiêu chuẩn NTSC được đề xuất bởi MathWorks:
Mã:
intensity = 0.2989*red + 0.5870*green + 0.1140*blue
- Vì vậy, hình ảnh trên có thể dễ dàng chuyển qua ảnh xám bằng công thức trên. Dưới đây là ví dụ:
Mã:
rgb = imread('Einstein.jpg');
gray_manual = 0.2989 * rgb(:,:,1) + 0.5870 * rgb(:,:,2) + 0.1140 * rgb(:,:,3);
imshow(gray);
- Kiểm tra giá trị từng pixel, chúng ta có thể thấy các giá trị bằng với các giá trị khi dùng hàm chuyển đổi:
Mã:
>> gray_manual(400,400,:)
ans =
   23

>> gray_manual(350,500,:)
ans =
  116
- Kết luận: chúng ta có 2 cách để chuyển đổi một ảnh RGB thành ảnh xám đó là dùng hàm hoặc thủ công.

c, Tạo hình ảnh xám trong matlab
- Trong phần này, chúng ta sẽ tạo ra hai hình ảnh màu xám kích thước 320 × 240: một với tất cả các pixel là màu đen và một là tất cả các pixel đều là màu trắng:
Mã:
h = 240;
w = 320;
white = uint8(255*ones(h,w));
black = uint8(zeros(h,w));
figure;
subplot(121);
imshow(white);
subplot(122);
imshow(black);
white_black.png


d,Các chỉ số hình ảnh
- Các bạn tải file ảnh này về: cameraman.tif.
- Thông tin về hình ảnh trên:
Mã:
>> imfinfo('cameraman.tif')
ans =
                     Filename: [1x83 char]
                  FileModDate: '14-Apr-2014 12:53:51'
                     FileSize: 65126
                       Format: 'tif'
                FormatVersion: []
                        Width: 256
                       Height: 256
                     BitDepth: 8
                    ColorType: 'grayscale'
              FormatSignature: [73 73 42 0]
                    ByteOrder: 'little-endian'
               NewSubFileType: 0
                BitsPerSample: 8
                  Compression: 'PackBits'
    PhotometricInterpretation: 'BlackIsZero'
                 StripOffsets: [8 8262 16426 24578 32492 40499 48599 56637]
              SamplesPerPixel: 1
                 RowsPerStrip: 32
              StripByteCounts: [8254 8164 8152 7914 8007 8100 8038 8235]
                  XResolution: 72
                  YResolution: 72
               ResolutionUnit: 'Inch'
                     Colormap: []
          PlanarConfiguration: 'Chunky'
                    TileWidth: []
                   TileLength: []
                  TileOffsets: []
               TileByteCounts: []
                  Orientation: 1
                    FillOrder: 1
             GrayResponseUnit: 0.0100
               MaxSampleValue: 255
               MinSampleValue: 0
                 Thresholding: 1
                       Offset: 64872
- Chúng ta cần đọc ảnh vào và chuyển đổi ảnh thành ảnh indexed:
Mã:
I = imread('cameraman.tif');
[X, map] = gray2ind(I, 16);
- Tiếp theo chúng ta kiểm tra kích thước map (biểu đồ) của ảnh mới tạo:
Mã:
>> size(map)
ans =
    16     3
- Gía trị map có 16 RGB như chúng ta quy định trong lệnh. Chúng ta có thể xem các giá trị:
Mã:
    0         0         0
    0.0667    0.0667    0.0667
    0.1333    0.1333    0.1333
    0.2000    0.2000    0.2000
    0.2667    0.2667    0.2667
    0.3333    0.3333    0.3333
    0.4000    0.4000    0.4000
    0.4667    0.4667    0.4667
    0.5333    0.5333    0.5333
    0.6000    0.6000    0.6000
    0.6667    0.6667    0.6667
    0.7333    0.7333    0.7333
    0.8000    0.8000    0.8000
    0.8667    0.8667    0.8667
    0.9333    0.9333    0.9333
    1.0000    1.0000    1.0000
-Chúng ta có 16 hàng của RGB và mỗi hàng tương ứng với chỉ số được lưu trữ trong ảnh indexed X với kích thước (256 x 256).

-Kiểm tra pixel ở (128, 128) và xem chỉ số pixel đó:
Mã:
>> X(128,128)
ans =
    9
- Chỉ số của điểm ảnh là 9. Điều đó có nghĩa là giá trị RGB của hàng thứ 9 của map là: 0,6000 0,6000 0,6000.
- Bây giờ chúng ta cần lập bản đồ của các chỉ số thông tin của ảnh X với các giá trị RGB :
Mã:
I = imread('cameraman.tif');
[X, map] = gray2ind(I, 16);
imshow(X, map);
cameraman_imshow.png

**Bảng colormap
built_in_colormap.png

Biểu đồ màu jet là biểu đồ màu mặc định. Vì vậy, khi chúng ta sử dụng lệnh colormap , nó sẽ hiển thị biểu đồ màu jet:
Mã:
>> colormap

ans =

         0         0    0.5625
         0         0    0.6250
         0         0    0.6875
         0         0    0.7500
         0         0    0.8125
         0         0    0.8750
         0         0    0.9375
         0         0    1.0000
         0    0.0625    1.0000
         0    0.1250    1.0000
         0    0.1875    1.0000
         0    0.2500    1.0000
         0    0.3125    1.0000
         0    0.3750    1.0000
         0    0.4375    1.0000
         0    0.5000    1.0000
         0    0.5625    1.0000
         0    0.6250    1.0000
         0    0.6875    1.0000
         0    0.7500    1.0000
         0    0.8125    1.0000
         0    0.8750    1.0000
         0    0.9375    1.0000
         0    1.0000    1.0000
    0.0625    1.0000    0.9375
    0.1250    1.0000    0.8750
    0.1875    1.0000    0.8125
    0.2500    1.0000    0.7500
    0.3125    1.0000    0.6875
    0.3750    1.0000    0.6250
    0.4375    1.0000    0.5625
    0.5000    1.0000    0.5000
    0.5625    1.0000    0.4375
    0.6250    1.0000    0.3750
    0.6875    1.0000    0.3125
    0.7500    1.0000    0.2500
    0.8125    1.0000    0.1875
    0.8750    1.0000    0.1250
    0.9375    1.0000    0.0625
    1.0000    1.0000         0
    1.0000    0.9375         0
    1.0000    0.8750         0
    1.0000    0.8125         0
    1.0000    0.7500         0
    1.0000    0.6875         0
    1.0000    0.6250         0
    1.0000    0.5625         0
    1.0000    0.5000         0
    1.0000    0.4375         0
    1.0000    0.3750         0
    1.0000    0.3125         0
    1.0000    0.2500         0
    1.0000    0.1875         0
    1.0000    0.1250         0
    1.0000    0.0625         0
    1.0000         0         0
    0.9375         0         0
    0.8750         0         0
    0.8125         0         0
    0.7500         0         0
    0.6875         0         0
    0.6250         0         0
    0.5625         0         0
    0.5000         0         0
- Kích thước của map:
Mã:
>> size(colormap)
ans =
    64     3