1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình xử lý ảnh y tế Tập 3 P14 ppt

9 216 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 214,23 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Thành phần này biểu diễn giá trị trung bình của khối.. 13.4.2 Sự phóng to và sự thu nhỏ của các ảnh Một trong các ứng dụng của FCT là thay đổi kích thước của ảnh, bao gồm sự phóng to và

Trang 1

k=0;

LK=1;

for(iter=1;iter<=m;iter++)

{

for(i=0;i<LK;i++)

{

C[k]=1.0/(float)cos(PI*(float)(4*i+1)/(float)NK);

k++;

}

NK<<=1;

LK<<=1;

}

C[0]/=2.0;

for(i=1;i<(N-1);i++)

C[i]/=4.0;

}

void IFCT(float *x, unsigned int *L, float *C, int

m, int N)

{

int NK1,NK2,i,j,k,kk,ip,incr,L1,k1,k2,iter;

float T;

x[0]*=(float)N/1.414;

for(i=1;i<N;i++)

x[i]*=(float)N/2.0;

/*Recursive addition */

NK1=1 ;

NK2=2 ;

kk=1;

for(i=0;i<m;i++)

kk*=2 ;

for(iter=1;iter<m;iter++)

{

kk>>=1;

L1=kk- 1 ;

for(k=L1;k>=1;k )

for(i=0;i<NK1;i++)

x[NK1+k*NK2+i]=x[NK1+k*NK2+i]+x[NK1+(k-1)*NK2+i];

NK1<<=1;

Trang 2

NK2<<=1;

}

NK1=N>>1;

for(i=1;i<NK1;i++)

x[i]*=2.0;

/*Bit reversal */

for(i=0;i<(N-1);i++)

{

if(i<=L[i]) continue;

else

{

T=x[i];

x[i]=x[L[i]];

x[L[i]]=T;

}

}

/*Forward operation */

ip=1;

kk=0;

incr=2;

for(iter=0;iter<m;iter++)

{

for(k=0;k<ip;k++)

{

for(j=k;j<N;j+=incr)

{

i=j+ip;

T=x[j]*0.5;

x[i]=x[i]*C[kk];

x[j]=T+x[i];

x[i]=T-x[i];

}

kk++;

}

ip<<=1;

incr<<=1;

}

/*Rearranging the order of the input sequence.*/ kk=1;

for(i=1;i<(N>>1);i++)

{

Trang 3

T=x[N-1];

k=1;

for(j=kk;j<N;j++)

{

x[N-k]=x[N-k-1];

k++;

}

x[kk]=T;

kk+=2;

}

}

Bài tập 13.6

1 Chạy chương trình 2-D FCT (Chương trình 13.5) trên ảnh

“IKRAM.IMG” và dùng một khối có kích thước 8  8 Tên của file xuất ra đặt

là IKRAMFCT.IMG

2 Lấy 2-D FCT của IKRAMFCT.IMG bằng chương trình 13.6 Chứa kết quả trên ảnh IKRAMR.IMG

3 Hiển thị IKRAMR.IMG So sánh ảnh này với ảnh IKRAM.IMG

Tiếp theo tôi sẽ giới thiệu một chương trình mà sẽ hiển thị các khối 8  8 của kết quả đã chuyển đổi trên màn hình văn bản Chú ý rằng giá trị sẽ giảm xuống một cách nhanh chóng kể từ góc trái của màn hình, hay là điểm tần số (0,0) Để thoát khỏi chương trình này, bấm ESC

Chương trình 13.7 "DISPFCT.C" Chương trình hiển thị khối 2-D FCT

/*Program 13.7 "DISPFCT.C" Program to display 2-D FCT blocks.*/

/* This program displays the result of the 2-D FCT

*/

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <io.h>

#include <math.h>

#include <process.h>

void main( )

Trang 4

{

int i,j,k1,k2,N,N1,NB,NS;

float *buff,nsq;

FILE *fptr;

char file_name[14];

int ch;

clrscr();

printf("Enter input file name containing 2-D FCT result. >");

scanf("%s",file_name);

fptr=fopen(file_name,"rb");

if(fptr==NULL)

{

printf("\nNo such file exists.\n");

exit(1);

}

nsq=(float)filelength(fileno(fptr));

N=sqrt((double)(nsq/sizeof(float)));

printf("\nEnter block size used (8x8, 16x16,

etc.) >");

scanf("%dx%d",&NB,&NB);

N1=N/NB;

NS=NB*N;

buff=(float *)malloc(NS*sizeof(float));

printf("\nPress ESC to exit.");

clrscr();

for(i=0;i<N1;i++)

{

fread(buff,sizeof(float),NS,fptr);

{

for(j=0;j<N1;j++)

{

for(k1=0;k1<NB;k1++)

{

for(k2=0;k2<NB;k2++)

printf(" %5.2f",buff[k1*N+k2+j*NB]);

printf("\n");

}

ch=getch();

if(ch==27) {

clrscr();

fclose(fptr);

exit(1);

Trang 5

} clrscr();

gotoxy(1,1);

}

}

fclose(fptr) ;

}

}

Một mẫu của 2-D FCT từ một khối rút ra từ ảnh IKRAM.IMG giới thiệu trong hình 13.13 Các thành phần một chiều (các khối có tần số 0,0) có giá trị lớn nhất Thành phần này biểu diễn giá trị trung bình của khối Các thành phần khác (được hiểu là các thành phần xoay chiều) phải có các giá trị nhỏ hơn

13.4.2 Sự phóng to và sự thu nhỏ của các ảnh

Một trong các ứng dụng của FCT là thay đổi kích thước của ảnh, bao gồm

sự phóng to và sự thu nhỏ ảnh Chúng ta sẽ chấp nhận rằng một ảnh phóng to dùng FCT thì sẽ không có gì khác so với một ảnh phóng to dùng FFT, trong đó

ta dùng các thuộc tính vốn có của FFT của ảnh Toàn bộ ý tưởng là ta sẽ chia tần số lấy mẫu bên trong với 2 và như vậy sẽ tăng gấp đôi khoảng cách tần số Khi FCT của một khối giảm rất nhanh kể từ điểm tần số (0,0), chúng ta có thể nhân đôi khoảng cách tần số bằng cách thêm vào các điểm 0 Điều này làm cho chúng ta giảm được một nửa tần số lấy mẫu bên trong và tăng gấp đôi kích thước của ảnh Vì vậy trong tương lai, kỹ thuật truyền hình phải sử dụng kỹ thuật ảnh số, thì tính chất này có thể giúp cho ta tạo ra được các tivi có màn ảnh rộng Sự thu nhỏ thực hiện bằng cách bớt đi các giá trị của tần số cao Chương trình sau đây sẽ phóng to của một ảnh Chương trình này yêu cầu FCT của một ảnh và kích thước của các khối trên ảnh gốc Kết quả chạy chương trình này là một ảnh có kích thước gấp đôi

Chương trình 13.8 "IFCT2DX.C" Chương trình phóng to ảnh gấp đôi dùng 2-D FCT

/*Program 13.8 "IFCT2DX.C" Program for image

doubling using the 2-D FCT

The 2-D FCT of the image is the input file.*/

/* This program is for carrying out the inverse

of the 2-D Fast Cosine Transform

It doubles the size of the image at the same time

*/

#define PI 3.14159

Trang 6

#include <stdio.h>

#include <math.h>

#include <alloc.h>

#include <conio.h>

#include <io.h>

#include <process.h>

void IFCT(float *, unsigned int *, float *, int , int );

void bit_reversal(unsigned int *, int , int );

void WTSINV(float *,int, int);

void main()

