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

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

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

{
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:

{
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)

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++)
{

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];
}

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
 
 ÷
 ÷
 ÷
 ÷
 ÷
 ÷
 


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status