1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Xử lý ảnh màu part 3 potx

10 301 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 377,5 KB

Nội dung

Chương trình dùng chuyển một ảnh màu thành file BMP được cung cấp trên đĩa dưới tên BIN2BMP.EXE.. Một số chương trình dùng để hiển thị ảnh màu dưới DOS dùng vỉ mạch VGA cũng đã có sẵn tr

Trang 1

{

FGetPibRow(buff,0,511,i);

fwrite(buff,512,2,fptro);

}

fclose(fptro);

gotoxy(70,25);

textattr(LIGHTGRAY+(BLACK<<4));

cputs(" ");

clrscr();

}

Để hiện thị màu bằng vỉ mạch VGA bạn có thể dùng chung bảng màu

được phát triển cho hiện biểu đồ màu Bảng màu này không phải là bảng màu tốt nhất cho tất cả các ảnh màu, và có thể tạo ra một bảng màu tối thiểu cho hiển thị ảnh Một phép gần đúng cho phát triển bảng màu 8 bit (256 màu) cho các ảnh màu đặc biệt có thể mô tả bằng các bước sau đây: Giá trị ban đầu của bốn mảng, tất cả của 256 mức, đến giá trị không:

palette.blue[256], palette.green[256], palette.red[256]

palette.count[256]

ở đây mỗi màu là một của bốn mảng số nguyên không dấu: đỏ, lục, lam,

và số thứ tự Quét toàn bộ ảnh và cho mỗi điểm màu:

1 Nhân ba màu chính r, g, b với một hệ số hằng sao cho giá trị chỉ đến

255 Trong ảnh 5 bit /màu chính có nghĩa là dịch trái 3 bit (ví dụ giá trị lớn nhất cho màu chính là 31  8), hoặc bạn có thể chia khoảng cách giữa các giá trị sao cho màu chính với cường độ sáng lớn nhất nàm trong khoảng từ 0 đến 255

2 Tính cường độ chói dùng y = 0,59g + 0,30r + 0,11b, hoặc bạn có thể dùng công thức cho Y cho ở biểu thức (11.1) Làm tròn y đến giá trị nguyên gần nhất Nếu giá trị làm tròn là k, thì tăng palette.count[k] thêm 1

Đặt n = palette.count[k]

Tính

palette.blue[k] = (n  palette.blue[k] + b)/(n + 1)

palette.green[k] = (n  palette.green[k] + g)/(n + 1)

Trang 2

palette.red[k] = (n  palette.red[k] + r)/(n + 1)

ảnh màu có thể hiển thị như một ảnh mức cường độ sáng 8 bit tính dùng biểu thức độ chói và mục màu tính ra Chú ý là ảnh màu cung cấp trong cuốn sách này có chiều rộng là 512, và chiều cao là 256 điểm ảnh

sẽ chỉ hiện lên cân xứng chỉ khi ta dùng vỉ mạch PIB ATI Khi hiển thị

ảnh dùng bộ chuyển đổi đồ hoạ video, để cho ảnh có tỷ lệ hợp lý, bạn cần chuyển ảnh có kích thước 256  256 Chương trình thực hiện chuyển đổi này lưu giữ trên đĩa trong file có tên là ATI_SCAL.C ảnh có thể hiện lên dưới chế độ Microsoft Window bằng cách đầu tiên chuyển ảnh thành dạng bitmap cho Windows Các file này thường có phần mở rộng là BMP Chương trình dùng chuyển một ảnh màu thành file BMP được cung cấp trên đĩa dưới tên BIN2BMP.EXE Một ảnh đã được chuyển đổi có thể

được xem bằng chương trình Paintbrush của Windows Chú ý rằng Windows phải ở chế độ hiển thị 256 màu Thuộc tính này xuất hiện khi bạn nhắp đúp vào nhóm chương trình "Main" và sau đó nhắp đúp vào

"Window Setup" Kích "Options", sau khi đã kích vào "Change System