{

int m,N,i,j,k1,k2,NB,NS,N1,NB1,m1,NT,NT1,k;

float *x,*C,**w;

unsigned int *L;

double nsq;

FILE *fptri,*fptro;

char file_name[14];

float *buffi;

unsigned char *buffo;

clrscr();

printf ("This program is for the inverse 2-D FCT

\n" ) ;

printf("It doubles the size of the image at the same time.");

printf("\nEnter name of input file - > " ) ;

scanf("%s",file_name);

fptri=fopen(file_name,"rb");

if(fptri==NULL)

{

printf("\nNo such file exists.\n");

exit(1);

}

nsq=(double)filelength(fileno(fptri));

/* -

Assume image is square

-*/

N=(int)sqrt(nsq/sizeof(float));

m=(int)(log10((double)N)/log10((double)2.0));

k=1;

for(i=0;i<m;i++)

Trang 7

k<<=1;

if(k!=N)

{

printf ( "\nTransform Image must have dimensions" )

;

printf ( " which are multiples of 2 \n" );

exit(1);

}

printf("Enter name for output file ->");

scanf( "%s" , file_name);

fptro=fopen(file_name,"wb");

printf("\nEnter block size used (e.g 8x8,16xl6) -

>");

scanf ( "%dx%d" , &NB , &NB ) ;

m=(int)(log10((double)NB)/log10((double)2.0));

NT=N*NB;

/* -

Blocks of NBxNB were considered by the

FCT Output blocks are (2xNB)x(2xNB)

-*/

m1=m+1; NB1=NB<<1;

N1=(N<<1);

NT1=N1*NB1;

/* -

Assigning memory

-*/

buffi=(float *)malloc(NT*sizeof(float));

buffo=(unsigned char *)malloc(NT1*sizeof(char)); x=(float *)malloc(NB1*sizeof(float));

L=(unsigned int *)malloc(NB1*sizeof(int));

C=(float *)malloc((NB1-1)*sizeof(float));

w=(float **)malloc(NB1*sizeof(float *));

for(i=0;i<NB1;i++)

*(w+i)=(float *)malloc(NB1*sizeof(float));

bit_reversal(L,m1,NB1);

WTSINV(C,m1,NB1);

NS=(N>>m);

/* -

2-D IFCT using the row-column approach

-*/

for(i=0;i<NS;i++)

{

fread(buffi,NT,sizeof(float),fptri);

for(j=0;j<NS;j++)

Trang 8

{

for(k1=0;k1<NB1;k1++)

for(k2=0;k2<NB1;k2++)

w[k1][k2]=0.0;

for(k1=0;k1<NB;k1++)

for(k2=0;k2<NB;k2++)

w[k1][k2]=buffi[k1*N+k2+j*NB];

for(k1=0;k1<NB1;k1++)

{

for(k2=0;k2<NB1;k1++)

x[k2]=w[k1][k2];

IFCT(x,L,C,m1,NB1);

for(k2=0;k2<NB1;k2++)

w[k1][k2]=x[k2];

}

for(k2=0;k2<NB1;k2++)

{

for(k1=0;k1<NB1;k1++)

x[k1]=w[k1][k2];

IFCT(x,L,C,m1,NB1);

for(k1=0;k1<NB1;k1++)

w[k1][k2]=x[k1];

}

for(k1=0;k1<NB1;k1++)

for(k2=0;k2<NB1;k2++)

buffo[k1*N1+k2+j*NB1]=(unsigned char)fabs(w[k1][k2]);

}

fwrite(buffo,NT1,1,fptro);

}

fcloseall();

}

Bài tập 13.7

1 Sử dụng chương trình 13.8 cho IKRAMFCT.IMG (ảnh mà bạn đã thu được trước đây) Hiển thị ảnh đã được phóng to

2 Lặp lại công việc, sử dụng khối 16  16 Chú ý rằng bạn sẽ phải chạy lại chương trình 2-D FCT

3 Thay đổi chương trình trên cho ảnh thu nhỏ

13.5 Lượng tử hoá

Trong toàn bộ cuốn sách này chúng ta làm việc với các ảnh đã lượng tử hoá Chúng ta coi rằng các ảnh được chia làm các mức xám dùng 8 bit với các giá

Trang 9

trị từ 0 đến 255 Tuy vậy, chúng ta không bao giờ để ý đến các giá trị này Lý

do là các giá trị này bản thân nó không có ý nghĩa gì cả Cái mà chúng ta thật

sự quan tâm là biểu diễn dưới dạng nhị phân của giá trị cường độ sáng tín hiệu lấy mẫu Tất cả các bít biểu diễn khoảng của tín hiệu chói Nếu tín hiệu chói

có giá trị trong khoảng từ giá trị nhỏ nhất y L cho đến giá trị lớn nhất y u, thì hàm

lượng tử hoá sẽ chia tín hiệu ra thành N miền và gán cho mỗi miền một giá trị

nhị phân như trong hình 13.14 Sự biểu diễn này không có ý nghĩa gì về mặt vật lý, và chức năng của sự biểu diễn này, như chúng ta muốn, chỉ dùng trong

lĩnh vực xử lý tín hiệu số Tất cả các tín hiệu số này gọi là điều mã xung (Pulse

Code Modulated - PCM) Để có thể thực sự thấy giá trị các mức xám chúng ta cần lượng tử hoá ngược Trong bước này, các giá trị nhị phân biểu diễn một độ chói cụ thể Các bước thực sự của quá trình này biểu diễn trong hình 13.15

Trong lĩnh vực tương tự và lĩnh vực số quá trình này gọi là chuyển đổi từ tương tự sang số (A/D) và chuyển đổi từ số sang tương tự (D/A)

Trong các ứng dụng như trường hợp biến đổi cosin 2-D thì có một chút khác biệt Cái mà chúng ta cần làm trong trường hợp này là biến đổi từ một tập hợp các dấu phẩy động sang một tập hợp các bít nhị phân và ngược lại Biểu vì biến đổi ngược của lượng tử hoá là biến đổi từ nhiều vào một, nên quá trình này không thể tiến hành một cách thông thường được May mắn thay, có một

số phương pháp để lượng tử hoá và lượng tử hoá ngược Chúng ta sẽ nghiên cứu các phương pháp này ở phần dưới đây

Hình 13.14 Lượng tử hoá

d N

d N-1

d 5

d 4

d 3

d 2

d 1 d

N-1 N-2

4

3

2

1

0

11111111

11111110

00000100

00000011

00000010

00000001

00000000

Y U

YL

Dạng thập phân Dạng nhị phân

d i { i= 0, ,1} là các mức chia

Ngày đăng: 10/07/2014, 22:20

HÌNH ẢNH LIÊN QUAN

Hình 13.14 Lượng tử hoá. - Giáo trình xử lý ảnh y tế Tập 3 P14 ppt
Hình 13.14 Lượng tử hoá (Trang 9)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm