Tải bản đầy đủ (.pptx) (30 trang)

Lược đồ histogram - ứng dụng hiệu chỉnh ảnh trong xử lý ảnh

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 (1.48 MB, 30 trang )

Bài Thảo Luận
Môn: Xử lý ảnh
Đề tài: Lược đồ histogram. Ứng dụng hiệu chỉnh ảnh
GVHD: Cao Ngọc Ánh
Lớp: ĐH Tin4a1
Các thành viên trong nhóm:
Nguyễn Văn Lý
Nguyễn Ngọc Giáp
Nguyễn Văn Tú
Nguyễn Văn Trung
1. Histogram
1.1. Khái niệm
- Histogram hay lược đồ mức xám là đồ thị thể hiện mối quan hệ giữa mức xám và các điểm ảnh có chung mức
xám, thể hiện tần suất xuất hiện mỗi mức xám trong ảnh.
- Lược đồ xám biểu diễn trong hệ tọa độ oxy: trục hoành biểu diễn số mức xám từ 0 đến 255. trục tung biểu diễn
số điểm ảnh có cùng mức xám tương ứng.
- Lược đồ xám cung cấp thông tin về phân bố mức xám và cường độ sáng của ảnh. Với những ảnh mà phân bố
histogram lệch về bên phải thì ảnh đó là một ảnh có độ sáng tốt. Nếu ảnh tối thì lược đồ xám lệch về bên trái
1.2. một số ví dụ
- Histogram tốt có hình ngọn núi với độ cao tăng dần từ trái, cao
nhất ở giữa và thấp nhất ở bên phải. Điều đó chứng tỏ số lượng điểm ảnh nhiều nhất là ở độ sáng trung bình.
- Ảnh bị quá tối: histogram bị nghiêng về bên trái, có một cái cột gần như thẳng đứng sát trái
- Ảnh bị quá sáng: histogram bị nghiêng về bên phải, có một cái cột gần như thẳng đứng sát phải
- Ảnh bị quá tương phản: có hai cái cột nằm ở 2 đầu trái phải
-
Ảnh bị kém tương phản: dải màu bị dồn vào giữa, hai đầu không có gì
2. Các phép biến đổi trên lược đồ xám và ứng dụng.
2.1. Hiển thị lược đồ xám của ảnh
Theo định nghĩa của lược đồ xám, thuật toán xây dựng lược đồ xám có thể mô tả như sau:
Giải thuật:
Bắt đầu


H là bảng chứa lược đồ xám (là vec tơ có N phần tử)
Bước 1: Khởi tạo bảng
Đặt tất cả các phần tử của bảng là 0
Bước 2: Tạo bảng
Với mỗi điểm ảnh I(x,y) tính H[I(x,y)] = H[I(x,y)] + 1
Bước 3: Tính giá trị Max của bảng H. Sau đó hiện bảng trong khoảng từ 0 đến Max.
Kết thúc
Cài đặt:
int x, y;
for (y = 0; y < bm.Height - 1; y++)
{
for (x = 0; x < bm.Width - 1; x++)
h[bm.GetPixel(x, y).R] += 1;
}
- Ví dụ về hiển thị Lược đồ xám của ảnh.
Lược đồ xám là một
công cụ hữu hiệu
dùng trong nhiều
công đoạn của xử lý
ảnh như tăng cường
ảnh.
2.2. Các phép biến đổi trên histogram.
- Tổ chức đồ là một đặt trưng quan trọng của ảnh, dựa vào lược đồ chúng ta có thể nhận dạng sơ về ảnh, có kết
luận cơ bản về ảnh: ảnh sáng, tối, độ tương phản thấp, cao…. Với lý do đó, chúng ta có một số phép xử lý cơ bản
sau:
+ Trượt histogram
+ Căng biểu đồ
+ Sửa chữa tổ chức đồ (kết hợp giữa căng và trượt)
+ Cân bằng (san bằng) biểu đồ
- Sau đây chúng ta sẽ đi vào các hiệu chỉnh ảnh với các phép xử lý trên histogram.

2.2.1. Trượt histogram.
- Mục đích: Mục đích: làm tăng hoặc giảm cường độ xám của ảnh
- Ý tưởng:
O(x,y) = I(x,y) + n
+ n < 0 : trượt ảnh về bên trái => ảnh tối hơn
+ n > 0 : trượt ảnh về bên phải => ảnh sáng hơn
Chú ý: Kết quả của O(x,y) có thể > 255 hoặc < 0 vì vậy cần chú ý để set lại 2 giá trị này.
- Hàm cài đặt:
private Bitmap Truot_HisToGram(Bitmap bm, int n
{
Bitmap bitmap = new Bitmap(bm);
int x, y;
Color c;
for (y = 0; y < bitmap.Height - 1; y++)
{
for (x = 0; x < bitmap.Width - 1; x++)
{
c = bitmap.GetPixel(x, y);
if ((c.R + n) <= 255 && (c.R + n) >= 0)
bitmap.SetPixel(x, y, Color.FromArgb(c.R + n, c.R + n, c.R + n));
else if ((c.R + n) > 255)
bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
else if ((c.R + n) < 0)
bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
}
}
return bitmap;
}
- Sau đây là hình ảnh so sánh giữa trước và sau khi trượt với các hệ số 80 và -30
ảnh trước khi trượt

ảnh sau khi trượt với hệ số 80
Histogram tương
ứng
ảnh trước khi trượt
ảnh sau khi trượt với hệ số
-30
Histogram tương
ứng
2.2.2. Phép căng tổ chức đồ.

Mục đích: làm thay đổi độ tương phản của ảnh

Ý tưởng: Thông thường trong một số ảnh,các giá trị xám không phủ đều toàn bộ dải xám sẵn có mà chỉ tập
chung vào một khoảng nhất định,điều này làm ảnh bị sáng quá, tối quá, hoặc độ tương phản kém.Vì vậy giải
pháp được đưa ra là kéo dãn dải xám ra mức lớn nhất có thể.
O(x,y) = I(x,y) * n (với n > 0)
+ n > 1 : mở rộng chân tổ chức đồ
=> tăng độ tương phản của ảnh

Hàm cài đặt:
private Bitmap Codan_HisToGram(Bitmap bm, int n)
{
if (n <= 0)
return null;
Bitmap bitmap = new Bitmap(bm);
int x, y;
Color c;
for (y = 0; y < bitmap.Height - 1; y++)
{
for (x = 0; x < bitmap.Width - 1; x++)

{
c = bitmap.GetPixel(x, y);

if ((c.R * n) <= 255 && (c.R * n) >= 0)
bitmap.SetPixel(x, y, Color.FromArgb(c.R * n, c.R * n, c.R * n));
else if ((c.R * n) > 255)
bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
else if ((c.R * n) < 0)
bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
}
}
return bitmap;
}
So sánh giữa trước và sau khi co dãn
ảnh trước khi căng
ảnh sau khi căng với hệ số 2
Histogram tương
ứng
2.2.3. Sửa chữa tổ chức đồ.

Mục đích: nhằm có một tổ chức đồ tối ưu
=> nâng cao chất lượng ảnh

Ý tưởng:
+ Kết hợp giữa trượt và căng tổ chức đồ.
+ Trượt tổ chức đồ về bên trái sao cho mức xám nhỏ nhất.
+ Căng tổ chức đồ sao cho mức xám lớn nhất (có giá trị).
O(x,y) = I(x,y) * 255 / max(h())

Các bước thực hiện:

+ Bước 1: xác định số điểm ảnh cho mỗi mức xám.
+ Bước 2: xác định mức xám nhỏ và mức xám lớn nhất.
+ Bước 3: kết hợp trượt và căng dải biểu đồ.
Hàm cài đặt:
private void GetH(Bitmap bm , int[]
toH)
{
int x, y;
for(y = 0;y<bm.Height - 1;y+
+)
{
for( x = 0;x<bm.Width -
1;x++)
{
toH[bm.GetPixel(x,
y).R] += 1;
}
}
}

Hàm cài đặt:
private void GetH(Bitmap bm , int[]
toH)
{
int x, y;
for(y = 0;y<bm.Height - 1;y+
+)
{
for( x = 0;x<bm.Width -
1;x++)

{
toH[bm.GetPixel(x,
y).R] += 1;
}
}
}

private Byte HistogramLeft(int [] h)
{
for(int i= 0;i<h.Length - 1;i++)
{
if( h[i]!= 0)
return (byte)i;
}
return 0;
}
private Byte HistogramRight(int [] h)
{
for(int i = h.Length - 1;i>0;i )
{
if (h[i]!=0)
return (byte)i;
}
return 0;
}
private Byte HistogramLeft(int [] h)
{
for(int i= 0;i<h.Length - 1;i++)
{
if( h[i]!= 0)

return (byte)i;
}
return 0;
}
private Byte HistogramRight(int [] h)
{
for(int i = h.Length - 1;i>0;i )
{
if (h[i]!=0)
return (byte)i;
}
return 0;
}
private Bitmap Suachua_Histogram(Bitmap bm)
{
Bitmap bitmap = new Bitmap(bm);
//Tinh h(x)
int[]hL = new int[256];
int[]hR = new int[256];
GetH(bitmap, hL);
//Tim Trai & truot trai
int left = HistogramLeft(hL);
bitmap = new Bitmap(Truot_HisToGram(bm,
left));
//Tinh tien ve 0 va copy hL qua hR
Array.Copy(hL, left, hR, 0, hL.Length - left);
private Bitmap Suachua_Histogram(Bitmap bm)
{
Bitmap bitmap = new Bitmap(bm);
//Tinh h(x)

int[]hL = new int[256];
int[]hR = new int[256];
GetH(bitmap, hL);
//Tim Trai & truot trai
int left = HistogramLeft(hL);
bitmap = new Bitmap(Truot_HisToGram(bm,
left));
//Tinh tien ve 0 va copy hL qua hR
Array.Copy(hL, left, hR, 0, hL.Length - left);
int x, y;
Byte c;
Byte max = HistogramRight(hR);
for (y = 0; y < bitmap.Height - 1; y++)
{
for (x = 0; x < bitmap.Width - 1; x++)
{
c = bitmap.GetPixel(x, y).R;
c = (byte)((c * 255)/max);
bitmap.SetPixel(x, y, Color.FromArgb(c, c,
c));
}
} return bitmap;
}
int x, y;
Byte c;
Byte max = HistogramRight(hR);
for (y = 0; y < bitmap.Height - 1; y++)
{
for (x = 0; x < bitmap.Width - 1; x++)
{

c = bitmap.GetPixel(x, y).R;
c = (byte)((c * 255)/max);
bitmap.SetPixel(x, y, Color.FromArgb(c, c,
c));
}
} return bitmap;
}
- Sau đây là hình ảnh so sánh giữa trước và sau khi sửa chữa với ảnh xám trượt -30 trước đó.
ảnh trước khi sửa
ảnh sau khi sửa chữa
Histogram tương
ứng
2.2.4. Cân bằng lược đồ.

Mục đích: Với một ảnh tự nhiên, phần lớn các điểm ảnh có giá trị thấp hơn độ sáng trung bình. Trong miền
tối ta khó có thể cảm nhận được các chi tiết của ảnh. Cho nên ta cần khắc phục nhược điểm này bằng cách
biến đổi lược đồ xám. Thường biến đổi sao cho tiến gần đến lược đồ định trước, có thể nói phổ biến nhất là
san bằng lược đồ.

Thuật toán cân bằng:
Với ảnh đầu vào I(m*n):
Bước 1: tính tổ chức đồ của ảnh.
Bước 2: tính tỷ lệ xuất hiện của mức xám h[i] trên ảnh (h[i]/(m*n))
Bước 3: tính mật độ xác suất của các mức xám h[i]
( hc[i] = h[0] +…+ h[i] = hc[i-1] + h[i]).
Bước 4: San bằng mức xám và gắn các mức xám mới cho điểm ảnh đầu ra: (Eq[i] = round(255*hc[i])).

Hàm cài đặt:
private Bitmap Canbang_Histogram(Bitmap bm) //, int level)
{

int[] h = new int[256];
int x, y;
for (x = 0; x < bm.Width; x++)
{
for (y = 0; y < bm.Height; y++)
h[bm.GetPixel(x, y).R] += 1;
}
// Mat do xac suat
int[] tg = new int[256];
tg[0] = h[0];
for (int i = 1; i < 256; i++)
{
tg[i] = tg[i - 1] + h[i];
}
private Bitmap Canbang_Histogram(Bitmap bm) //, int level)
{
int[] h = new int[256];
int x, y;
for (x = 0; x < bm.Width; x++)
{
for (y = 0; y < bm.Height; y++)
h[bm.GetPixel(x, y).R] += 1;
}
// Mat do xac suat
int[] tg = new int[256];
tg[0] = h[0];
for (int i = 1; i < 256; i++)
{
tg[i] = tg[i - 1] + h[i];
}

float tb = (float)bm.Width * bm.Height;
// tinh f(g) max (0,round( t(g)*255/( tb-1) )
int[] fg = new int[256];
for (int i = 0; i < 256; i++)
{
fg[i] = (int)(Math.Max(0, Math.Round(tg[i] *255 / tb)));
}
for (x = 0; x < bm.Width; x++)
{
for (y = 0; y < bm.Height; y++)
{
Color c = bm.GetPixel(x, y);
int red = (int)c.R;
int d = fg[red];
bm.SetPixel(x, y, Color.FromArgb(d, d, d));
}
}
return bm;
}
float tb = (float)bm.Width * bm.Height;
// tinh f(g) max (0,round( t(g)*255/( tb-1) )
int[] fg = new int[256];
for (int i = 0; i < 256; i++)
{
fg[i] = (int)(Math.Max(0, Math.Round(tg[i] *255 / tb)));
}
for (x = 0; x < bm.Width; x++)
{
for (y = 0; y < bm.Height; y++)
{

Color c = bm.GetPixel(x, y);
int red = (int)c.R;
int d = fg[red];
bm.SetPixel(x, y, Color.FromArgb(d, d, d));
}
}
return bm;
}
VD:
I =
Xác định mức xám và tần xuất:
Mức xám:
Số lần:
h(1) = 4/25 h(5) = 3/25 h(13) = 1/25
h(2) = 3/25 h(6) = 4/25 h(14) = 1/25
h(3) = 1/25 h(7) = 6/25
h(4) = 1/25 h(8) = 1/25
4 7 2 7 1
5 7 1 7 13
6 6 30 8 3
5 7 6 1 2
5 7 6 1 2
 
 ÷
 ÷
 ÷
 ÷
 ÷
 ÷
 

1 2 3 4 5 6 7 8 13 30
4 3 1 1 3 4 6 1 1 1

×