Settíng" Bạn cần đĩa Windows' video driver cho phép máy tính và vỉ

mạch video chuyển sang chế độ mà bạn mong muốn

Một số chương trình dùng để hiển thị ảnh màu dưới DOS dùng vỉ mạch VGA cũng đã có sẵn trên đĩa Đọc file README.DOC để hiểu thêm về các chức năng này Chương trình hiển thị DOS sẽ hiển thị ảnh PIB ATI Bạn sẽ cần chia hoặc biến đổi chúng theo dạng thích hợp cho window Chương trình hiển thị DOS sẽ làm việc trên hệ thống của bạn nếu vỉ mạch video của bạn tuân theo tiêu chuẩn VESA Nếu bạn có khó khăn trong hiện thị dưới môi trường DOS, bạn hãy dùng trong môi trường Windows

được giải thích ở trên

Sẽ có một sự thay đổi rõ ràng chất lượng của ảnh hiện lên trên hệ thống có khả năng thể hiện 32,768 màu so với ảnh hiện lên trên hệ thống

có khả năng thể hiện 256 màu Để thấy rõ sự khác nhau này bạn cần chạy chương trình 11.4 để lấy và hiện lên các điểm ảnh trên vỉ mạch PIB, nếu

vỉ mạch này đã được cung cấp sẵn cho hệ thống của bạn, hoặc bạn có thể thay đổi chương trình để thích hợp với vỉ mạch ảnh màu, nếu bạn có một sẵn một loại vỉ mạch khác Bạn có thể dùng ảnh "IHABCOL.IMG" đã có sẵn trên đĩa với kích thước 512  512 điểm ảnh

Chương trình 11.4 "LOADPIB.C" Loading a Colored image on the PIB board The image is assumed to be of size 512 x 256 pixels

Trang 3

image stored in a file onto the PIB board.*/

#include <stdio.h>

#include <custom.h>

#include <stdlib.h>

#include <conio.h>

void main()

{

int i ;

char buff[1024], file_name[30];

FILE *fptri;

clrscr();

InitPIB();

SetScreen(0);

SetInDispMode();

SetInterlace(1);

FillPibRect(0,0,0,511,255,0);

printf("Enter name of file containing colored image >");

scanf("%S",file_name);

fptri=fopen(file_name,"rb");

if(fptri==NULL)

{

printf("file %s does not exist.\n");

exit(1);

}

for(i=0;i<256;i++)

{

fread(buff,512,2,fptri);

FPutPibRow(buff,0,511,i);

}

fclose(fptri);

}

11.6 Tín hiệu chói

Tín hiệu chói của một ảnh màu dựa trên mức trắng và đen cơ bản của bức ảnh đó Như chỉ dẫn trong phần 11.2, tín hiệu chói cho bởi

Y = R + 4,5907G + 0,0601B (11.3) Biểu thức (11.3) thực sự tạo ra một ảnh đen trắng nếu chúng ta tạo ra một chương trình chuyển ảnh màu từ vỉ mạch PIB (512  256) sang ảnh

Trang 4

độ chói Chiều rộng ảnh độ chói là 256  256 ảnh độ chói được chia từ

0 đến 255 (8 bit) Mã của chương trình cung cấp ở chương trình 11.5

Chương trình 11.5 "COLTOBW.C".Transforming a color image acquired from the PIB board (512 x 256) to a luminance image suitable for display on the VGA card

/* program to convert color imagefrom PIB board

(256x512) to gray-levelimage (256x256) which

you can later display on your VGA card using DISP.C */

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

#include <conio.h>

#include <ctype.h>

void main()

{

int R,G,B,i,j,buffi[512],yt;

char ch,buffo[256],file_name[15];

float y;

FILE *fptri,*fptro;

clrscr();

printf("Enter name of file containing color image >");

scanf("%s",file_name);

fptri=fopen(file_name, "rb");

if(fptri==NULL)

{

printf("File %s does not exist",file_name);

exit(1);

}

yt=wherey();

again:

gotoxy(1,yt);

delline();

printf("Enter name of file to store BW image >");

scanf("%s",file_name);

if(access(file_name,0)==0)

{

Trang 5

printf("File exists Wish to overwrite? (y or n) >");

while(((ch=tolower(getch()))!='y')&&(ch!='n'));

putch(ch);

switch(ch)

{

case 'y':

break;

case 'n':

gotoxy(1,yt);

delline();

goto again;

}

}

fptro=fopen(file_name,"wb");

for(i=0;i<256;i++)

{

fread(buffi,1024,1,fptri);

for(j=0;j<512;j+=2)

{

B=(0x001F & buffi[j]);

G=(0x03E0 & buffi[j]) >> 5;

R=(0x7C00 & buffi[j]) >> 10;

y=R+4.5907*G+0.0601*B;

ch=(char)(y*1.45568+0.5);

/* ch=Y/Ymax*255.0 i.e scale range

between 0 to 255 */

/* Y=0.30*R+0.59*G+0.11*B;

ch=(char)(Y*8.225806+0.5); */

buffo[j>>1]=ch;

}

fwrite(buffo,256,1,fptro);

}

fclose(fptri);

fclose(fptro);

}

Hệ số nhân Y trong chương trình 11.5 được cho theo :

Trang 6

Biến đổi này cho số mức nằm trong khoảng giữa 0 và 255 Chú ý rằng cho vỉ mạch PIB, số mức lớn nhất cho mỗi màu chính là 32 Một biểu thức nội suy cho độ sáng dùng để biến đổi tín hiệu truyền hình màu sang tín hiệu đen trắng:

Y = 0,30R + 0,59G + 0,11B (11.4) Biểu thức này dựa theo cảm giác của mắt vào ba màu chính Để kiểm tra chương trình 11.5 chúng ta sử dụng ảnh "IHABCOL.IMG" Kết quả dùng biểu thức (11.3) giới thiệu trong hình 11.7 Biểu thức (11.4) luôn cho một kết quả đúng, còn biểu thức (11.3) cho ta một ảnh mức xám có

độ sáng tốt hơn

Để hoàn thiện kiến thức cơ bản của chúng ta về ảnh màu chúng tôi sẽ cung cấp cho bạn một chương trình dùng cho vỉ mạch PIB để hiển thị ba màu (đỏ, lục, lam) dưới dạng ảnh màu Một ảnh sẽ được nạp vào vỉ mạch PIB trước tiên khi sử dụng LOADPIB

Hình 11.7 ảnh mức xám của ảnh "IHABCOL.IMG"

Chương trình 11.6 RGBCOMP.C Hiển thị một trong 3 màu chính của ảnh màu trên PIB

