Hình 3.2 (a) Ảnh IKRAM.IMG gốc.
(b) Ảnh lọc thông cao của IKRAM.IMG.
(c) Ảnh lọc thông thấp của IKRAM.IMG.
Bài tập 3.1
Viết chương trình C để trung bình 2 ảnh. Nếu ảnh thứ hai là kết quả của lọc ảnh
thứ nhất, thì ảnh thứ hai sẽ được dịch dọc và/hoặc ngang so với ảnh thứ nhất.
Chương trình sẽ nhắc nhở người sử dụng nhập lượng dịch chuyển. Hình 3.3 Ảnh gốc đã thêm ảnh lọc thông cao.
Chương trình 3.2 "FIRSYM.C". Lọc ảnh dùng bộ lọc tuần hoàn đối xứng.
/*Program 3.2 “FIRSYM.C”. Filltering of digital images
using circular symmetricals.*/
/*This Program is for filtering images using the
algorithm described in the text. The filter type
is FIR. Circular symmetry is assumed.
The FIR filter coefficients can be obtained using the
Simpson's double integration program described in
Chapter II. */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <alloc.h>
#include <conio.h>
#include <io.h>
NT=sqrt(nsq);
printf("Order of filter %d x %d",NT,NT);
N=(NT-1)>>1;
N2=N<<1 ;
/* Allocating memory for filter coefficients h[i][j] */
h=(float **)malloc(NT*sizeof(float *));
for(i=0;i<NT;i++)
*(h+i)=(float *)calloc(NT,sizeof(float));
printf("\n FILTER COEFFICIENTS.\n");
for(i=0;i<NT;i++)
{
for(j=0;j<NT;j++)
{
fscanf(fptr,"%f ", &h[i][j]);
printf("%f ", *((*(h+i))+j));
}
printf("\n");
}
fclose(fptr);
printf
("\.n Press any key to continue. Screen w ill be
cleared.");
getch();
clrscr();
printf
("FIR filter coeffients are taken from
%s",file_name);
break;
}
fptr_tmp=fopen("temp_img.dat","w+");
gotoxy(70,25);
textattr(WHITE+(GREEN<<4)+BLINK);
cputs("WAIT");
max=(float)0.0;
min=(float)255.0;
true_length=(int)((float)image_length*0.90);
true_width=image_width-NT;
/* Allocating memory for Image Transfer Buffer, w. */
w=(unsigned char **)malloc(NT*sizeof(char *));
for(i=0;i<NT;i++)
*(w+i)=(char *)calloc(image_width,sizeof(char));
/* Clear Image Transfer Buffer. */
for(i=0;i<NT;i++)
for(j=0;j<image_width;j++)
*((*(w+i))+j)=(unsigned char)0;
/* Algorithm */
for(n1=0; n1<image_length;n1++)
{
gotoxy(1,8);
printf
(" Transferred line %-4d to image transfer
buffer.",n1);
for(k=1;k<=N;k++)
{
if( ((n2-k)<0) || ((n2+k)>=image_width) )
continue;
sum=(unsigned int)(*((*(w+N-k))+(n2-k)));
sum+=(unsigned int)(*((*(w+N+k))+(n2-k)));
sum+=(unsigned int)(*((*(w+N-k))+(n2+k)));
sum+=(unsigned int)(*((*(w+N+k))+(n2+k)));
zn2+=(*((*(h+k+N))+(k+N)))*((float)sum);
sum=(unsigned int)(*((*(w+N))+(n2-k))),
sum+=(unsigned int)(*((*(w+N-k))+n2));
sum+=(unsigned int)(*((*(w+N))+(n2+k)));
sum+=(unsigned int)(*((*(w+N+k))+n2));
zn2+=(*((*(h+N))+(N+k)))*sum;
}
sum=(unsigned int)(*((*(w+N))+n2));
zn2+=(*((*(h+N))+N))*((float)sum);
/* Excluding boundary values from determining the
maximum
and minimum. */
if((n1>N2)&&(n1<true_length)&&(n2>N2)&&(n2<true_width))
{
if(zn2>max) max=zn2;
if(zn2<min) min=zn2;
}
/***************************************************
Maximum and minimum is determined only for the
%f" ,max,min);
printf("\nNext , adjusting bias and storing final
image. ");
rewind(fptr_tmp);
again:
gotoxy(1,15);
printf ( " ");
gotoxy(1,15) ;
printf ("Enter file name for filtered image ->" ) ;
scanf("%s " , file_name);
if((stricmp(" temp_img.dat " , file_name))==0 )
{
printf
("This is a reserved file name. Use some other
name.");
goto again;
}
gotoxy(1,16);
printf(" ");
ind=access(file_name,0);
while(!ind)
{
gotoxy(1,16);
printf("File exists. Wish to overwrite? (y or n) -
>");
while(((ch=tolower(getch()))!='y')&&(ch!='n'));
putch(ch);
switch(ch)
{
case 'y':
}
}
fclose(fptr_tmp);
remove("temp_img.dat");
gotoxy(70,25);
textattr(WHITE+(BLACK<<4));
cputs(" ");
fclose(fptr1); /* close output-image file */
gotoxy(1,20);
printf ( "DONE.");
}
Bài tập 3.2
1. Thiết kế bộ lọc thông cao dùng hàm Butterworth với 3-dB điểm tần số 0.4,
0.5, 0.6, 0.7, 0.8 và 0.9. Sử dụng phương pháp được mô tả trong
chương 2.
2. Chạy mỗi bộ lọc trên ảnh IKRAM.IMG sử dụng chương trình 3.2 với bộ lọc
tuần hoàn đối xứng.
3. Bạn nhận thấy gì trên các ảnh lọc khác nhau, Ví dụ, làm nổi cực đại ảnh với
ngưỡng tần số 3-dB? Chúng mờ hơn, nhiễu hơn, v.v . Giải thích những gì
quan sát được.
4. So sánh thời gian thực hiện chương trình 3.2 đã được viết cho bộ lọc tuần
hoàn đối xứng với chương trình 3.1 được viết cho trường hợp chung.
5. ở phần nào trong chương trình 3.2 hay 3.1 dễ bị tắc nghẽn? (Ví dụ, phần của
chương trình có hiệu quả nhất trong việc tăng thời gian thực hiện).
6. Phát triển lại cả hai chương trình 3.1 và 3.2 để chúng có thể thao tác trực tiếp
trên màn hình số hoá.
Chạy chương trình lọc sẽ cung cấp cho bạn khái niệm chính xác cái gì bộ lọc có
hết bạn cần phải chuyển đổi nó sang dạng bitmap. Một ảnh được Windows bitmap
hoá thường có phần mở rộng là BMP. Để chuyển đổi một ảnh bất kỳ trên đĩa của
bạn sang dạng bitmap bạn hãy sử dụng chương trình BIN2BMP.EXE trên đĩa của
bạn. Chú ý rằng các ảnh có kích thước 262,144 byte trên đĩa của bạn là các ảnh
màu với độ phân giải 512 256 điểm ảnh và 15 bit/màu, những ảnh này chúng ta
sẽ sử dụng trong chương 11. Ảnh đen trắng sẽ được hiển thị dưới Windows chỉ là
những ảnh mức xám nếu như Windows đặt ở chế độ 256 màu. Bạn có thể tự đặt
chế độ này bằng cách kích đúp chuột vào nhóm "Main", sau đó kích đúp chuột vào
biểu tượng "Windows Setup". Kích chuột vào "Option", tiếp theo bấm chuột vào
"Change System Settings". Kích chuột vào menu "Display", một menu sẽ hiện ra.
Đến mục: "Other display (requires disk from OEM)”. Đưa đĩa driver đi kèm với vỉ
mạch VGA và thực hiện theo chỉ dẫn. Bạn cũng có thể phải cần đến đĩa cài đặt của
Windows để hoàn thành việc cài đặt. 43
CHƯƠNG
4
LÀM NỔI ẢNH
4.1 Chỉ dẫn
Nội dung của phần này là giới thiệu một số công cụ cơ bản dùng để tăng
cường độ phân giải của ảnh cho con người cảm nhận. Những vấn đề được đề
cập đến trong phần này:
Mô hình ảnh.
Lọc đồng hình.
Lọc tương phản pha.
Thay đổi biểu đồ phân bố mức xám.
Lọc trung vị.
xạ bằng 0, thì hàm cường độ sáng của ảnh cho bề mặt đó cũng bằng 0. Nếu
một bề mặt có độ phản xạ bằng 1, thì f(x,y) sẽ bằng với độ sáng nhận được bởi
bề mặt này.