Xem mẫu
- 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
#include
#include
#include
#include
#include
- #include
#include
void main()
{
int i,j,n1,n2,N,NT,N2,image_width,
image_length,k1,k2,k;
int true_length,true_width,ind;
char file_name[14];
unsigned char **w, ch;
unsigned char *temp;
float **h,max,min,diff;
float nsq, zn2, tmp;
FILE *fptr, *fptr1, *fptr_tmp;
unsigned int sum;
clrscr();
printf
("Enter file name containing FIR filter coefficients
->" );
scanf ( "%s", file_name);
if((fptr=fopen(file_name, "r" ))==NULL)
{
printf("%s does not exist.",file_name );
exit(1);
/* calculating order of filter. */
nsq=0;
while(fscanf(fptr,"%f ", &tmp)!=EOF) nsq++;
rewind(fptr);
NT=sqrt(nsq);
printf("Order of filter %d x %d",NT,NT);
N=(NT-1)>>1;
N2=N
- {
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);
printf("\nEnter file_ name for input image ->");
scanf("%s",file_name);
if((fptr=fopen(file_name,"rb")) == NULL)
{
printf( "%s does not exist." , file_name);
printf("\nPress any key to exit.");
getch();
exit(1);
}
nsq=filelength( fileno(fptr));
printf("Is this a square image ?");
printf("\n i.e. Is image_length=image_width (y or n)? -
> ");
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;
}
fptr_tmp=fopen("temp_img.dat","w+");
gotoxy(70,25);
textattr(WHITE+(GREEN
- for(k2=1; k2=k2) continue;
if( ((n2-k2)=image_width) )
continue;
if( ((n2-k1)=image_width) )
continue;
sum =(unsigned int)(*((*(w+N-k1))+(n2-k2)));
sum+=(unsigned int)(*((*(w+N-k2))+(n2-k1)));
sum+=(unsigned int)(*((*(w+N+k1))+(n2-k2)));
sum+=(unsigned int)(*((*(w+N-k2))+(n2+k1)));
sum+=(unsigned int)(*((*(w+N-k1))+(n2+k2)));
sum+=(unsigned int)(*((*(w+N+k2))+(n2-k1)));
sum+=(unsigned int)(*((*(w+N+k1))+(n2+k2)));
sum+=(unsigned int)(*((*(w+N+k2))+(n2+k1)));
zn2+=(*((*(h+N+k1))+(N+k2)))*((float)sum);
}
for(k=1;kN2)&&(n1N2)&&(n2max) max=zn2;
if(zn2
- }
/***************************************************
Maximum and minimum is determined only for the
region extending from (NT,NT) to (true_width,
true_length); where, true_width=image_width-NT
and true_length=image_length*0.9.
The reason for this is that the last few lines in
the digitized image are usaully not part of the
original raster scanned analog image. These last lines
are lost in the retrace between frames. Since we also
make the assumption of zero boundary conditions which
could result in an abrupt transition in gray levels
we exclude the first NT lines, and the first and last
NT columns from the filtered image in determining the
maximum and minimum.
*****************************************************/
fprintf(fptr_tmp,"%f ",zn2);
/* The buffer is implicit in this last statement. */
}
/* shift rows of w */
temp=*w;
for(j=0; j
- 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':
ind=1 ;
break ;
case 'n':
gotoxy(1,15);
printf( " ");
gotoxy(1,15);
printf("Enter file name -->");
scanf("%s",file_name);
ind=access(file_name,0);
}
}
fptr1=fopen(file_name,"wb");
gotoxy(70,25);
textattr(WHITE+(GREEN
- fscanf(fptr_tmp,"%f ",&zn2);
/* scaling output image between 0 and (max+min).
*/
zn2= ((zn2-min)/diff) * (float)255.0;
putc((unsigned char)zn2,fptr1);
}
}
fclose(fptr_tmp);
remove("temp_img.dat");
gotoxy(70,25);
textattr(WHITE+(BLACK
- ngoại tuyến thường được sử dụng cho các bài toán tự nhiên. Ví dụ, x-quang, đầu
tiên phim x-quang được lấy ra và sau đó được xử lý, vì thế xử lý là ngoại tuyến
trong tự nhiên. Xử lý trực tuyến hay xử lý thời gian thực, hay nói cách khác, xử lý
ảnh cùng với tốc độ mà chúng được truyền bằng camera hoặc bằng thiết bị ảnh
hay một thiết bị độc lập khác. Trong một số trường hợp, xử lý thời gian thực có
nghĩa là 30 khung ảnh/giây, ở đây một khung ảnh là một ảnh hoàn chỉnh. Nếu kích
thước của một ảnh là 512 512 điểm ảnh, thì bộ xử lý phải có khả năng xử lý 512
512 30 điểm ảnh/giây = 7.86432 triệu điểm ảnh/giây trong y êu cầu để xử lý
ảnh trong thời gian thực. Xử lý thời gian thực không là chủ đề đề cập trong
chương này, nó sẽ được nói đến trong chương 16. Mục đích của chủ đề này nhằm
giúp bạn đánh giá nguyên nhân đôi khi cần đến những phần cứng đ ược thiết kế
đặc biệt. Trong chương 4 chúng ta sẽ đi đến những kỹ thuật khác nhau d ùng để
tăng cường ảnh.
3.5 Hiển thị ảnh
Nếu như bạn chưa có được thiết bị số hoá với bộ đệm ảnh và một màn hình đen
trắng để hiển thị các ảnh mức xám, bạn vẫn có thể hiển thị những ảnh này trên
màn hình VGA hoặc màn hình đa tần số. Tất nhiên, bạn phải cần đến một vỉ mạch
VGA với 512 KB bộ nhớ hoặc nhiều hơn. ảnh mức xám được cung cấp trên đĩa
kèm theo (chúng có phần mở rộng là *.IMG) hầu hết có kích thước 256 256
điểm ảnh. Chương trình dùng để hiển thị ảnh trên vỉ mạch VGA cũng được cung
cấp trên đĩa kèm theo. Đọc tệp README.DOC để xem chi tiết. Những chương
trình này chạy dưới DOS và làm việc với hầu hết các vỉ mạch video. Nếu bạn có
vấn đề khi hiển thị ảnh dưới DOS, mà máy của bạn lại cài đặt Windows, bạn có
thể dùng trình Paint Brush để hiển thị ảnh. Để hiển thị ảnh d ưới Windows, trướ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.
- 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ị.
Chúng tôi cũng cung cấp cho bạn các chương trình C và kết quả chạy các
chương trình này trên một số ảnh để kiểm tra. Như các chương khác, một số
bài tập được cho kèm theo. Các bài tập n ày giúp cho bạn hiểu rõ vấn đề và có
sự đánh giá tốt hơn ứng dụng của lĩnh vực n ày.
4.2 Mô hình phản xạ độ sáng
Một bức ảnh được tạo nên qua phép chiếu của một cảnh trong không gian
ba chiều lên một mặt hai chiều hay mặt phẳng. Hàm phân phối cư ờng độ sáng,
f(x,y), th ể hiện trên m ặt phẳng n ày đ ặc tính của ảnh và được coi rằng là một
mô hình phụ thuộc vào hai yếu tố. Yếu tố thứ nhất là sự phản chiếu của rất
nhiều vật thể trong cảnh và ký hiệu là r(x,y). Yếu tố thứ hai là tổng độ sáng
nh ận được từ các vật thể, yếu tố n ày sẽ đư ợc ký hiệu là i(x,y). Cường độ ánh
sáng, f(x,y), và độ chói, i(x,y), là hàm phụ thuộc vào cả hai giá trị x và y.
0 f ( x, y )
(4.1)
0 i ( x, y )
hệ số phản xạ, r(x,y), b ị giới hạn bởi 0 và 1.
(4.2)
0 r ( x, y) 1
Trong đó r(x,y) = 0 chỉ ra rằng ở đó ánh sáng bị hấp thụ toàn phần và r(x,y)
= 1 chỉ ra rằng ở đó ánh sáng phản xạ toàn phần. Nếu một bề mặt có độ phản
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.
43
nguon tai.lieu . vn