Các thuộc tính của ảnh số part 3 pot

10 331 0
Các thuộc tính của ảnh số part 3 pot

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

Thông tin tài liệu

145 remove("IFFT2.img"); printf("\nDone."); } 7.5.2 Nhân đôi độ phân giải trên ảnh dùng phép nội suy không gian Trong phơng pháp này ảnh đầu tiên đợc chứa lên một mảng có kích thớc 2N 2N với tất cả các hàng và các cột đợc xoá về không. ảnh đợc chiếu lần lợt với các phép nội suy. Hình 7.8 liệt kê các phần của các phép nội suy phổ biến nhất. Giải thuật nội suy vuông là thao tác sao chép trong đó những điểm ảnh về cơ bản đợc sao chép vào những vị trí rỗng. Có thể thu đợc toán tử nội suy tam giác nhờ sự kết hợp hai toán tử nội suy vuông, vì vậy ta có thể thu đợc cùng kết quả nếu ta áp dụng liên tiếp hai phép nội suy vuông. Giải thuật chuyển đổi những sao chép cơ bản theo bộ lọc thông thấp sang ảnh để có đợc ảnh trơn hơn. Kết hợp thực hiện ba lần liên tục trên ảnh với toán tử nội suy vuông tơng đơng với áp dụng toán tử nội suy Bell. Toán tử nội suy bậc 3 có thể thu đợc nhờ kết hợp phép nội suy vuông và Bell hoặc kết hợp toán tử nội suy vuông bốn lần. Sử dụng cùng khái niệm đó, chúng ta có thể dễ dàng có đợc nội suy cao hơn. Hình 7.8 Các phép nội suy thông thờng. Hình vuông: 1 1 1 1 Tam giác: 1 2 1 2 4 2 1 2 1 Bell 1 3 3 1 3 9 9 3 3 9 9 3 1 3 3 1 Cubic B-Spline 1 4 6 4 1 4 16 24 16 4 6 24 36 24 6 4 16 24 16 4 1 4 6 4 1 146 Những khái niệm trên có thể đợc thực hiện trong phần mềm tơng tự với việc thực hiện lọc FIR. Bộ đệm chuyển đổi ảnh kích thớc N (2 độ rộng của ảnh) đợc tận dụng, ở đó N = 2 cho toán tử nội suy vuông, N = 3 cho toán tử nội suy tam giác, v.v Một hàng của ảnh đợc chuyển thành hàng cuối cùng của bộ đệm chuyển đổi ảnh và lu trữ tại các vị trí khác với các vị trí ở giữa đặt bằng không. Tơng quan của phép nội suy với bộ đệm truyền tới ảnh và dịch chuyển hàng nh trong phơng pháp trong bộ lọc FIR, một hàng của các giá trị 0 đợc chuyển đổi thành hàng cuối cùng của bộ đệm chuyển đổi ảnh. Những bớc này đợc lặp đi lặp lại cho những phần còn lại của ảnh, bằng cách lựa chọn sự chuyển đổi một hàng từ ảnh theo một hàng của các giá trị 0. Thủ tục thực hiện thuật toán này đợc cho trong chơng trình 7.3. Chơng trình 7.3 ENLARGE.C. /* This program doubles the dimensions of an image by interpolation. */ #include <stdio.h> #include <math.h> #include <alloc.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int SQUARE[2][2]={ { 1, 1 }, { 1, 1 }}; int TRIANGLE[3][3]= { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } }; int BELL[4][4]={ { 1, 3, 3, 1 }, { 3, 9, 9, 3}, { 3, 9, 9, 3}, { 1, 3, 3, 1} } ; int CUBIC_B_SPLINE[5][5]={ { 1, 4, 6, 4, 1 }, { 4, 16, 24, 16, 4 }, 147 { 6, 24, 36, 24, 6 }, { 4, 16, 24, 16, 4 } }; void main() { char file_name[14],ch; FILE *fptri,*fptro,*fptrt; double nsq; int image_length,image_width, N, N1,image_length2, image_width2,i,j,ind,xt,yt; unsigned int **a,n1,n2,k1,k2,sum,max,min,*bufft; unsigned char **w,*buffi,*buffo,*temp; float scale; clrscr(); printf("Enter file name for input image >"); scanf("%s",file_name); fptri=fopen(file_name,"rb"); if(fptri==NULL) { printf("%s does not exist.",file_name); printf("\nPress any key to exit. "); getch() ; exit(1); } nsq=filelength(fileno(fptri)); printf("Is this a square image ?"); printf("\n i.e. Is image length =image width (y or no) ? >"); while(((ch=tolower(getch()))!='y')&&(ch!='n')); putch(ch); switch(ch) { case 'y' : image_length=image_width=sqrt(nsq); printf("\n Image size = %d x %d",image_length, image_width); break; case 'n': printf("\nEnter image_width >"); scanf("%d",&image_width); image_length=nsq/image_width; printf("Image length is %d", image_length); 148 break; again : gotoxy(1,5); printf(" "); gotoxy(1,5); printf("Enter file name for enlarged image >"); scanf("%s",file_name); if((stricmp("temp.img",file_name))==0) { printf("This is a reserved file name. Use some other name."); goto again; } gotoxy(1,6); printf ( " "); ind=access(file_name,0); while(!ind) { gotoxy(1,6); printf("File exists. Wish to overwrite? (y or n) >"); while(((ch=tolower(getch()))!='y')&&(ch!='n')); putch(ch); switch(ch) { case 'y' : ind=1; break; case 'n' : gotoxy(1,6); printf ( " "); gotoxy(1,5); printf ( " "); gotoxy(1,5); printf("Enter file name >"); scanf("%s",file_name); ind=access(file_name,0); } } fptro=fopen(file_name,"wb"); printf("\nEnter choice for interpolation \n"); printf(" 1.SQUARE. \n"); 149 printf(" 2.TRIANGLE. \n"); printf(" 3.BELL. \n"); printf(" 4.CUBIC B-SPLINE. \n"); printf(" Enter choice (1,2,3 or 4) "); while(((ch=getche())!='l')&&(ch!='2') &&(ch!='3')&&(ch!='4')); N1=ch-48; N=N1+1 ; a=(unsigned int **)malloc(N*sizeof(int *)); for(i=0;i<N;i++) *(a+i)=(unsigned int *)malloc(N*sizeof(int)); switch(N1) { case 1: for(i=0;j<N;i++) for(j=0;j<N;j++) a[i][j]=SQUARE[i][j]; break; case 2: for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=TRIANGLE[i][j]; break; case 3: for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=BELL[i][j]; break ; case 4: for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=CUBIC_B_SPLINE[i][j]; } image_width2=2*image_width; image_length2=2*image_length; /*Allocating memory for image transfer buffer.*/ w=(unsigned char **)malloc(N*sizeof(char *)); for(i=0;i<N;i++) *(w+i)=(char *)calloc(image_width2,sizeof(char)); /*Clear image transfer buffer.*/ for(i=0;i<N;i++) for(j=0;j<image_width2;j++) w[i][j]=(unsigned char)0; 150 /*Allocating memory for input and output buffers.*/ buffi=(char *)malloc(image_width*sizeof(char)); buffo=(char *)malloc(image_width2*sizeof(char)); bufft=(unsigned int *)malloc(image_width2*sizeof(int)); fptrt=fopen("temp.img","wb+"); max=0; min=20000; xt=wherex(); yt=wherey(); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs("WAIT"); /*Interpolation.*/ for(n1=0;n1<image_length2;n1++) { if((n1%2)==0) fread(buffi,image_width,sizeof(char),fptri); else /* Every other row is set to zero. */ for(j=0;j<image_width;j++) buffi[j]=(unsigned char)0; for(j=0;j<image_width;j++) w[N1][j<<1]=buffi[j];/*Every other location is set to zero. */ for(n2=0;n2<image_width2;n2++) { sum=(int)0; for(k1=0;k1<N;k1++) for(k2=0;k2<N;k2++) { if((n2+k2-N1)<(int)0) continue; sum+=a[k1][k2]*w[k1][n2+k2-N1]; } bufft[n2]=sum; if(sum>max) max=sum; if(sum<min) min=sum; } fwrite(bufft,image_width2,sizeof(int),fptrt); /* Shift rows of w. */ temp=*w; for(j=0;j<N1;j++) *(w+j)=*(w+j+1); *(w+N1)=temp; } 151 rewind(fptrt); scale=(float)255.0/((float)(max-min)); for(i=0;i<image_length2;i++) { fread(bufft,image_width2,sizeof(int),fptrt); for(j=0;j<image_width2;j++) buffo[j]=(unsigned char)((float)(bufft[j]-min)*scale); fwrite(buffo,image_width2,sizeof(char),fptro); } fclose(fptrt); fclose(fptri); fclose(fptro); remove("temp.img"); gotoxy(70,25); textattr(WHITE+(BLACK<<4)); cputs(" "); gotoxy(xt,yt); } Để kiểm tra chơng trình 7.3 chúng ta sẽ sử dụng ảnh "CAMEL.IMG" mà ta đã sử dụng để kiểm tra trong phơng pháp tần số. Kết quả sử dụng nội suy bậc 3 đợc thể hiện trên hình 7.9. Nh đã mong đợi, ảnh hơi mờ, và chất lợng thấp hơn ảnh thu đợc qua việc ứng dụng định lý lấy mẫu. Tuy nhiên, có thể khôi phục ảnh mờ bằng cách sử dụng kỹ thuật không gian thông qua việc sử dụng trực tiếp bộ lọc thông cao. Chúng ta sẽ đề cập nhiều hơn về vấn đề này trong chơng 8. Tổng quan về ảnh mờ sẽ đợc thảo luận trong chơng 10. 7.6 Bộ lọc sai phân thống kê Wallis Bởi vì phóng đại ảnh là một dạng của tăng cờng ảnh, sẽ là thích hợp khi giới thiệu bộ lọc sai phân thống kê tại thời điểm này. Kiểu lọc này đợc phát triển bởi Wallis là đặc biệt hữu ích trong việc tăng cờng các chi tiết trong vùng tối. Vấn đề này nảy sinh trong ảnh x-quang nh chỉ trên hình 7.10. Trong giải thuật lọc Wallis mỗi điểm đợc điều chỉnh bằng phép trừ giá trị trung bình của các điểm lân cận và chia với độ lệch chuẩn của các điểm lân cận của nó. ảnh lọc Wallis thờng đợc trung bình với ảnh gốc. Nguyên nhân phải thực hiện việc trung bình ảnh này là để ngăn cản việc loại bỏ toàn bộ nền. Kích thớc của vùng lân cận thờng đợc nói đến nh bậc của bộ lọc. Kết quả của áp dụng bộ lọc Wallis bậc 5 đợc chỉ trên hình 7.11. 152 Hình 7.9 Phóng to ảnh "CAMEL.IMG" dùng phơng pháp gần đúng. Bài tập 7.1 1.Tìm kiếm và phân tích tài liệu của H.S.Hou và H.C.Andrews. Trên cơ sở đó, viết chơng trình C cho phép phóng to, thu nhỏ ảnh dùng các toán tử bậc 3. 2.Vấn đề về miền tần số cũng đợc đề cập bởi T.C.Chen và R.J.P.De Figueiredo. Đọc và phân tích tài liệu đó. 153 H×nh 7.10 ¶nh cña tia x. H×nh 7.11 Xö lý ¶nh h×nh 7.10 víi bé läc Wallis. Bµi tËp 7.2 154 Viết chơng trình C cho bộ lọc thống kê Wallis. Cho phép ngời sử dụng có thể trung bình ảnh đầu ra với ảnh gốc. Cho phép ngời sử dụng nhập bậc của bộ lọc. Kiểm tra chơng trình trên ảnh XRAY.IMG và RIBS.IMG có sẵn trên đĩa kèm theo. . { 1, 1 }}; int TRIANGLE [3] [3] = { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } }; int BELL[4][4]={ { 1, 3, 3, 1 }, { 3, 9, 9, 3} , { 3, 9, 9, 3} , { 1, 3, 3, 1} } ; int CUBIC_B_SPLINE[5][5]={. Hình 7.8 Các phép nội suy thông thờng. Hình vuông: 1 1 1 1 Tam giác: 1 2 1 2 4 2 1 2 1 Bell 1 3 3 1 3 9 9 3 3 9 9 3 1 3 3 1 Cubic B-Spline 1 4 6. còn lại của ảnh, bằng cách lựa chọn sự chuyển đổi một hàng từ ảnh theo một hàng của các giá trị 0. Thủ tục thực hiện thuật toán này đợc cho trong chơng trình 7 .3. Chơng trình 7 .3 ENLARGE.C.

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

Từ khóa liên quan

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

Tài liệu liên quan