Tải bản đầy đủ (.docx) (163 trang)

BÁO CÁO BÀI TẬP LỚN Môn Xử lý ảnh trong công nghiệp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.15 MB, 163 trang )

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
KHOA ĐIỆN - ĐIỆN TỬ
BỘ MƠN ĐIỀU KHIỂN HỌC
***********

BÁO CÁO BÀI TẬP LỚN
Mơn: Xử lý ảnh trong cơng nghiệp
Thành viên:
Vũ Hồng Dũng
Đỗ Đức Chính
Nguyễn Duy Trung
Đào Phương Nam
Bùi Đức Lương

181600914
181611116
181610480
181611830
181613334

Lớp: Tự Động Hóa-K59
Giảng viên hướng dẫn: Phí Văn Lâm

Hà Nội, 27 /02 /2022.

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI




BÀI TẬP LỚN XỬ LÝ ẢNH



Giảng viên hướng dẫn: thầy Phí Văn Lâm
Lớp chun ngành:

Tự động hóa 1 – Khóa 59

Sinh viên thực hiện:

Đỗ Đức Chính
Bùi Đức Lương
Vũ Hồng Dũng
Nguyễn Duy Trung
Đào Phương Nam

Hà Nội – 2021

Mục lục
2


Danh mục các từ viết tắt
CCIR

Campaign for Comprehensive Immigration Reform

CGA

Color Graphic Adaptor)

CMYK


Cyan – Magenta – Yellow - Key

EAN

European Article Number

RGB

Hệ màu Red – Green - Blue

UPC

Universal Product Code

3


Chương 1: Lý thuyết chung (Nguyễn Duy Trung)
1. Ảnh số
1.1.

Ảnh số là gì?

Ảnh sớ là tập hợp hữu hạn các điểm ảnh với mức xám phù hợp dùng để mô tả
ảnh gần với ảnh thật. Số điểm ảnh xác định độ phân giải của ảnh, ảnh có độ
phân giải càng cao thì càng thể hiện rõ nét các đặc điểm của tấm hình, càng
làm cho tấm ảnh trở nên thực và sắc nét hơn.
a. Điểm ảnh (Picture Element)


Điểm ảnh (Pixel) là một phần tử của ảnh số tại tọa độ (x, y) với độ xám
hoặc màu nhất định. Kích thước và khoảng cách giữa các điểm ảnh đó
được chọn thích hợp sao cho mắt người cảm nhận sự liên tục về không
gian và mức xám ( hoặc màu) của ảnh số gần như ảnh thật. Mỗi phần tử
trong ma trận được gọi là một phần tử ảnh.
b. Mức xám của ảnh

Mức xám là kết quả của sự biến đổi tương ứng 1 giá trị độ sáng của 1
điểm ảnh với 1 gía trị ngun dương. Thơng thường nó xác định trong
[0, 255] tùy thuộc vào giá trị mà mỗi điểm ảnh được biểu diễn. Các
thang giá trị mức xám thông thường: 16, 32, 64, 128, 256. Mức 256 là
mức phổ dụng vì từ kỹ thuật máy tính dùng 1 byte (8 bit) để biểu diễn
mức xám. Mức xám dùng một byte biểu diễn : 28 = 256 mức, tức là từ
0 đến 255.
c. Độ phân giải của ảnh

Độ phân giải của ảnh (Resolution) của ảnh là mật độ điểm ảnh được ấn định
trên một ảnh số được hiển thị. Khoảng cách giữa các điểm ảnh phải được
chọn sao cho mắt người vẫn thấy được sự liên tục của ảnh. Việc lựa chọn
khoảng cách thích hợp tạo nên một mật độ phân bớ, đó chính là độ phân giải
và được phân bố theeo trục x và y trong không gian 2 chiều. Ví dụ: Độ phân
4


giải của ảnh trên màn hình CGA (Color Graphic Adaptor) là một lưới điểm
theo chiều ngang màn hình: 320 điểm chiều dọc*200 điểm ảnh (320*200).
Rõ ràng cùng màn hình CGA 12” ta nhận thấy mịn hơn màn hình CGA
17” độ phân giải 320*200. Vì cùng một mật độ nhưng diện tích mà
hình rộng hơn thì độ mịn ( độ liên tục của các điểm) kém hơn.
d. Các cách phân loại ảnh


• Ảnh nhị phân: Giá trị xám của tất cả các điểm ảnh chỉ nhận giá trị 1
hoặc 0 như vậy mỗi điểm ảnh trong ảnh nhị phân được biểu diễn bởi
1 bit. Ảnh xám: Giá trị xám nằm trong [0, 255] như vậy mỗi điểm
ảnh trong ảnh nhị phân được biểu diễn bởi 1 byte.
• Ảnh màu:
- Hệ màu RGB:
Một pixel được biểu diễn bằng 3 giá trị (R, G, B) trong đó R, G, B là
một giá trị xám và được biểu biểu diễn bằng 1 byte. Khi đó ta có một
ảnh 24 bits.
P(x, y) = (R, G, B)
– Hệ màu CMY: là phần bù của hệ màu RGB
(C, M, Y) = (1, 1, 1) – (R, G, B)
Hay C+R=M+G=Y+B=1
=> Hệ màu này thường được dùng trong máy in.
– Hệ màu CMYK trong đó K là độ đậm nhạt của màu K= min(C,M,Y)
P(x, y) = (C-K, M-K, V-K, K).
e. Các giai đoạn xử lý ảnh.

5


Hình 1-1: Các giai đoạn xử lý ảnh
1.2.

Xử lý ảnh với Matlab

a. Xử lý ảnh

Đầu tiên, hình ảnh từ thế giới bên ngoài được các thiết bị thu nhận, ghi

hình ảnh như camera, máy chụp hình, máy quét,.. Trước đây, ảnh thu
qua Camera là các ảnh tương tự (loại Camera ống kiểu CCIR). Giờ đây,
với sự phát triển của công nghệ, ảnh màu hoặc đen trắng được lấy ra từ
Camera, sau đó nó được chủn trực tiếp thành ảnh sớ tạo thuận lợi cho
xử lý tiếp theo. Ngoài ra, ảnh cũng có thể tiếp nhận từ vệ tinh,
b. Các giai đoạn xử lý ảnh

Hình 1-2: Các giai đoạn xử lý ảnh trong matlab
-

Thu nhận ảnh (Image Acquisition): Ảnh được thu từ các nguồn như
máy ảnh, máy quay phim, máy quét, ảnh vệ tinh…Ảnh này có thể là
ảnh màu hoặc trắng đen, chất lượng ảnh phụ thuộc vào thiết bị thu
nhận hình ảnh.

-

Tiền xử lý (Image Processing): Sau khi ảnh được thu vào được xử lý
để chất lượng ảnh tốt lên qua việc điều chỉnh độ chiếu sáng, hiệu
chỉnh giá trị độ sáng giữa nền và đối tượng, giảm nhỏ thành phần
nhiễu, điều chỉnh bọ lọc và khuếch đại.

6


-

Phân đoạn (Segmentation): tách ảnh đầu vào thành các vùng đói
tượng khác nhau.


-

Biểu diễn ảnh (Image Representation): Đầu ra ảnh sau phân đoạn
chứa các điểm ảnh của vùng ảnh (ảnh đã phân đoạn) cộng với mã
liên kết với các vùng lận cận. Các số liệu này được biến đổi thành
các dạng thích hợp cho việc xử lý tiếp theo bằng máy tính, sau đó
ảnh sẽ được chọn các tích chất để thể hiện hay cịn gọi là trích chọn
đặc trưng (Feature Selection) gắn với việc tách các đặc tính của ảnh
dưới dạng các thông tin định lượng hoặc là làm cơ sở để phân biệt
lớp đối tượng này với đối tượng khác trong phạm vi ảnh nhận được.

-

Nhận dạng và nội suy ảnh (Image Recognition and Interpretation):
nhận dạng là quá trình xác định ảnh bằng cách so sánh với mẫu
chuẩn đã được chọn hoặc lưu từ trước. Nội suy là phán đoán ảnh
theo ý nghĩa trên cơ sở nhận dạng. Các đối tượng nhận dạng phổ
biến hiện nay được áp dụng trong khoa học và công nghệ: nhận
dạng ký tự( chữ viết tay, chữ in, chữ ký điện tử), nhận dạng văn bản,
nhận dạng hình ảnh ( vân tay, mặt người, mã vạch,..).

-

Cơ sở tri thức (Knowledge Base): Một đối tượng khá phức tạp về
đường nét, độ sáng tối, dung lượng điểm ảnh, môi trường để thu ảnh
phong phú kéo theo nhiễu. Trong nhiều khâu xử lý và phân tích ảnh
cần đơn giản hóa các phương pháp toán học đảm bảo tiện lợi cho xử
lý giống quy trình tiếp nhận và xử lý ảnh theo cách của con người, ở
đây các cơ sở tri thức được phát huy.


-

Mô tả và phát huy: Ảnh sau khi được sớ hóa sẽ được chuyển sang
khu vực lưu trữ phục vụ cho các công đoạn tiếp theo. Nếu lưu trữ
trực tiếp từ ảnh thô thì dung lượng lưu trữ sẽ rất lớn, vì vậy cần mô
tả, biểu diễn sao cho dung lượng lưu trữ là thấp nhất, để tiết kiệm bộ
nhớ cũng như tiết kiệm thời gian làm việc.

c. Các kiểu ảnh trong Matlab
7




Ả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ị 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,
không bị giới hạn khi sử dụng bản đồ màu mặc định, 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)

8


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. 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).
1.3.

Các hàm xử lý ảnh trong Matlab

a. Đọc và ghi dữ liệu
9




Đọc một ảnh đồ hoạ.

– Hàm imread đọc một ảnh bất kỳ với các định dạng được hỗ trợ như:
bmp, gif, jpeg, tiff,.. Ví dụ, đoạn mã sau sẽ đọc một ảnh RGB vào
không gian làm việc của Matlab lưu trong biến RGB.

RGB = imread(‘football.jpg’);


Đọc nhiều ảnh từ một file đồ hoạ

– Matlab trợ giúp một số định dạng file đồ hoạ chẳng hạn như: HDF và
TIFF, chúng chứa nhiều ảnh. Theo mặc định, imread chỉ trợ giúp ảnh
đầu tiên trong file. Để nhập thêm các ảnh từ file, sử dụng cú pháp được
trợ giúp bởi định dạng file.
Ví dụ sau đây đọc một chuỗi 27 ảnh từ một file TIFF và lưu những ảnh
này trong một mảng 4 chiều. Ta có thể sử dụng hàm iminfo để xem bao
nhiêu ảnh đã được lưu trữ trong file:
Mri = unit8(zero(128,128,1,27));
For frame = 1:27
[mri(:,:,:,frame),map] = imread(‘mri.tif,frame);
End
– Khi file chứa nhiều ảnh theo một số kiểu nhất định chẳng hạn theo
thứ tự thời gian, ta có thể lưu ảnh trong Matlab dưới dạng mảng 4
chiều. Tất cả các ảnh phải có cùng kích thước.
• Ghi một ảnh đồ hoạ
– Hàm imwrite sẽ ghi một ảnh tới một file đồ hoạ dưới một trong các
định dạng được trợ giúp. Cấu trúc cơ bản nhất của imwrite sẽ yêu cầu
một biến ảnh và tên file. Nếu ta gộp một phần mở rộng trong tên file,
Matlab sẽ nhận ra định dạng mong ḿn từ nó.
10


– Khi sử dụng imwrite với một số định dạng đồ hoạ, ta có thể chỉ ra các
tham sớ phụ. Ví dụ: Imwrite(I,’clown.png’,’BitDepth’,4);




Đọc và ghi ảnh nhị phân theo định dạng 1 bit

– Trong một số định dạng file, một ảnh nhị phân có thể được lưu trong
một định dạng 1 bit. Khi ta đọc một ảnh nhị phân với định dạng 1 bit,
Matlab đại diện nó trong khơng gian làm việc như một mảng lơgic.
– Ví dụ sau đọc một ảnh nhị phân và ghi nó dưới dạng file TIFF. Bởi vì
định dạng TIFF trợ giúp ảnh 1 bit, file được ghi lên đĩa theo định dạng
1 bit:
BW = imread(‘text.png’);
Imwrite(BW,’test.tif’);
Để kiểm tra chiều sâu bit của file test.tif, gọi hàm iminfo và kiểm tra
trường BitDepth của nó:
Info = imfinf(‘test.tif’);info.BitDepth
Ans = 1
Chú ý: Khi ghi file nhị phân, Matlab thiết lập trường ColorType thành
‘grayscale’.


Xem lớp lưu trữ của file

– Hàm imwrite sử dụng luật sau đây để quyết định lớp lưu trữ được sử
dụng trong ảnh kết quả:
+ logical: Nếu định dạng ảnh ra (Output Image) được chỉ rõ là trợ giúp
ảnh 1 bit, hàm imwrite tạo một file ảnh 1 bit. Nếu định dạng ảnh ra
được chỉ rõ là không trợ giúp ảnh 1 bit (như JPEG), hàm imwrite
chuyển ảnh tới một ảnh thuộc lớp uint8.
11



