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

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

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

Thông tin tài liệu

247 { 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) 248 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 lu 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. /*This program is for loading a colored 249 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 250 độ 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) { 251 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 : 252 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.05907.41( 0.255 253 /*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. 254 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 255 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ừ l 0 đến l 6 ) 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 256 ii c x m y (11.6) 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: circ = (x - 0.333) 2 + (y - 0.333) 2 - r 2 G (0.2757, 0.7147) M B l 6 l 5 l 4 l 3 l 2 l 1 l 0 (0.333, 0.333) W P 5 (0.208, 0.285) P 6 (0.229, 0.424) R(0.735, 0.265) P 2 (0.532, 0.465) P 1 (0.479, 0.517) P 0 (0.408, 0.585) P 3 (0.501, 0.160) P 4 (0.337, 0.086) B (0.167, 0.009) R G Y y x Y 1 ảnh đã lọc. Y o Sinh ra Y 1 =R + 4.5907G + 0.0601B 1 Y Y RR o o 1 Y Y GG o o 1 Y Y BB o o Bộ lọc. . Các đờng thẳng (từ l 0 đến l 6 ) 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: 33 3.0 33 3.0 33 3.0 33 3.0 i i y x x y (11.5) ở đây P i (x i ,y i ). 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. 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 .33 3, 0 .33 3), biểu diễn cho màu trắng trong sơ đồ màu, có thể xấp xỉ

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

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan