Xử lý ảnh số -P19

144 582 6
Xử lý ảnh số -P19

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Xử lý ảnh số

Phụ lục - Xử ảnhPhụ lục gồm listing chơng trình trình bày một cách chi tiết các định dạng ảnh: BMP, PCX, TIFF, GIF, . và các môđul chơng trình thực hiện các công đoạn của quá trình xử ảnh. Chơng trình đợc viết trên C và Visual C và có thể coi nh một công cụ đơn giản minh hoạ các bớc của xử ảnh. Các ảnh minh hoạ trong cuốn sách này lấy từ kết quả thực hiện chơng trình trên.1. Nhóm chơng trình nạp và lu ảnhViệc nạp ảnh từ tệp vào mảng số và lu ảnh từ mảng lên tệp là cần thiết cho mọi chức năng xử lý. Chính vì thế, phần chơng trình có tổ chức 2 moduls riêng:- BMP.H: Thực hiện việc mở và đọc ảnh số từ tệp *.BMP vào mảng 2 chiều.- PCX.H: Thực hiện việc mở và đọc ảnh số từ tệp *.PCX vào mảng 2 chiều. BMP.H// Chứa các khai báo về file ảnh BMP & các thủ tục mở file. //typedef unsigned int WORD;typedef unsigned long DWORD;typedef unsigned char BYTE;typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfoffBits; } BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{DWORD biSize;long biWidth;Nhập môn xử ảnh số - ĐHBK Hà nội 1 Phụ lục - Xử ảnhlong biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;long biXPelsPerMeter;long biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER;typedef struct tagRGBQUAD{BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;} RGBQUAD; BYTE huge *InImage; unsigned long p,chieucao,chieurong; int OpenBitmapFile(char *fname,int *fh, BITMAPFILEHEADER *bmfhd, BITMAPINFOHEADER *bmihd); int ReadBitmapPalette(int fh, int numcl, RGBQUAD *bmpals); int GetScanLine(int fh, int BytePerLine, BITMAPINFOHEADER *bih, int x, int y); void SetRGBPalette(int index,int red ,int green,int blue);Nhập môn xử ảnh số - ĐHBK Hà nội 2 Phụ lục - Xử ảnh void SetRGBPalettes(int index, int red, int green, int blue); int GetBitmapToArray(char *fname); extern void Error(unsigned OrderError); //***************************************** // //Mở file bitmap //int OpenBitmapFile(char *fname,int *fh,BITMAPFILEHEADER *bmfhd, BITMAPINFOHEADER *bmihd) {int tmp; *fh = _open(fname,O_RDONLY); if(*fh == -1) return -1; // không mở đợc file tmp = _read(*fh,bmfhd,sizeof(BITMAPFILEHEADER)); if (tmp == -1) { close(*fh); return -1;// lỗi đọc file } if(bmfhd->bfType != 0x4D42){close(*fh);return -2 ;// không phải dạng BMP} tmp = _read(*fh,bmihd,sizeof(BITMAPINFOHEADER)); if(tmp != sizeof(BITMAPINFOHEADER)){close(*fh);return -2 ;//không phải dạng BMP}Nhập môn xử ảnh số - ĐHBK Hà nội 3 Phụ lục - Xử ảnh if (bmihd->biCompression == 0){bmihd->biSizeImage = (bmfhd->bfSize-bmfhd->bfoffBits);} return 0; } //end of function//******************************************************** ////Đọc bảng màu file bitmap // int ReadBitmapPalette(int fh,int numcl,RGBQUAD *bmpals){int numbyte,tmp;numbyte=numcl*sizeof(RGBQUAD);lseek(fh,sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), SEEK_SET);tmp=_read(fh,(void*)bmpals,numbyte);if (tmp == -1) { close(fh);return -1; } if(tmp!=numbyte){close(fh);return -2;} return 0; } // end of function //******************************************//int GetScanLine(int fh,int BytePerLine,BITMAPINFOHEADER *bih) //Đọc dòng ảnh vào mảng //Nhập môn xử ảnh số - ĐHBK Hà nội 4 Phụ lục - Xử ảnh{BYTE *buff;int tmp,ppb,mask,i,j,cx,nb,cl;buff=(BYTE *)malloc(BytePerLine+1);if(buff==NULL){return -3; //Không đủ bộ nhớ}tmp=_read(fh,buff,BytePerLine);if(tmp != BytePerLine){return -1;}ppb=8/bih->biBitCount;mask=(1 << bih->biBitCount)-1;for(i=0,cx=0;i<BytePerLine;i++){nb=buff[i];for(j=0;j<ppb;j++,cx++){cl=nb >> (bih->biBitCount * (ppb-1-j));cl=cl & mask;InImage[p++]= cl; if(cx == bih->biWidth) break;} if(cx >= bih->biWidth) break;}free(buff); return 0; }Nhập môn xử ảnh số - ĐHBK Hà nội 5 Phụ lục - Xử ảnh//****************************************//void SetRGBPalette(int index,int red ,int green,int blue){int r,g,b,cl;red >>= 6; r=(red & 1) << 5; r +=(red & 2) << 1 ;green >>= 6; g= (green & 1) << 4; g += (green & 2);blue >>= 6; b= (blue & 1) << 3; b += (blue & 2) >> 1;cl=r+g+b; _AX=0x1000; _BL=index; _BH=cl;geninterrupt(0x10);}//***************************************** //void SetRGBPalettes(RGBQUAD *pals,int numcl){int i;for(i=0;i<numcl;i++){SetRGBPalette(i,(pals+i)->rgbRed,(pals+i) ->rgbGreen, (pals+i) - >rgbBlue);}} //********************************************* //// Đọc File BMP vào mảng bộ nhớ //Nhập môn xử ảnh số - ĐHBK Hà nội 6 Phụ lục - Xử ảnhint GetBitmapToArray(char *fname){int i,j,tmp,numcolor,BytePerLine,bmfilehand;BITMAPINFOHEADER bminfohdr;BITMAPFILEHEADER bmfilehdr;RGBQUAD *bmpalettes;tmp=OpenBitmapFile(fname,&bmfilehand,&bmfilehdr, &bminfohdr);chieucao= bminfohdr.biHeight;chieurong= bminfohdr.biWidth;switch(tmp){case -1: return(1); //break; //không mở đợc file case -2: return(2); //break; //lỗi file}numcolor=1 << (bminfohdr.biBitCount);BytePerLine=bminfohdr.biSizeImage/bminfohdr.biHeight;bmpalettes=(RGBQUAD far*) malloc(numcolor*sizeof(RGBQUAD));if(bmpalettes==NULL) return (3);tmp=ReadBitmapPalette(bmfilehand,numcolor,bmpalettes);if (tmp != 0) return(1);SetRGBPalettes(bmpalettes,numcolor);farfree(bmpalettes);lseek(bmfilehand,bmfilehdr.bfoffBits,SEEK_SET);if((InImage =(BYTE huge *) farcalloc(bminfohdr.biHeight*bminfohdr.biWidth, sizeof(BYTE)))==NULL) return(3);Nhập môn xử ảnh số - ĐHBK Hà nội 7 Phụ lục - Xử ảnh p= 0; for(i=0;i<bminfohdr.biHeight;i++) { if (bminfohdr.biCompression==0) tmp=GetScanLine(bmfilehand,BytePerLine,&bminfohdr); } close(bmfilehand); return(0); } PCX.H// Chứa các khai báo của File PCX//#define TRUE 1#define FALSE 0#define VIDEO 0x10#define Enter 13#define BackSpace 8#define MAXSCREENWIDTH 640#define MAXSCREENHEIGHT 480#define BITSPERBYTE 8#define MAXPLANES 4#define MAXBYTESPERSCAN 640#define MAXPALETTECOLORS 16#define MAX256PALETTECOLORS 256#ifndef_BYTENhập môn xử ảnh số - ĐHBK Hà nội 8 Phụ lục - Xử ảnh#define _BYTEtypedef char BYTE;#endif#define NoError 0#define EBadParms -1#define EFileNotFound -2#define EReadFileHdr -3#define ENotPCXFile -4#define ECorrupt -5#define EWrtFileHdr -6#define EWrtOutFile -7#define EWrtScanLine -8#define EPCCFile -9#define PCXHdrTag 0x0A#define MaxRepCount 0x3F#define PCX256ColorTag 0x0Ctypedef struct{ BYTE Red; BYTE Green; BYTE Blue;}ColorRegister;struct PCXFileHeader{ BYTE Header;Nhập môn xử ảnh số - ĐHBK Hà nội 9 Phụ lục - Xử ảnh BYTE Version; BYTE Encode; BYTE BitPerPix; unsigned X1; unsigned Y1; unsigned X2; unsigned Y2; unsigned Hres; unsigned Vres;};struct PCXInfo{ BYTE Vmode; BYTE NumOfPlanes; unsigned BytesPerLine; BYTE unused[60];};struct ExtendedPalette{ BYTE ExtendedPalette; ColorRegister Palette[MAX256PALETTECOLORS];};struct PCX_File{ struct PCXFileHeader PCXHeader;Nhập môn xử ảnh số - ĐHBK Hà nội 10 [...]... PtrScreen[OffsetDisplay++]=ScanLine[Plane*BytePerLine+ColNum]; } outp(0x3C4,2); outp(0x3C5,0x0F); } } putch(0x07); fclose(PCXFile); } 2 Nhóm chơng trình xử ảnh (viết trên Turbo C) Thực hiện các chức năng cải thiện ảnh, phát hiện biên: - PROCESS.H Nhập môn xử ảnh số - ĐHBK Hà nội 22 Phụ lục - Xử ảnh - MESSAGE.H - MAIN.C MESSAGE.H // Nội dung tệp message.h tạo giao diện trong môi trờng DOS // extern void button(title... rectangle(trai+1,y1+1,phai-1,y1+cao-1); rectangle(trai+3,y1+3,phai-3,y1+cao-3); y= y1+22;x= getmaxx()/2; Nhập môn xử ảnh số - ĐHBK Hà nội 25 Phụ lục - Xử ảnh WriteText(&x,&y,st1); y= y+textheight(st1)+25;x= getmaxx()/2; WriteText(&x,&y,st);line(trai+3,y-17,phai-3,y-17); } PROCESS.H // Chứa các thao tác chính : Hiện ảnh, Lọc TB, Trung bình KG, Lọc Trung vị, //Lọc Sobel, Lọc Homomorphie int Averaging(BYTE huge *Image,unsigned... OrderError); extern void Message(char *st,char *st1,int thongtin); void Threshold(BYTE huge *Image,unsigned col,unsigned row, Nhập môn xử ảnh số - ĐHBK Hà nội 26 Phụ lục - Xử ảnh unsigned rong,unsigned cao); //**************************************************// //Hiển thị ảnh BMP // void DipslayImageInBuf(BYTE huge *Image,unsigned hang,unsigned cot) { int i,j; unsigned long p; p= 0; for(i= cot;i>0;i... //***************************************************// // Lọc trung bình trọng số (Spatial Averaging) int Averaging(BYTE huge *Image,unsigned cotbd,unsigned hangbd,unsigned rong, unsigned cao,unsigned avecol, unsigned averow,double *matran) { register unsigned i,j,k,l;//lc=(avecol+1)/2; double *AvePtr; double tong; for(i=hangbd;i . BytePerLine,BITMAPINFOHEADER *bih) //Đọc dòng ảnh vào mảng //Nhập môn xử lý ảnh số - ĐHBK Hà nội 4 Phụ lục - Xử lý ảnh{ BYTE *buff;int tmp,ppb,mask,i,j,cx,nb,cl;buff=(BYTE. tagBITMAPINFOHEADER{DWORD biSize;long biWidth;Nhập môn xử lý ảnh số - ĐHBK Hà nội 1 Phụ lục - Xử lý ảnhlong biHeight;WORD biPlanes;WORD

Ngày đăng: 14/11/2012, 14:19

Từ khóa liên quan

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

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

Tài liệu liên quan