+ uint8: Nếu định dạng ảnh ra được chỉ rõ là trợ giúp ảnh 8 bit, hàm
imwrite tạo một ảnh 8 bit
+ uint16: Nếu định dạng ảnh ra được chỉ rõ trợ giúp ảnh 16 bit (PNG
hoặc TIFF), hàm imwrite tạo một ảnh 16 bit. Nếu định dạng ảnh ra
không trợ giúp ảnh 16 bit, hàm chuyển đổi dữ liệu ảnh tới lớp uint8 và
tạo một ảnh 8 bit.
+ double: Matlab chuyển dữ liệu ảnh tới dạng uint8 và tạo một ảnh 8
bit bởi vì hầu hết các file ảnh sử dụng định dạng 8 bit.
Truy vấn một file đồ hoạ
– Hàm imfinfo cho phép ta có thể nhận được thông tin về một file ảnh
được trợ giúp bởi toolbox.
Cú pháp: imfinfo(filename,fmt)
Các thông tin được cung cấp bởi hàm imfinfo là: filename,
filemodedate, filesize, format, formatversion, width, height, bitdepth,
colortype … Thông tin mà ta nhận được phụ thuộc vào kiểu của file
nhưng nó ln bao gồm những thơng tin sau: Tên của file ảnh, định
dạng fiel ảnh, số version của định dạng file, ngày sửa đởi gấn nhất, kích
thước file tính theo byte, chiều rộng ảnh tính theo pixel, chiều cao ảnh
tính theo pixel, sớ lượng bit trên 1 pixel, kiểu ảnh,..
Hiển thị ảnh.


Dùng hàm imview

– Để hiển thị một ảnh sử dụng hàm imview, dùng hàm imview, chỉ rõ
ảnh mà ta ḿn hiển thị. Ta có thể sử dụng imview để hiển thị một ảnh
mà đã được nhập vào trong không gian làm việc của Matlab.
Moonfig = imread(‘moon.tif’);
12



Imview(moonfig);
Ta cũng có thể chỉ định tên của file ảnh như trong ví dụ sau:
Imview(‘moon.tif’);
– File ảnh phải có mặt trong thư mục hiện tại hoặc trong đường dẫn của
Matlab. Cấu trúc này có thể hữu ích cho việc quét qua nhiều ảnh. Tuy
nhiên, lưu ý, khi sử dụng cấu trúc này, dữ liệu ảnh không được lưu
trong không gian làm việc của Matlab.
– Nếu ta gọi hàm imview mà khơng chỉ ra mất kì tham sớ nào, nó sẽ
hiển thị một hộp chọn file cho phép ta chỉ ra tên file ḿn hiển thị.


Xem nhiều ảnh

– Nếu ta chỉ ra một file mà chứa nhiều ảnh, hàm imview chỉ hiển thị
ảnh đầu tiên trong file đó. Để xem tất cả các ảnh trong file, sử dụng
hàm imread để nhập mỗi ảnh vào trong không gian làm việc của Matlab
sau đó gọi hàm imview nhiều lần để hiển thị mỗi ảnh riêng biệt.


Dùng hàm imshow

– Để xem ảnh, ta có thể sử dụng hàm imshow thay cho imview. Ta sử
dụng imshow để hiển thị một ảnh đã được nhập vào trong khơng gian
làm việc như ví dụ sau:
Moon = imread(‘moon.tif’);
Imshow(moon);
Ta cũng có thể chỉ ra tên của file ảnh như một tham sớ trùn vào cho
hàm như ví dụ sau: imshow(‘moon.tif’);

Khi sử dụng cấu trúc này thì dữ liệu ảnh không được nhập vào trong
không gian làm việc. Tuy nhiên, ta có thể mang ảnh vào trong khơng
gian làm việc bằng cách sử dụng hàm getimage. Hàm này sẽ nhận dữ
13


liệu ảnh từ handle của một đối tượng ảnh hiện tại. Chẳng hạn: moon =
getimage; Sẽ gán dữ liệu ảnh từ moon.tif vào biến moon.
b. Các hàm chuyển đổi kiểu ảnh.

Với các thao tác nhất định sẽ thật hữu ích khi có thể chủn đởi ảnh từ
dạng này sang dạng khác. Chẳng hạn, nếu ta muốn lọc một màu ảnh
được lưu trữ dưới dạng ảnh chỉ số đầu tiên ta nên chủn đởi nó thành
dạng ảnh RGB.
Khi ta áp dụng phép lọc tới ảnh RGB, Matlab sẽ lọc giá trị cường độ
trong ảnh tương ứng. Nếu ta cố gắng lọc ảnh chỉ số, Matlab đơn giản
chỉ áp đặt phép lọc tới ma trận ảnh chỉ số và kết quả sẽ khơng có ý
nghĩa.
– Danh sách sau đây sẽ liệt kê các hàm được sử dụng trong việc chủn
đởi kiểu ảnh:
• dither: Tạo một ảnh nhị phân từ một ảnh cường độ đen trắng

bằng cách trộn, tạo một ảnh chỉ số từ một ảnh RGB bằng cách
trộn (dither).
• gray2id: Tạo một ảnh chỉ sớ từ một ảnh cường độ đen trắng.
• grayslice: Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng

bằng cách đặt ngưỡng.
• im2bw: Tạo một ảnh nhị phân từ một ảnh cường độ, ảnh chỉ số


hay ảnh RGB trên cơ sở của ngưỡng ánh sáng.
• ind2gray: Tạo một ảnh cường độ đen trắng từ một ảnh chỉ sớ.
• ind2rgb: Tạo một ảnh RGB từ một ảnh chỉ sớ.
• mat2gray: Tạo một ảnh cường độ đen trắng từ dữ liệu trong một

ma trận bằng cách lấy tỉ lệ giữ liệu.
• rgb2gray: Tạo một ảnh cường độ đen trắng từ một ảnh RGB.
• rgb2ind: Tạo một ảnh chỉ số từ một ảnh RGB.
14


– Ta cũng có thể thực hiện các phép chuyển đổi kiểu chỉ sử dụng cú
pháp của Matlab. Chẳng hạn, ta có thể chủn đởi một ảnh cường độ
sang ảnh RGB bằng cách ghép nối 3 phần copy của ma trận ảnh gốc
giữa 3 chiều:
RGB = cat(3,I,I,I);
– Ảnh RGB thu được có các ma trận đồng nhất cho các mặt phẳng R,
G, B vì vậy ảnh hiển thị giống như bóng xám.
– Thêm vào những cơng cụ chủn đởi chuẩn đã nói ở trên, cũng có
một sớ hàm mà trả lại kiểu ảnh khác như một phần trong thao tác mà
chúng thực hiện.
• Chủn đởi khơng gian màu

– Toolbox xử lý ảnh biểu diễn màu sắc như các giá trị RGB ( trực tiếp
trong ảnh RGB hoặc gián tiếp trong ảnh chỉ sớ ). Tuy nhiên, có các
phương pháp khác cho việc biểu diễn màu sắc. Chẳng hạn, một màu có
thể được đại diện bởi các giá trị hue, saturation và các giá trị thành
phần (HSV). Các phương pháp khác cho việc biểu diễn màu được gọi
là không gian màu.
– Toolbox cung cấp một tập các thủ tục để chuyển đổi giữa các không

gian màu. Các hàm xử lý ảnh tự chúng coi dữ liệu màu sắc dưới dạng
RGB tuy nhiên, ta có thể xử lý một ảnh mà sử dụng các không gian
màu khác nhau bằng cách chuyển đổi nó sang RGB sau đó chủn đởi
ảnh đã được xử lý trở lại khơng gian màu ban đầu.
• Chủn đởi định dạng các file ảnh.

Để thay đổi định dạng đồ hoạ của một ảnh, sử dụng hàm imread để đọc
một ảnh và sau đó lưu nó với hàm imwrite đồng thời chỉ ra định dạng
tương ứng.
15


– Để minh hoạ, ví dụ sau đây sử dụng hàm imread để đọc một file BMP
vào không gian làm việc.Sau đó, hàm imwrite lưu ảnh này dưới định
dạng PNG
Bitmap = imread(‘mybitmap.bmp’,’bmp’);
Imwrite(bitmap,’mybitmap.png’,’png’);
Số ảnh học.
Số học ảnh sự ứng dụng của các phép toán số học chuẩn như: cộng, trừ,
nhân, chia lên ảnh. Số học ảnh được sử dụng nhiều trong xử lý ảnh trong
cả các bước ban đầu lẫn các thao tác phức tạp hơn. Chẳng hạn, trừ ảnh có
thể được sử dụng để phát hiện sự khác nhau giữa hai hoặc nhiều ảnh của
cùng một cảnh hoặc một vật.
– Ta có thể thực hiện sớ học ảnh sử dụng các toán tử số học của Matlab.
Toolbox xử lý ảnh bao gồm một tập hợp các hàm ứng dụng các phép toán
số học trên tất cả các con số không lấp đầy. Hàm số học của toolbox chấp
nhận bất kì kiểu dữ liệu số nào bao gồm uint8, uint16 hay double và trả lại
ảnh kết quả trong cùng định dạng. Các hàm thực hiện các phép toán với độ
chính xác kép trên từng phần tử nhưng không chuyển đổi ảnh tới giá trị
chính xác kép trong khơng gian làm việc của Matlab. Sự tràn số được điều

khiển tự động. Hàm sẽ cắt bỏ giá trị trả về để vừa với kiểu dữ liệu.
• Ḷt cắt bỏ trong sớ học ảnh

– Kết quả của sớ học ngun có thể dễ dàng tràn số dùng cho lưu trữ.
Chẳng hạn, giá trị cực đại ta có thể lưu trữ trong uint8 là 255. Các phép
toán sớ học có thể trả về giá trị phân số – không được biểu diễn bởi một
chuỗi số nguyên.
– Các hàm số học ảnh sử dụng những luật này cho số học nguyên:
+ Giá trị vượt quá khoảng của kiểu sớ ngun bị cắt bỏ tới khoảng đó
16