0 32 ) 0601 0 5907 4 1 (

0 255

Trang 7

/*Program 11.6 "RGBCOMP.C" Program for displaying one of the three primary Image components of a color image on the PlB board The color Image should be loaded first on the PIB board.*/

/* Program for producing r or g or b component image

for a color image loaded on the PIB board */

#include <custom.h>

#include <stdio.h>

#include <conio.h>

void main()

{

unsigned color,ch;

int y;

char file_name;

clrscr();

printf("\nwhich image component would you like to see\n");

printf("Press r for red \n g for green\n b for blue\\n");

while(((ch=getch())!='r')&&(ch!='g')&&(ch!='b'));

switch(ch)

{

case 'r':

color=0xFC00;

break;

case 'g':

color=0x83E0;

break;

case 'b':

color=0x811F;

}

for(y=0;y<240;y++)

FillPibRow(color,0,511,y,2);

}

Bạn có thể dùng chạy chương trình 11.6 trên "IHABCOL.IMG" để hiện ba khối màu chính, được cung cấp từ vỉ mạch PIB Ba khối màu chính cũng giống như ảnh độ chói, ngoại trừ một được phủ bằng màu đỏ, một phủ bằng màu lam, một phủ bằng màu lục

Trang 8

11.7 Lọc ảnh màu

Không có gì khác nhau cơ bản giữa lọc một ảnh đen trắng và lọc một

ảnh màu Với ảnh màu chúng ta có thể thực hiện lọc bằng một trong hai phương pháp Chúng ta có thể lọc ba màu chính như lọc một ảnh đen trắng, hoặc lọc ảnh độ chói sau đó sử dụng kết quả để đưa ra ảnh màu Cả hai phương pháp này hoàn toàn đúng, tuy nhiên, phương pháp sau hay

được dùng hơn vì một số lý do Xử lý riêng ảnh độ chói thì bạn sẽ tiết kiệm được số phép tính toán, và nếu bạn dùng phần cứng cho lọc thời gian thực thì phương pháp này sẽ rất tiết kiệm phần cứng

11.7.1 Lọc riêng ba màu chính

Phương pháp này được trình bày như hình 11.8 Tất cả các màu chính

được lọc riêng biệt, sau đó được khuyếch đại bù lại suy giảm do bộ lọc gây ra Phương pháp này, nếu làm bằng phần cứng, sẽ đòi hỏi ba bộ lọc riêng biệt

Hình 11.8 Lọc riêng biệt ba màu chính

Bài tập 11.1

1 Lập một chương trình lọc ảnh màu dùng sơ đồ hình 11.8 Bộ lọc có thể là kiểu FIR hoặc là kiểu IIR, và không nhất thiết phải có cùng

đáp ứng tần số, ví dụ, tín hiệu đỏ có thể lọc qua bộ lọc thông cao, tín hiệu lam qua bộ lọc thông thấp, và màu lục đi qua bộ lọc thông tất

2 Kiểm tra chương trình trên ảnh "AUTHOR.IMG" đã có sẵn trên

đĩa Dùng bộ lọc FIR thông cao được thiết kế theo kiểu xấp xỉ với tần số c= 1.0 rad/đơn vị cho tất cả ba màu thành phần

11.7.2 Lọc riêng ảnh tín hiệu chói

Một tính chất của hỗn hợp màu (xem phần 11.2) là một điểm ảnh màu thì độc lập với độ chói của ảnh trên một phạm vi rộng Dựa trên tính chất

ảnh màu

Lọc màu đỏ

Lọc màu Lọc màu lục

Khuếch

đại

Khuếch

đại

Khuếch

đại

ảnh đã lọc

Trang 9

này, ta có thể lọc một ảnh màu mà không làm thay đổi các màu của nó Vì vậy mà bộ lọc chỉ cho ra tín hiệu chói ảnh đã được lọc tín hiệu chói

có thể dùng để sửa lại mức của ba màu chính mà không thay đổi tỷ lệ R:G:B tại tất cả các điểm Chương trình là cách giải thích tốt nhất cho sơ

đồ hình 11.8 Cũng cần phải nói rằng các màu chính lấy ra đã được sửa lại mức tại tất cả các điểm bằng hàm khuyếch đại, hàm này rút ra bằng chia tín hiệu chói lấy ra cho các điểm mà ta đã lấy tín hiệu chói vào Nếu như trong phương pháp trước, ba bộ lọc cho ba màu chính có đáp ứng tần

số độc lập, thì phương pháp này sẽ cho kết quả gần như độc lập với phương pháp trước

Bài tập 11.2

Lập một chương trình C lọc ảnh màu dùng sơ đồ hình 11.9 Chú ý nếu

Y i = 0.0, thì tín hiệu ra khỏi bộ lọc có R 0 = G 0 = B 0 = 0.0 Kiểu bộ lọc có

thể là FIR hoặc là IIR

11.8 Lựa chọn hệ số sửa lại sắc màu và lọc

Một vấn đề khó khăn trong xử lý ảnh màu là sửa lại sắc màu của một màu đặc biệt mà không làm ảnh hưởng các màu còn lại Một phương pháp hay dùng đó là sửa lại các màu chính đến mức chính xác có thể, cùng lúc cân bằng các màu còn lại để hình ảnh có màu tự nhiên Mặc dù,

độ chính xác là sự cân bằng tất cả các sắc màu sao cho hình ảnh có màu sắc tự nhiên bằng các thay đổi ba sắc màu chính Phương pháp lựa chọn thay đổi sắc màu của các màu đặc biệt mà không ảnh hưởng cân bằng màu với phần còn lại của ảnh Phương pháp này gọi là thay đổi sắc màu

có lựa chọn Nó có khả năng làm tăng lên hoặc giảm đi một màu đặc biệt bằng cách dùng bộ lọc màu lựa chọn Câu hỏi đặt ra là: Làm thế nào chúng ta có thể nhận ra sắc màu đặc biệt? Câu trả lời cho vấn đề này dựa theo biểu đồ màu Một lớp màu được lấy ra bằng cách chia biểu đồ màu thành các miền màu, mỗi miền chứa một màu đặc biệt (xem hình 11.10) Trong hình 11.10, G = lục, Y = vàng, ST = skin tone(amber), R = đỏ,

M = đỏ tươi, B = lam, và C = xanh nước biển Các đường thẳng (từ l0 đến

l6) chia thành các màu dựa trên cảm giác của con người Biểu thức của các đường thẳng này:

333 0

333 0 333

0

333 0

i

i

y

x x

y

(11.5)

ở đây P i (x i ,y i ) và {i = 0 đến 6} là điểm cho trong hình Biểu thức cho các

đường này có thể cho dưới dạng

Trang 10

i x c m

Hình 11.9 Phương pháp chỉ lọc tín hiệu chói

Hình 11.10 Phân chia màu sắc trong biểu đồ màu

ở đây m i và c i {i= 0 đến 6} cho trong bảng 11.2 Miền xung quanh điểm

(0.333, 0.333), biểu diễn cho màu trắng trong sơ đồ màu, có thể xấp xỉ bằng một vòng tròn có bán kính r  0,03

Chương trình cho phân chia lớp màu, tính giá trị R, G, B cho một điểm theo:

1 Tính X, Y, Z

2 Tính x và y

3 Tính:

G (0.2757, 0.7147)

M

B

l6

l5

l4 l3

l2

l1

l0

(0.333, 0.333)

W

P5 (0.208, 0.285)

P6

(0.229, 0.424)

R(0.735, 0.265)

P2(0.532, 0.465)

P 1 (0.479, 0.517)

P0(0.408, 0.585)

P3(0.501, 0.160)

P4(0.337, 0.086)

B (0.167, 0.009)

R

G

Y y

x

Y1

ảnh đã lọc.

Yo Sinh ra

Y1=R + 4.5907G + 0.0601B

1

Y

Y R

1

Y

Y G

1

Y

Y B

Bộ lọc

Ngày đăng: 29/07/2014, 04:20

HÌNH ẢNH LIÊN QUAN

Hình 11.7 ảnh mức xám của ảnh &#34;IHABCOL.IMG&#34;. - Xử lý ảnh màu part 3 potx
Hình 11.7 ảnh mức xám của ảnh &#34;IHABCOL.IMG&#34; (Trang 6)
Hình 11.8 Lọc riêng biệt ba màu chính. - Xử lý ảnh màu part 3 potx
Hình 11.8 Lọc riêng biệt ba màu chính (Trang 8)
Hình 11.10 Phân chia màu sắc trong biểu đồ màu. - Xử lý ảnh màu part 3 potx
Hình 11.10 Phân chia màu sắc trong biểu đồ màu (Trang 10)
Hình 11.9 Phương pháp chỉ lọc tín hiệu chói. - Xử lý ảnh màu part 3 potx
Hình 11.9 Phương pháp chỉ lọc tín hiệu chói (Trang 10)

TỪ KHÓA LIÊN QUAN

w