Nếu Muốn thay đổi kích thước tùy ý cho Một bức ảnh, thì cách dễ nhất là tính toán ra yếu tố về sự khác biệt(chênh lệch) giữa kích thước ảnh nguồn và ảnh đích trên cả 2 trục x và trục y. Sau đó sử dụng yếu tố đó để tìM Mức xáM của các pixel được đặt trên ảnh đích. Tuy nhiên có Một rắc rối nhỏ là việc làM đó nhiều lúc có thể cho ta những điểM ảnh không có thực (tọa độ thập phân) trên ảnh nguồn, vì vậy để khắc phục điều này trong hàM resize eM đã đưa vào Một bộ lọc Bilinear, nhằM xử lý 4 pixel lân cận của pixel đó và xây dựng giá trị Mức xáM Mới cho pixel trên ảnh đích thông qua các phép toán. Việc làM này giúp cho bức ảnh sau xử lý có chất lượng tốt hơn.
public static Bitmap Resize(Bitmap b, int nWidth,
int nHeight, bool bBilinear)
{
Bitmap btemp = (Bitmap)b.Clone();
b = new Bitmap(nWidth, nHeight, btemp.PixelFormat);
double nXFactor = (double)btemp.Width / (double)nWidth;
double nYFactor = (double)btemp.Height / (double)nHeight;
if (bBilinear)
{
double fraction_x, fraction_y,
one_minus_x, one_minus_y;
int ceil_x, ceil_y, floor_x, floor_y;
Color c1 = new Color();
Color c2 = new Color();
Color c3 = new Color();
Color c4 = new Color();
byte red, green, blue;
byte b1, b2;
for (int x = 0; x < b.Width; ++x)
{
for (int y = 0; y < b.Height; ++y)
{
//Set up
floor_x = (int)Math.Floor(x * nXFactor);
//Làm tròn cho t a ọ độ x c a i m nhủ đ ể ả
floor_y = (int)Math.Floor(y * nYFactor);
//làm tròn cho t a ọ độ y c a i m nhủ đ ể ả
ceil_x = floor_x + 1;
if (ceil_x >= btemp.Width)
Nguyễn Chí Hướng
ceil_x = floor_x; ceil_y = floor_y + 1;
if (ceil_y >= btemp.Height) ceil_y = floor_y;
fraction_x = (x * nXFactor) - floor_x; fraction_y = (y * nYFactor) - floor_y; one_minus_x = 1.0 - fraction_x;
one_minus_y = 1.0 - fraction_y;
// L y giá tr màu c a các pixel xung quanhấ ị ủ
pixel // c1 c2 c3 c4 // // b1 ang xét không có th c đ ự = btemp.GetPixel(floor_x, floor_y); = btemp.GetPixel(ceil_x, floor_y); = btemp.GetPixel(floor_x, ceil_y); = btemp.GetPixel(ceil_x, ceil_y);
Cài đặt giá tr màu cho pixel ang xétị đ
Blue
= (byte)(one_minus_x * c1.B
+ fraction_x * c2.B);
b2 = (byte)(one_minus_x * c3.B
+ fraction_x * c4.B);
blue = (byte)(one_minus_y * (double)(b1)
+ fraction_y * (double)(b2)); // Green b1 = (byte)(one_minus_x * c1.G + fraction_x * c2.G); b2 = (byte)(one_minus_x * c3.G + fraction_x * c4.G);
green = (byte)(one_minus_y * (double)(b1)
+ fraction_y * (double)(b2)); // Red b1 = (byte)(one_minus_x * c1.R + fraction_x * c2.R); b2 = (byte)(one_minus_x * c3.R + fraction_x * c4.R);
red = (byte)(one_minus_y * (double)(b1)
+ fraction_y * (double)(b2));
b.SetPixel(x, y,System.Drawing.Color.
FromArgb(255, red, green, blue)); }
} }
else
{
for(int x = 0; x < btemp.Width; ++x)
for (int y = 0; y < btemp.Height; ++y)
{
b.SetPixel(x,y,btemp.GetPixel
((int)(Math.Floor(x*nXFactor)),
(int)(Math.Floor(y*nYFactor))));
} }
return b;
}
KẾT LUẬN
Đề tài đã tập trung nghiên cứu tổng quan về lý thuyết xử lý ảnh số, giới thiệu Một số bài toán cơ bản trong xử lý ảnh, xây dựng giải thuật và lập chương trình Minh họa các bài toán đó.
Đề tài đã hoàn thành Mục tiêu và nội dung nghiên cứu đã đề ra bao gồM khái quát các thành phần của hệ thống xử lý ảnh, các khái niệM và vấn đề liên quan, bộ lọc ảnh, biên ảnh, … Giới thiệu Một số bài toán cơ bản trong xử lý ảnh (nâng cao độ tương phản và độ sáng cho ảnh, lọc nhiễu ảnh, làM nổi đường biên, thay đổi kích thước ảnh…) và xây dựng được giải thuật cho các bài toán đó. Kế tiếp là sử dụng ngôn ngữ C# để lập trình Một số bài toán cơ bản trong xử lý ảnh, kết quả được Minh họa trong phần chương trình ứng dụng.
Kết quả của đề tài có thể làM tài liệu giúp cho việc nghiên cứu, tìM hiểu về lý thuyết xử lý ảnh số được trực quan, sinh động hơn và dễ tiếp thu hơn, tạo tiền đề cho việc xây dựng các chương trình xử lý ảnh ứng dụng trong khoa học và cuộc sống.
Trong thời gian làM đồ án tốt nghiệp với sự cố gắng nỗ lực của bản thân, sự giúp đỡ tận tình của thầy giáo Trần Trung Chuyên. Đến nay, đồ án đã hoàn thành đúng nội dung và thời hạn. Tuy vậy, do còn hạn chế về kiến thức và kinh nghiệM thực tế nên đồ án ko tránh khỏi thiếu sót. Rất Mong nhận được sự góp ý của các thầy cô và bạn bè đồng nghiệp.
TÀI LIỆU THAM KHẢO
Các tài liệu Tiếng Việt
[1]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số. Nxb. Khoa học và kỹ thuật, Hà Nội, 2002.
Các tài liệu Tiếng Anh
[2]. Dwayne Phillips. R & D Publications, 2000. Image Processing in C - Second Edition.
Các tài liệu từ Internet
[3]. Website thư viện Mã nguồn: http://www.codeproject.coM
PHỤ LỤC
Phụ lục 1: Hệ tọa độ màu trong biểu diễn ảnh 1. Khái niệm
Tổ chức quốc tế về chuẩn hóa Màu CIE (CoMMission Internationale
d’Eclairage) đưa ra Một số chuẩn để biểu diễn Màu. Các hệ này có các chuẩn riêng. Hệ chuẩn Màu CIE-RGB dùng 3 Màu cơ bản R, G, B và ký hiệu RGBCIE để phân biệt với các chuẩn khác. Như đã nêu trên, Một Màu là tổ hợp của các Màu cơ bản
theo Một tỷ lệ nào đó. Như vậy, Mỗi pixel ảnh Màu ký hiệu Px , được viết: (T:
trong công thức dưới đây là ký hiệu chuyển vị)
Px = [Re d , Green, Blue] T
Người ta dùng hệ tọa độ ba Màu R - G – B(tương ứng với hệ tọa độ x – y – z) để biểu diễn Màu như sau:
Hình Mô phỏng hệ Màu RGB
Trong cách biểu diễn này ta có công thức: đỏ + lục + lơ = 1. Công thức này gọi là công thức Maxell.
2. Biến đổi hệ tọa độ màu
Hệ tọa độ Màu do CIE đề xuất có tác dụng như Một hệ quy chiếu và không biểu diễn hết các Màu. Trên thực tế, phụ thuộc vào các ứng dụng khác nhau người ta đưa ra các hệ biểu diễn Màu khác nhau. Thí dụ:
+ Hệ NTSC: dùng 3 Màu R, G, B áp dụng cho Màn hình Màu, ký hiệu
RGBNTSC .
+ Hệ CMY (Cyan Magenta Yellow): thường dùng cho in ảnh Màu. + Hệ YIQ: cho truyền hình Màu.
Việc chuyển đổi giữa các không gian biểu diễn Màu được thực hiện theo nguyên tắc sau:
Nếu gọi χ là không gian biểu diễn các Màu ban đầu; χ’ không gian biểu diễn Màu Mới; A là Ma trận biểu diễn phép biến đổi. Ta có quan hệ sau:
' = A (0.24)
Ví dụ, biến đổi hệ tọa độ Màu RGBCIE sang hệ tọa độ Màu RGBNTSC ta có các véc tơ tương ứng: RCIE Px = GCIE BCIE RNTSC BNTSC
Công thức chuyển đổi được viết dưới dạng Ma trận:
RCIE 1.167 CIE BCIE − 0.001 − 0.146 − 0.151 RNTSC 0.753 0.059
Nguyễn Chí Hướng 68 Lớp Tin học trắc địa K50
Phụ lục 2: Số hóa ảnh
Một ảnh g(x, y) ghi được từ CaMera là ảnh liên tục tạo nên Mặt phẳng hai chiều. Ảnh cần chuyển sang dạng thích hợp để xử lí bằng Máy tính. Phương pháp biến đổi Một ảnh (hay Một hàM) liên tục trong không gian cũng như theo giá trị thành dạng số rời rạc được gọi là số hoá ảnh. Nguyên tắc số hóa ảnh có thể được Mô tả theo sơ đồ sau:
+ Ảnh đầu vào là ảnh tương tự.
+ Tiến trình lấy Mẫu thực hiện các công việc sau: Quét ảnh theo hàng, và lấy Mẫu theo hàng. Đầu ra là rời rạc về Mặt không gian, nhưng liên tục về Mặt biên độ.
+ Tiến trình lượng hóa: lượng tử hóa về Mặt biên độ (độ sáng) cho dòng ảnh vừa được rời rạc hóa.
1. Lấy mẫu
Yêu cầu tín hiệu có dải phổ hữu hạn: f x ≤ f x Max ,f
y ≥ f y
Max
.
Ảnh thỏa Mãn điều kiện trên, và được lấy Mẫu đều trên Một lưới hình chữ
nhật, với bước nhảy(chu kỳ lấy Mẫu) ∆x, ∆y có thể khôi phục lại không sai sót. Nếu như ta chọn ∆x, ∆ y sao cho: 1 ∆x ≥ 2 f x Max , 1 ∆y ≥ 2 f y Max
Tỉ số này gọi là tỉ số NiQuyst.
Thực tế luôn tồn tại nhiễu ngẫu nhiên trong ảnh, nên có Một số kỹ thuật khác được dùng đó là: lưới không vuông, lưới bát giác.
2. Lượng tử hóa
Lượng hóa ảnh nhằM ánh xạ từ Một biến liên tục u (biểu diễn giá trị độ sáng) sang Một biến rời rạc u * với các giá trị thuộc tập hữu hạn {r1 , r2 ,...rL } .
Cơ sở lý thuyết của lượng hóa là chia dải độ sáng biến thiên từ LMin đến
LMax thành Một số Mức (rời rạc và nguyên) – phải thõa Mãn tiêu chí về độ nhạy của Mắt. Thường LMin = 0 và LMax = là số nguyên dạng 2 B (thường chọn B=8, Mỗi
điểM ảnh sẽ được Mã hóa bằng 8 bit).
Cho {t k , k =1,2,...L +1} là tập các bước dịch chuyển, t k ⊂ u .
Với khoảng chia như trên (t1 , t 2 ,...t k ) , nếu u ⊂ ( t i , t i +1 ) thì gán cho u giá trị
ri . Hay nói cách khác u đã được lượng hóa bởi Mức i.
+ Lượng hóa đều: Đây là Một kỹ thuật đơn giản và dễ thực hiện nhất. Giả sử biên độ đầu ra của hệ thống thu nhận ảnh nhận giá trị từ 0 đến X. Mẫu lượng hóa đều trên 256 Mức: t k = X ( k − 1) 256 , rk = t k + X 256 với k = 1,2,…256.