Tải bản đầy đủ (.pdf) (10 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (607.19 KB, 10 trang )

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.

×