Code thuật toán chuyển màu ảnh xám thành ảnh màu

Xử lý ảnh là quá trình thao tác trên ảnh đầu vào có thể là một hình ảnh, một khung hình video.., đầu ra là một hình ảnh đáp ứng nhu cầu người dùng hay tập hợp các thông số liên quan đến hình ảnh.

2. Các khái niệm cơ bản trong xử lý ảnh.

  1. Ảnh và điểm ảnh

Ảnh được xem là một tập hợp các điểm ảnh, mỗi điểm ảnh là đặc trưng cường độ sáng trong không gian ảnh.

  1. Không gian màu (RGB – Red Green Blue)

Các điểm ảnh được tạo thành từ sự tổ hợp 3 màu chính R (red), G (green), B (blue). Cùng một giá trị có thể hiển thị khác nhau trên các thiết bị khác nhau.

Màu 16 bit: mỗi màu được mã hóa bằng 5bit ( kiểu 555) hay thêm một bit còn lại cho mau xanh lá cây (kiểu 565).

Màu 24 bit: mỗi kênh màu được mã hóa bằng 1 byte (8 bit) có giá trị nằm trong đoạn [0-255] mã hóa được 255 * 255 * 255 = 16,581,375 màu hay gọi là 16 triệu màu.

Màu 32 bit: tương tự như màu 24 bit, nhưng ở đây có 8 bit dư không sử dụng ( ngoại trừ khả năng sử dụng như kênh alpha). Có vận tốc cao hơn mà phần lớn các phần cứng ngày nay có thể truy cập theo các địa chỉ byte của cấp số 2.

Màu 48 bit: tương tự màu 16 bit nhưng mỗi thành phần được mã hóa bởi 16 bit màu, điều này làm cho mỗi màu có khả năng biểu thị 65.535 sắc thái thay vì chỉ có 255. Được sử dụng trong chỉnh sửa ảnh chuyên nghiệp do có độ chính xác cao hơn.

Màu RGBA: với việc xuất hiện nhu cầu ghép ảnh, việc thêm vào 8 bit dư cho độ trong suốt tạo thành màu 32 bit với một kênh mới là Alpha, biểu diễn độ trong suốt của điểm ảnh

  1. Ảnh xám (gray image)

Ảnh xám hay còn gọi là ảnh đơn sắc (monochromatic). Ảnh 8 mức xám mỗi điểm ảnh sẽ có giá trị nằm trong đoạn [0-7], ảnh 256 mức xám mỗi điểm ảnh sẽ có giá trị nằm trong đoạn [0-255].

Giá trị của điểm ảnh bằng 0 đại diện cho điểm ảnh tối (đen), giá trị điểm ảnh lơn nhất đại diện cho điểm ảnh sáng (trắng).

Độ sáng được tính theo công thức: (chuyển đổi từ hệ màu RGB)

S = 0.2989R + 0.5870G + 0.1140B

Ví dụ biểu diễn ảnh xám

0 4 16 7 154 136 0 98 255 198 154 1 200 236 234 0

  1. Ngưỡng xám (threshold)

Cách phổ biến nhất để tạo ra một ảnh nhị phân từ một ảnh xám là chọn một ngưỡng sao cho tất cả các điểm ảnh ít quan tâm có giá trị thấp hơn ngưỡng sẽ có màu trắng và cá điểm ảnh được quan tâm có giá trị cao hơn ngưỡng sẽ có màu đen hoặc ngược lại.

  1. Ảnh nhị phân (binary image)

Ảnh nhị phân là ảnh số, trong đó mỗi điểm ảnh được biểu diễn bởi giá trị là 0 (trắng) hoặc 1 (đen). Ảnh nhị phân được tạo ra bằng cách biến đổi ảnh xám dựa vào một ngưỡng xác định.

Với là ngưỡng xám

Ví dụ biểu diễn ảnh nhị phân:

0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0

Thuật toán chuyển ảnh màu sang ảnh nhị phân dùng ngưỡng trung bình:private static WriteableBitmap ToAverageBinary(WriteableBitmap grayscale){

WriteableBitmap binary = new WriteableBitmap(grayscale.PixelWidth, grayscale.PixelHeight);

int[] histogramData = new int[256];

int maxCount = 0;

//xác định histogram cho ảnh xám

for (int pixelIndex = 0; pixelIndex < grayscale.Pixels.Length; pixelIndex++)

{

byte intensity = (byte)grayscale.Pixels[pixelIndex];

//thêm 1 biến điếm cường độ

histogramData[intensity]++;

if (histogramData[intensity] > maxCount)

{

maxCount = histogramData[intensity];

}

}

//tính cường độ sáng trung bình

long average = 0;

for (int intensity = 0; intensity < 256; intensity++)

{

average += intensity * histogramData[intensity];

}

//tính ngưỡng

average /= grayscale.Pixels.Length;

for (int pixelIndex = 0; pixelIndex < grayscale.Pixels.Length; pixelIndex++)

{

byte intensity = (byte)grayscale.Pixels[pixelIndex];

//thay các pixel lớn hơn ngưỡng thành màu trắng và các pixel nhỏ hơn ngưỡng thành màu đen

if (intensity >= average)

{

intensity = 255;

unchecked { binary.Pixels[pixelIndex] = (int)0xFFFFFFFF; }

}

else

{

intensity = 0;

unchecked { binary.Pixels[pixelIndex] = (int)0xFF000000; }

}

}

return binary;

}

  1. Ảnh số (digital image)

Là tập hợp hữu hạn cá điểm ảnh biểu diễn bởi một ma trận 2 chiều v[x, y], mỗi phần tử của ma trận tương ứng với một điểm ảnh. Với x, y là tọa độ điểm ảnh trong không gian ảnh và độ lớn của hàm f(x, y) hay còn gọi là độ sáng (intensity) và độ xám (gray level) của ảnh tại điểm đó.

  1. Ghi nhãn thành phần liên kết (connected-component labeling)

Ghi nhãn thành phần liên kết (còn có tên connected-component analysis, blob extraction, region labeling, blob discovery, or region extraction) là một ứng dụng của thuật toán lý thuyết đồ thị. Tập hợp con của các thành phần kết nối được dán cùng một nhãn duy nhất.

Có hai phương pháp ghi nhãn là liên kết 4 (4-connectivity: xét 4 điểm xung quanh nằm trên đường ngang hoặc dọc) hoặc liên kết 8 (8-connectivity: xét 8 điểm xung quanh kể ca đường chéo)

Code thuật toán chuyển màu ảnh xám thành ảnh màu

Ví dụ thuật toán 2-pass algorithm:

Code thuật toán chuyển màu ảnh xám thành ảnh màu

Thuật toán 2-pass algorithm trước khi chạy

Code thuật toán chuyển màu ảnh xám thành ảnh màu

Thuật toán 2-pass algorithm sau khi đã tô màu

linked = []

labels = structure with dimensions of data, initialized with the value of Background

for row in data:

for column in row:

if data[row][column] is not Background

neighbors = connected elements with the current element’s value

if neighbors is empty

linked[NextLabel] = set containing NextLabel

labels[row][column] = NextLabel

NextLabel += 1

else

Find the smallest label

L = neighbors labels

labels[row][column] = min(L)

for label in L

linked[label] = union(linked[label], L) Second pass

for row in data

for column in row

if data[row][column] is not Background

labels[row][column] = find(labels[row][column])

return labels

  1. Thuật toán phát hiện cạnh (Edge detection)

Toán Học: Như phương pháp dẫn xuất, các phương pháp dựa trên mẫu cố gắng để phát hiện các cạnh tron ảnh bằng cách phát hiện những thay đổi đột ngột của màu xám. Các phương pháp này sử dụng mẫu có mô hình cạnh. Thuật toán phát hiện cạnh Sobel sử dụng hai mẫu, mô hình thay đổi theo trục x và y. Các mẫu Sobel được xác định như sau:

Code thuật toán chuyển màu ảnh xám thành ảnh màu
Với mỗi điểm ảnh trên ảnh, cả hai mẫu được áp dụng cho các khu vực 3×3 xung quanh các điểm ảnh. Các giá trị màu xám của điểm ảnh xung quanh được nhân với giá trị tương ứng với ma trận và sau đó tổng hợp lại với nhau Trong đó, T là một trong hai Sx ( đối với trục x) hoặc Sy (đối với trục y). Các giá trị tuyệt đối của lx và ly được thu gọn:

Code thuật toán chuyển màu ảnh xám thành ảnh màu
Code thuật toán chuyển màu ảnh xám thành ảnh màu

Cuối cùng, so sánh chúng với ngưỡng và các điểm ảnh được đánh dấu là cạnh nếu chúng lớn hơn so với ngưỡng.

Một phương pháp khác dựa trên mẫu là phương pháp Kirsch, sử dụng 8 mẫu thay vì 2 mô hình mẫu 8 hướng có thể : trái-phải, trên-dưới, phía trên bên trái – phía dưới bên phải,… Mỗi pixel của ảnh có tất cả 8 mẫu được áp dụng và là tối đa để chọn để so sánh với ngưỡng.

Thuật toán phát hiện cạnh Krisch hoạt động trên các kênh R của hình ảnh. của

private static WriteableBitmap FilterProcessImage(WriteableBitmap image)

{

WriteableBitmap ret = new WriteableBitmap(image.PixelWidth, image.PixelHeight);

for (int i = 1; i < image.PixelWidth – 1; i++)

{

for (int j = 1; j < image.PixelHeight – 1; j++)

{

Color cr = image.GetPixel(i + 1, j);

Color cl = image.GetPixel(i – 1, j);

Color cu = image.GetPixel(i, j – 1);

Color cd = image.GetPixel(i, j + 1);

Color cld = image.GetPixel(i – 1, j + 1);

Color clu = image.GetPixel(i – 1, j – 1);

Color crd = image.GetPixel(i + 1, j + 1);

Color cru = image.GetPixel(i + 1, j – 1);

int power = getMaxD(cr.R, cl.R, cu.R, cd.R, cld.R, clu.R, cru.R, crd.R);

if (power > 50)

ret.SetPixel(i, j, Colors.White);

else

ret.SetPixel(i, j, Colors.Black);

}

}

return ret;

}

private static int getD(int cr, int cl, int cu, int cd, int cld, int clu, int cru, int crd, int[,] matrix)