Tài liệu Giáo trình Xử lý ảnh - Chương 7: Các thuộc tính của ảnh số: Chương
7
Các thuộc tính của ảnh số
7.1 Chỉ dẫn
Trong chương này chúng ta sẽ nghiên cứu các vấn đề sau:
Tầm quan trọng của pha trong các ảnh số.
Các giả thiết lấy mẫu 2-D với các ứng dụng trên các ảnh.
Nhân đôi độ phân giải trên ảnh.
7.2 Tầm quan trọng của pha
Trong chương 6, phần 6.4.2, tầm quan trọng của đặc tính tuyến tính hoặc đặc tính pha zero cho các bộ lọc 2-D đã được đề cập. Tuy nhiên, chúng ta chưa kiểm tra tác dụng phân bố đặc tính pha của các ảnh số đối với các nội dung thông tin có trên ảnh. Để làm vậy, chúng ta sẽ đưa ra hai thử nghiệm.
Thử nghiệm 1:
1. Rút ra 2-D FFT của một ảnh được cho.
2. Tính đặc tuyến pha:
ở đây xi(k) biểu diễn cho các phần giá trị ảo và xr(k) biểu diễn các giá trị thực của FFT.
3. Tính toán và lưu trong một file các giá trị phức
4. Rút ra biến đổi ngược FFT của file cuối cùng.
Để đưa các bước trên, chương trình 7.1 được cung cấp. Chương trình thực hiện trên ảnh “IKRAM.IMG” của hình 3.2a (Chương 3). Kết quả được đưa ra trên hình 7.1...
26 trang |
Chia sẻ: hunglv | Lượt xem: 1276 | Lượt tải: 1
Bạn đang xem trước 20 trang mẫu tài liệu Giáo trình Xử lý ảnh - Chương 7: Các thuộc tính của ảnh số, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Chương
7
Các thuộc tính của ảnh số
7.1 Chỉ dẫn
Trong chương này chúng ta sẽ nghiên cứu các vấn đề sau:
Tầm quan trọng của pha trong các ảnh số.
Các giả thiết lấy mẫu 2-D với các ứng dụng trên các ảnh.
Nhân đôi độ phân giải trên ảnh.
7.2 Tầm quan trọng của pha
Trong chương 6, phần 6.4.2, tầm quan trọng của đặc tính tuyến tính hoặc đặc tính pha zero cho các bộ lọc 2-D đã được đề cập. Tuy nhiên, chúng ta chưa kiểm tra tác dụng phân bố đặc tính pha của các ảnh số đối với các nội dung thông tin có trên ảnh. Để làm vậy, chúng ta sẽ đưa ra hai thử nghiệm.
Thử nghiệm 1:
1. Rút ra 2-D FFT của một ảnh được cho.
2. Tính đặc tuyến pha:
ở đây xi(k) biểu diễn cho các phần giá trị ảo và xr(k) biểu diễn các giá trị thực của FFT.
3. Tính toán và lưu trong một file các giá trị phức
4. Rút ra biến đổi ngược FFT của file cuối cùng.
Để đưa các bước trên, chương trình 7.1 được cung cấp. Chương trình thực hiện trên ảnh “IKRAM.IMG” của hình 3.2a (Chương 3). Kết quả được đưa ra trên hình 7.1.
Chương trình 7.1 "PHASE.C". Kiểm tra tầm quan trọng của pha.
/* Program for testing the importance of phase in digital images.*/
#define pi 3.141592654
#include
#include
#include
#include
#include
#include
#include
void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFT(float *xr, float *xi, float *, float *,int, int);
void transpose(FILE *, int, int);
void FFT2D(FILE *, FILE *, float *, float *, unsigned int *,
int,int,int);
Hình 7.1 Tách riêng pha đối với ảnh "IKRAM.IMG".
void main()
{
int N,n2,m,i,j,NT;
unsigned int *L;
float *wr,*wi ;
double nsq,xr,xi,theta;
FILE *fptri,*fptro,*fptrt,*fptrr;
float *buffi,*buffo, max,min,scale;
unsigned char file_name[14], *buff,file_name2[14];
clrscr() ;
printf("Enter name of file containing FFT data-->");
scanf("%s",file_name);
fptri=fopen(file_name,"rb");
if(fptri==NULL)
{
printf("\nFile does not exist.");
exit(1);
}
fptrt=fopen("temp.img","wb+");
again :
gotoxy(1,2);
printf(" ");
gotoxy(1,2);
printf("Enter File for storing display IFFT data->");
scanf("%s",file_name);
if(((stricmp("temp.img",file_name2))==0)||
((stricmp("temp2.img",file_name2))==0))
printf("This is a reserved file name. Use some other name.");
goto again;
fptrr=fopen(file_name,"wb");
nsq=(double)filelength(fileno(fptri))/(2*sizeof(float));
N=(int)sqrt(nsq);
m=(int)(log10((double)N)/log10((double)2));
clrscr( ) ;
NT=2*N*sizeof(float);
buffi=(float *)malloc(NT*sizeof(float));
buffo=(float *)malloc(NT*sizeof(float));
buff=(char *)malloc(N*sizeof(char));
for(i=0;i<N;i++)
{
fread(buffi,NT,1,fptri);
for(j=0;j<N;j++)
{
xr=(double)buffi[2*j];
xi=(double)buffi[2*j+1];
theta=atan2(xi,xr);
buffo[2*j]=100.0*(float)cos(theta);
buffo[2*j+1]=100.0*(float)sin(theta);
}
fwrite(buffo,NT,1,fptrt);
}
fclose(fptri);
rewind(fptrt);
/* Allocating memory for bit reversal LUT.*/
L=(unsigned int *)malloc(N*sizeof(unsigned int));
/* Generate Look-up table for bit reversal.*/
bit_reversal(L,m,N);
/* Allocating memory for twiddle factors.*/
n2=(N>>1)-1;
wr=(float *)malloc(n2*sizeof(float));
wi=(float *)malloc(n2*sizeof(float));
fptro=fopen("temp2.img","wb+"),
WTS(wr,wi,N,1);
FFT2D(fptrt,fptro,wr,wi,L,N,m,1);
fptro=fopen("temp2.img","rb");
max=0.0; min=1.e10;
for(i=0;i<(N-30);i++)
{
fread(buffi,NT,1,fptro);
if(i<11) continue;
for(j=0;j<N;j++)
Hình 7.2 Tách riêng biên độ của ảnh "IKRAM.IMG".
{
if(buffi[2*j]>max) max=buffi[2*j];
if(buffi[2*j]<min) min=buffi[2*j];
}
}
rewind(fptro);
scale=255.0/(max-min);
for(i=0;i<N;i++)
{
fread(buffi,NT,1,fptro);
for(j=0;j<N;j++)
buff[j]=(char)((buffi[2*j]-min)*scale);
fwrite(buff,N,1,fptrr);
}
fcloseall();
remove("temp.jmq");
remove("tempLimg");
}
Thử nghiệm 2:
Rút ra FFT của một ảnh.
Rút ra đặc tính biên độ
Chứa trong một file dữ liệu phức
Rút ra biến đổi ngược FFT của file cuối cùng.
Chương trình 7.1 có thể dễ dàng thay đổi lại để kết hợp với các bước trên. Kết quả chạy thử nghiệm 2 trên ảnh “IKRAM.IMG” được cho hình 7.2.
Có thể thấy rõ ràng từ hai thử nghiệm trên rằng đặc tính pha mang gần hết các thông tin trong ảnh. Điều này đúng với hầu hết các ảnh, bởi vậy khi thực hiện các phép toán như lọc 2-D với mục đích tăng cường ảnh ta nên tránh làm biến dạng pha. Điều này cho thấy sự cần thiết của các toán tử 2-D tuyến tính hoặc có pha zero.
7.3 Định lý lấy mẫu Whittaker-Shannon
Chúng ta sẽ bắt đầu bằng xem xét định lý lấy mẫu trong trường hợp 1-D. Sau đây chúng ta sẽ nghiên cứu trường hợp các tín hiệu 2-D.
Định lý: Nếu một hàm x(t) không chứa tần số cao hơn W, có thể xác định một cách hoàn toàn bằng một toạ độ mà dãy các điểm chia cách nhau 1/(2W). Chu kỳ lấy mẫu được cho bởi
ở đây T tính theo giây và W tính theo herzt.
Chứng minh. Xem xét biểu diễn Fourier của một dãy các tín hiệu liên tục xa(t)
(7.1a)
(7.1b)
Nếu x(n) biểu diễn một dãy được rút ra từ việc lấy mẫu xa(t) tại các khoảng bằng nhau T, chúng ta có thể dùng biểu thức (7.1a) để viết:
(7.2)
Từ biến đổi rời rạc Fourier chúng ta cũng rút ra
(7.3)
ở đâylà biến đổi Fourier rời rạc của x(n). Bây giờ cần tính mối quan hệ theo .
Để xem xét mối quan hệ giữa các biểu thức (7.2) và (7.3) ta cần xem xét biểu thức (7.2) như một tổng của các tích phân trong các khoảng có độ dài 2p/T.
(7.4)
Mỗi phần trong tổng có thể quy về tích phân trong khoảng từ đến bằng cách thay đổi biến để rút ra
(7.5)
Nếu thay đổi thứ tự của tích phân và tính tổng và chú ý rằng với mọi giá trị nguyên của r và n, thì chúng ta rút ra
(7.6)
Với thay thế , biểu thức (7.6) trở thành
(7.7)
có cùng dạng với biểu thức (7.3). Vì vậy, chúng ta có thể xác định
(7.8)
Tương tự, chúng ta có thể biểu diễn biểu thức (7.8) theo biến tần số tương tự W như
(7.9)
Biểu thức (7.8) và (7.9) cung cấp mối quan hệ giữa biến đổi Fourier thời gian liên tục và biến đổi Fourier của một dãy các mẫu. Cho ví dụ, nếu được giới thiệu trong hình 7.3a, thì sẽ được giới thiệu trong hình 7.3b nếu W Ê (p/T) (hoặc T Ê (2p/2W)), cụ thể, nếu W tính theo hezt . Vì thế, nếu lấy mẫu tại tốc độ tối thiểu gấp đôi tần số cao nhất trong , thì được xác định thành trong khoảng . Tần số lấy mẫu này thường được gọi là tần số Nyquist. Nếu T ³ 1/(2W), thì các bản dịch củasẽ bị chồng lên nhau như trong hình 7.3c. Vấn đề này gọi là hiện tượng trùm phổ (aliasing).
Nếu T Ê 1/(2W) (W tính theo hezt), thì có khả năng khôi phục xa(t) từ x(nT) bởi một phép nội suy xấp xỉ, mà sẽ được chúng ta đề cập đến phần tiếp theo.
Từ phép biến đổi Fourier thời gian liên tục:
(7.10)
w
w
W
wW
-w
Xa(jW)
Biến đổi Fourier của tín hiệu liên tục
(a)
-w
w
X(ejw)
(b)
w
-w
(c)
Hình 7.3 Phổ tần số của trạng thái liên tục và trạng thái đã lấy mẫu của một tín hiệu.
Nếu (7.11)
và
Kết hợp biểu thức (7.10) và (7.11)
Vì vậy
Thay đổi thứ tự tính tổng và tích phân,
Tính giá trị của tích phân chúng ta được
(7.12)
Biểu thức (7.12) là phép nội suy cho phép khôi phục các tín hiệu liên tục theo thời gian xa(t) từ các mẫu của nó.
Trường hợp 2-D: Các định lý lấy mẫu 2-D giả thiết rằng hàm giới hạn băng fa(x,y) có thể khôi phục một cách hoàn toàn từ các mẫu mà thoả mãn
(7.13)
ở đây WH và WV biểu diễn giải thông theo hezt của tín hiệu 2-D theo chiều dọc và theo chiều ngang. Nếu biểu thức (7.13) được thoả mãn, và fa(k1TV,k2TH) biểu diễn tín hiệu lấy mẫu 2-D, thì fa(x,y) có thể khôi phục từ fa(k1TV,k2TH) dùng biểu thức nội suy:
(7.14)
Chứng minh của các biểu thức (7.13) và (7.14) tương tự như trường hợp 1-D và được để lại như một bài tập. Một chú ý là phổ tần số của một tín hiệu lấy mẫu 2-D tuần hoàn trong miền tần số, như trong hình 7.4. Tín hiệu tương tự có thể được khôi phục bằng cách tách ra một chu kỳ từ phổ tín hiệu mẫu.
7.4 Định lý lấy mẫu áp dụng lên các ảnh
Một ảnh được tạo nên bằng cách chiếu một cảnh 3-D lên mặt phẳng 2-D. Phép chiếu này biểu diễn một phép biến đổi từ nhiều vào một. Có nghĩa là một điểm ảnh không tương ứng duy nhất với một điểm trong cảnh 3-D. Điều này được minh hoạ qua hình 7.5. Giả sử rằng ảnh này chứa N điểm ảnh theo hướng x. Sau đó cho các vật thể S1 và S2 trong hình 7.5 chúng ta có
mét (7.15)
và mét (7.16)
Định lý lấy mẫu đòi hỏi:
(7.17)
Hình 7.4 Phổ tần số của một tín hiệu lấy mẫu 2-D.
và (7.18)
ở đây, W1 là tần số cao nhất theo hướng x cho ảnh được tạo bởi một mình vật thể S1, và W2 là tần số cao nhất theo hướng x cho ảnh được tạo bởi một mình vật thể S2. Bởi vì chúng ta chỉ có một ảnh bao gồm S1 và S2 nên W1 = W2 và N được xác định theo
(7.19)
Vì thế N = 6W2 (7.20)
Hình 7.5 ánh xạ một cảnh 3-D lên mặt phẳng ảnh 2-D.
Thay N trong biểu thức (7.15) chúng ta được
Vì thế, giả thiết lấy mẫu không thoả mãn cho vật thể S1, và ở đây các thông tin của miền này trên ảnh không thể khôi phục qua phép nội suy. Nói một cách khác, các vật thể gần camera có khả năng tốt hơn khi lấy mẫu, trong khi các vật thể xa camera thì dễ dàng khi khôi phục mẫu.
7.5 Nhân đôi độ phân giải trên ảnh
Kết quả của định lý lấy mẫu có thể dùng để tăng độ phân giải trên ảnh. Dù sao chăng nữa, dựa vào kết quả đã đạt được chúng ta có thể kết luận rằng nói chung thì không thể tăng độ phân giải của ảnh lên được. Trong các ảnh, các vật thể đáng quan tâm thông thường được che hết bề mặt của ảnh. Vì thế, nếu các đối tượng trong nền không được cho độ phân giải dư thừa, các vật thể cận cảnh thông thường có đủ mẫu để cho phép dùng các định lý lấy mẫu.
7.5.1 Nhân đôi độ phân giải dùng sự thể hiện tần số của lý thuyết lấy mẫu
Chúng ta đã chú ý ở trong chương 6 rằng phổ tần số của một ảnh giảm nhanh cùng với sự tăng của tần số. Chúng ta có thể dùng nhận xét này và định lý lấy mẫu Whittaker-Shannon để tăng độ phân giải. Giải thuật này theo các bước sau:
Rút ra FFT của ảnh có kích thước N ´ N, cụ thể
phổ tần số sẽ phải có gốc toạ độ ở trung tâm của mảng FFT.
Thêm các điểm 0 vào FFT như giới thiệu trong hình 7.6 để tăng kích thước của nó lên 2N ´ 2N.
Rút ra biến đổi ngược FFT của biến đổi tần số mở rộng. Kết quả thu được là ảnh gốc với độ phân giải tăng gấp đôi. Cần chú ý là các vật thể không lấy đủ mẫu trong ảnh gốc thì không cung cấp một sự phát triển trong độ phân giải.
Để thực hiện các phương pháp trên chúng ta sẽ bắt đầu với ảnh kích thước 128 ´ 128 điểm và 256 mức xám trong hình 7.7a. ảnh đã có sẵn trên đĩa với file có tên là CAMEL.IMG. Thực hiện thuật toán trên được cho trong Chương trình 7.2. Kết quả áp dụng trên ảnh được cho trong hình 7.7b. Rõ ràng là rất khó khăn để nhận ra người cưỡi trên lạc đà, nếu ảnh gốc mặt người đó chưa được lấy đủ mẫu.
Chương trình 7.2 ENLQFFT.C nhân đôi độ phân giải của một ảnh qua FFT.
/*This program utilizes 2-D FFT to double the size of an image.*/
#define pi 3.141592654
#include
#include
#include
#include
#include
#include
#include
#include
void bit_reversal(unsigned int *, int , int);
void WTS(float *, float *, int, int);
void FFT(float *xr , float *xi, float *, float *, int , int) ;
void transpose(FILE *, int, int);
void FFT2D(FILE *, FILE *, float *, float *, unsigned int *,
int,int,int);
void main()
{
int N,m,i,j,N2,N4,m2,n2,ind;
unsigned int *L;
float *wr,*wi;
FILE *fptri,*fptro,*fptrt;
double nsq;
float *buffo,*buffi;
unsigned char file_name[14],ch,*buffr;
float max,min,scale;
clrscr();
printf("Enter file name for image to be enlarged -> ");
scanf("%s", file_name);
fptri=fopen(file_name,"rb");
if(fptri==NULL)
{
printf("\n File does not exist.");
exit(1);
}
nsq=filelength(fileno(fptri));
N=(int)sqrt(nsq);
m=(int)(log10((double)N)/log10((double)2));
fptro=fopen("FFT1.img","wb+");
/* file for storing FFT of image.*/
again :
gotoxy(1,2);
printf ( " ");
gotoxy(1,2);
printf("Enter file-name for enlarged image -> ");
scanf("%s",file_name);
if(((stricmp("FFT1.img",file_name))==0)||
((stricmp("temp.img",file_name))==0)||
((stricmp("IFFT2.img",file_name))==0))
{
printf("This is a reserved file name. Use some other name.");
FFT của ảnh
N
N
0’s
0’s
0’s
0’s
Hình 7.6 Thêm các số 0 vào FFT thu được ảnh có tần số mở rộng.
goto again;
}
gotoxy(1,2);
printf ( " ");
ind=access(file_name,0);
while(!ind)
{
gotoxy(1,3);
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,3);
printf(" ");
gotoxy(1,2);
printf (" ");
gotoxy(1,2);
printf("Enter file name -->");
scanf("%s",file_name);
ind=access(file_name,0);
}
}
Hình 7.7 "CAMEL.IMG" và ảnh đã được phóng to.
N2=N<<1;
/* Allocating memory for bit reversal LUT.*/
L=(unsigned int *)malloc(N2*sizeof(unsigned int));
/* Generate Look-up table for bit reversal.*/
bit_reversal(L,m,N);
/* Allocating memory for twiddle factors. n2=N- 1 */
wr=(float *)malloc(n2*sizeof(float));
wi=(float *)malloc(n2*sizeof(float));
/*Generating LUT for twiddle factors.*/
WTS(wr,wi,N,-1);
/* Taking 2-D FFT. */
FFT2D(fptri,fptro,wr,wi,L,N,m,-1);
clrscr() ;
printf(" Adding zeros to FFT of image. \n");
/* Adding zeros to double the size of the FFT.*/
N4=N2<<1 ;
buffi=(float *)malloc(N2*sizeof(float));
buffo=(float *)malloc(N4*sizeof(float));
fptri=fopen("FFT1.img","rb");
fptrt=fopen("temp.img","wb+");
fptro=fopen("TFFT2.jmg","wb+");
for(i=0; i<N4; i++)
buffo[i]=(float)0.0;
/* store O's in the first N/2 lines.*/
for(i=0; i>1); i++)
fwrite(buffo,N4,sizeof(float),fptrt);
/* Store O's in the first and last N/2 rows.*/
for(i=0; i<N; i++)
fread(buffi,N2,sizeof(float),fptri);
for(j=0;j<N;j++)
buffo[j]=(float)0.0;
for(j=0;j<N2;j++)
buffo[j+N]=buffi[j];
for(j=(N2+N);j<N4;j++)
buffo[j]=(float)0.0;
fwrite(buffo,N4,sizeof(float),fptrt);
for(i=0; i<N4; i++)
buffo[i]=(float)0.0;
for(i=0;i>1);i++)
fwrite(buffo,N4,sizeof(float),fptrt);
fclose(fptri);
rewind(fptrt);
/* Taking the inverse FFT.*/
printf("Taking the inverse FFT.\n");
m2=m+1 ;
/* Generating bit reversal I(JT.*/
bit_reversal(L,m2,N2);
WTS(wr,wi,N2,1);
FFT2D(fptrt,fptro,wr,wi,L,N2,m2,1);
clrscr() ;
printf("Last stage in forming enlarged image.");
fptri=fopen("IFFT2.img","rb");
fptro=fopen(file_name,"wb");
buffr=(unsigned char *)malloc(N2*sizeof(char));
max=0; min=1.0e7;
for(i=0;i<N2;i++)
{
fread(buffo,N4,sizeof(float),fptri);
for(j=0;j<N2;j++)
{
scale=buffo[j<<1];
if(scale>max) max=scale;
if(scale<min) min=scale;
}
}
scale=(float)255.0/(max-min);
rewind(fptri);
for(i=0;i<N2;i++)
{
fread(buffo,N4,sizeof(float),fptri);
for(j=0;j<N2;j++)
buffr[j]=(unsigned char)((buffo[j<<1]-min)*scale);
fwrite(buffr,N2,sizeof(char),fptro);
}
fcloseall();
remove("FFT1.img");
remove("temp.img");
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 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
Hình 7.8 Các phép nội suy thông thường.
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à lưu 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
#include
#include
#include
#include
#include
#include
#include
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 },
{ 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);
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");
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;
/*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;
}
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.
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 đó.
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
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.
Các file đính kèm theo tài liệu này:
- CHUONG07-Các thuộc tính của ảnh số.DOC