+ Giá trị phân sớ được làm trịn Chẳng hạn, nếu dữ liệu có kiểu uint8, kết
quả trả về nếu lớn hơn 255 ( bao gồm Inf ) thì được gán là 255.
• Lời gọi lồng nhau tới hàm sớ học ảnh

– Ta có thể sử dụng các hàm sớ học ảnh kết hợp để thực hiện một chuỗi
các phép toán. Chẳng hạn để tính giá trị trung bình của hai ảnh:
C=(A+B) /2
Ta có thể nhập vào như sau:
I = imread(‘rice.png’);
I2 = imread(‘cameraman.tif’);
K = imdivide(imadd(I,I2),2);

– Khi được sử dụng với kiểu uint8 hay uint16, mỗi hàm số học cắt kết quả của
nó trước khi truyền nó cho hàm thiếp theo. Sự cắt bỏ này có thể giảm đáng kể
lượng thơng tin trong ảnh cuối cùng. Một cách làm tốt hơn để thực hiện một
chuỗi các tính toán là sử dụng hàm imlincomb. Hàm này thi hành tất cả các
phép toán sớ học trong sự kết hợp tún tính của độ chính xác kép và chỉ cắt
bỏ kết quả ći cùng:

K = imlincomb(.5,I,.5,I2);
• Biến đởi khơng gian ảnh

Biến đởi khơng gian ảnh là thực hiện ánh xạ giữa vị trí các pixel trong ảnh
vào với các pixel trong ảnh ra.
• Bảng thuật ngữ

Aliasing : Răng cưa – xuất hiện khi giảm kích thước ảnh. Khi kích thước của
một ảnh bị giảm, các pixel gốc bị lấy mẫu giảm để tạo ra ít pixel hơn. Aliasing
17


xảy ra như kết quả của việc giảm kích thước ảnh thường xuất hiện dưới dạng
bậc thang ( đặc biệt trong các ảnh có độ tương phản cao )
Antialiasing : Các biện pháp chống răng cưa cho ảnh
Bicubic interpolation : Giá trị của các pixel ra được tính toán từ giá trị trung
bình của 4×4 pixel lân cận
Bilinear interpolation : Gía trị của pixel ra được tính toán từ giá trị trung bình
của 2×2 pixel lân cận
Geometric operation : Một thao tác sửa đổi quan hệ hình học gữa các pixel
trong một ảnh. Chẳng hạn thay đởi kích thước ảnh, quay ảnh và xén ảnh
Interpolation : Quá trình được sử dụng để ước lượng giá trị ảnh ở một vị trí
giữa các pixel
Nearest-neighbor interpolation : Các giá trị pixel ra được gán giá trị của pixel
nằm trong một vùng gần pixel đó.
• Nội suy

Nội suy là quá trình sử dụng để ước lượng một giá trị ảnh ở một vị trí giữa
các pixel. Chẳng hạn, nếu ta thay đởi kích thước một ảnh, nó sẽ chứa nhiều
pixel hơn ảnh gớc, toolbox sử dụng sự nội suy để tính giá trị cho các pixel

thêm vào. Hàm imresize và imrotate sử dụng nội suy hai chiều để thực
hiện thao tác của mình. Hàm improfile cũng sử dụng sự nội suy hoá.
Các phương pháp nội suy
– Toolbox sử lý ảnh cung cấp 3 cách nội suy hoá
+ Nội suy các pixel gần nhất ( nearest –neighbor interpolation )
+ Nội suy song tuyến tính ( Bilinear interpolation )
+ Nội suy song khối ( Bicubic interpolation )
18


Các phương pháp nội suy làm việc theo một cách giớng nhau. Trong
mỗi trường hợp, để tính giá trị của một pixel đã được nội suy, chúng
tìm điểm trong ảnh ra mà pixel nằm tại đó. Sau đó, chúng gán một giá
trị tới các pixel ra bằng cách tính toán giá trị trung bình có trọng sớ của
một sớ pixel lân cận. Trọng số dựa trên cơ sở khoảng cách tới điểm
đang xét.
– Các phương pháp này khác nhau ở tập các pixel mà chúng xem xét:
+ Với nội suy các pixel gần nhất: pixel ra được gán giá trị của các pixel ở
gần nó nhất. Các pixel khác khơng được xem xét.
+ Nội suy song tuyến tính, giá trị của pixel ra là giá trị trung bình theo
trọng số của 2×2 pixel lân cận.
+ Nội suy song khới: giá trị của pixel ra là trung bình có trọng sớ của 4×4
pixel lân cận.
Sớ lượng các pixel được xem xét ảnh hưởng đến độ phức tạp tính toán.
Vì vậy, phương pháp song tuyến tính mất nhiều thời gian hơn phương
pháp thứ nhất và
phương pháp song khối mất nhiều thời gian hơn song tún tính. Tuy
nhiên, sớ lượng pixel lớn hơn, độ chính xác sẽ tớt hơn.
2. Xử Lý Ảnh Với OpenCV
2.1.


OpenCV là gì?

OpenCV được thiết kế một cách tới ưu, sử dụng tới đa sức mạnh của các dịng
chip đa lõi… để thực hiện các phép tính toán trong thời gian thực, nghĩa là tớc
độ đáp ứng của nó có thể đủ nhanh cho các ứng dụng thông thường. OpenCV
là thư viện được thiết kế để chạy trên nhiều nền tảng khác nhau (crosspatform), nghĩa là nó có thể chạy trên hệ điều hành Window, Linux, Mac, iOS
19


… Việc sử dụng thư viện OpenCV tuân theo các quy định về sử dụng phần
mềm mã nguồn mở BSD do đó bạn có thể sử dụng thư viện này một cách
miễn phí cho cả mục đích phi thương mại lẫn thương mại.
Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nó
được giới thiệu trong một hội nghị của IEEE về các vấn đề trong thị giác máy
và nhận dạng, tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chính
thức được cơng bớ và năm 2008 bản 1.1 (pre-release) mới được ra đời. Tháng
10 năm 2009, bản OpenCV thế hệ thứ hai ra đời (thường gọi là phiên bản
2.x), phiên bản này có giao diện của C++ (khác với phiên bản trước có giao
diện của C) và có khá nhiều điểm khác biệt so với phiện bản thứ nhất.
Thư viện OpenCV ban đầu được sự hỗ trợ từ Intel, sau đó được hỗ trợ bở
Willow Garage, một phịng thí nghiệm chun nghiên cứu về công nghệ
robot. Cho đến nay, OpenCV vẫn là thư viện mở, được phát triển bởi nguồn
quỹ không lợi nhuận (none -profit foundation) và được sự hưởng ứng rất lớn
của cộng đồng.
2.2.

Cách load ảnh và hiển thị một ảnh với OpenCV trong C++.

20



Trong OpenCV với giao diện C++, tất cả các kiểu dữ liệu ảnh, ma trận đều
được lưu dưới dạng cv::Mat. Hàm imread sẽ đọc ảnh đầu vào và lưu vào
biến img. Nguyễn mẫu của hàm này như sau: cv::Mat imread(const std::string
&filename, int flags) trong đó, filename là đường dẫn tới file ảnh, nếu file ảnh
không nằm trong thư mục làm việc hiện hành thì ta phải chỉ ra đường dẫn
tương đới có dạng như D:\Anh\abc.jpg. Flags là tham sớ loại ảnh mà ta muốn
load

vào,

cụ

thể

nếu

muốn

để CV_LOAD_IMAGE_COLOR, nếu

load


ảnh

ảnh

màu

xám

thì

ta

thì

ta

để CV_LOAD_IMAGE_GRAYSCALE….
Để hiển thị ảnh lên màn hình ta phải tạo ra một cửa sổ,
hàm namedWindow(const std::string &winname, int flags) sẽ tạo ra cửa sổ
với tiêu đề cửa sổ là một chuỗi string winname. Tham số flags sẽ chỉ ra kiểu
cửa sổ muốn tạo: nếu tham sớ CV_WINDOW_AUTOSIZE được sử dụng thì
kích cỡ cửa sở tạo ra sẽ được hiển thị một cách tự động tùy thuộc vào kích
thước

của

ảnh,

nếu



tham

sớ CV_WINDOW_AUTOSIZE_FULLSCREEN kích thước cửa sở sẽ khít với
màn hình máy tính…

Hàm imshow(const std::string winname, cv::InputArray Mat) sẽ hiển thị ảnh
ra cửa sổ đã được tạo trước đó.
Hàm waitKey(int delay) sẽ đợi cho đến khi có một phím được bấm vào trong
khoảng thời gian delay. Ta dùng hàm này mục đích là để dừng màn hình lại
trong một khoảng thời gian bằng tham sớ delay (tính theo đơn vị ms). Nếu
muốn dừng lại màn hình mãi ta đặt tham số delay bằng 0.
2.3.

Điều chỉnh độ sáng và độ tương phản trong ảnh

Một điểm ảnh được lưu trữ trên máy tính là một ma trận các điểm ảnh (hay
pixel). Trong OpenCV nó được biểu diễn dưới dạng cv::Mat. Ta xét một kiểu
21


ảnh thơng thường nhất, đó là ảnh RGB. Với ảnh này, mỗi pixel ảnh quan sát
được là sự kết hợp của các thành phần màu R (Red), G (Green), B (Blue). Sự
kết hợp này theo tỉ lệ R, G, B khác nhau sẽ tạo ra vô số các màu sắc khác
nhau. Giả sử ảnh được mã hóa bằng 8 bit với từng kênh màu, khi đó mỗi giá
trị của R, G, B sẽ nằm trong khoảng [0, 255]. Như vậy, ta có thể biểu diễn tới
255*255*255 ~ 1,6 triệu màu từ ba màu cơ bản trên. Ta có thể xem cách biểu
diễn ảnh trong OpenCV ở định dạng cv::Mat qua hình ảnh sau:

Như vậy, mỗi ảnh sẽ có n hàng và m cột, m được gọi là chiều dài của ảnh, n
được gọi là chiều cao của ảnh. Mỗi pixel ở vị trí (i, j) trong ảnh sẽ tương ứng
với 3 kênh màu kết hợp trong nó. Để truy xuất tới từng pixel ảnh với những
kênh màu riêng ta sẽ sử dụng mẫu sau:
img.at<cv::Vec3b>(i, j)[k]
Trong đó, i, j là pixel ở hàng thứ i và cột thứ j, img là ảnh mà ta cần truy xuất
tới các pixel của nó. Cv::Vec3b là kiểu vector uchar 3 thành phần, dùng để

biểu thị 3 kênh màu tương ứng. k là kênh màu thứ k, k= 0,1,2,… tương ứng
với kênh màu B, G, R. Chú ý là trong OpenCV, hệ màu RGB được biểu diễn
theo thứ tự chữ cái là BGR.
Sau đây ta sẽ áp dụng kiến thức trên để làm tăng, giảm độ sáng và tương phản
của một ảnh màu, việc làm này cũng hồn tồn tương tự đới với ảnh xám, chỉ
khác biệt là ảnh ta dùng một kênh duy nhất để biểu diễn ảnh xám.
Giả sử f là một hàm biểu diễn cho một ảnh nào đó, f(x,y) là giá trị của pixel
trong ảnh vị trí (x,y). Đặt g(x,y) = αf(x,y) + β. Khi đó, nếu , thì ta nói
22


ảnh g(x,y) có độ tương phản gấp lần so với ảnh f(x,y. Nếu ta nói độ sáng của
ảnh g(x,y) đã thay đổi một lượng là . Dựa vào công thức trên ta có chương
trình thay đởi độ sáng và tương phản của ảnh như sau:

Trong chương trình trên, hàm clone() sẽ sao chép một ảnh giống hệt như ảnh
gốc cho vào ảnh đích (drt = src.clone()). Giá trị của các pixel
ảnh f(x,y) và g(x,y) ở đây phải nằm trong khoảng [0,255], trong khi phép biến
đổi g(x,y) = αf(x,y) + β có thể khiến cho giá trị g(x,y) vượt qua ngưỡng đó. Để
tránh tình trạng tràn sớ hoặc kiểu dữ liệu khơng tương thích, ta dùng thêm
hàm saturate_cast<uchar>(type). Hàm này sẽ biến kiểu dữ liệu type nếu
không phải là uchar thành kiểu dữ liệu uchar.
Sau đây là kết quả với α = 2.0 và β = 30.

23


Phóng to, thu
nhỏ và xoay ảnh
2.4.


Phóng to, thu nhỏ và xoay ảnh

Ảnh số thực chất là một ma trận các điểm ảnh, do đó để có thể phóng to, thu
nhỏ hay xoay một tấm ảnh ta có thể sử dụng các thuật toán tương ứng trên ma
trận
Ta sẽ sử dụng biến đổi affine để quay và thay đổi tỉ lệ to, nhỏ của một ma trận.
Biến đối affine
Giả sử ta có vector

và ma trận M có kích thước 2x2. Phép biến

đổi affine trong không gian hai chiều được định nghĩa p’ = Mp, trong
đó:
Viết một cách tường minh ta có:

Hay x' = αx + δy, y' = γx + βy.
Xét ma trận
24


Nếu δ = γ, khi đó x' = αx và y' = βy, phép biến đổi này làm thay đổi tỉ lệ của
ma trận. Nếu là trong ảnh nó sẽ phóng to hoặc thu nhỏ ảnh. Hình sau mơ tả
phép biến đổi với tỉ lệ α = β = 2.

Nếu ta định nghĩa ma trận
thì phép biến đổi sẽ vừa là phép biến đổi theo tỉ lệ và quay.
Bây giờ ta sẽ xét chương trình phóng to, thu nhỏ và quay ảnh.

25



×