VDV-1469 (Передача информации из ультразвуковой медицинской диагностической установки ALOCA SSD650), страница 6
Описание файла
Документ из архива "Передача информации из ультразвуковой медицинской диагностической установки ALOCA SSD650", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "VDV-1469"
Текст 6 страницы из документа "VDV-1469"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "color.h"
#include "vectlib.h"
#include "winds.h"
#include "win2d.h"
#include "3d.h"
#include "filtr.h"
#include "config.h"
#include "ctmenu.h"
#include "setup.h"
#include "measure.h"
#include "ct.h"
#include "ct_ext.h"
#include "console.h"
#include "language.h"
#define POROG (GRAY_BASE+GRAY_LVLS*4/5)
extern int ExistWindow(WinHandle w);
extern WinHandle MainControl;
extern WinHandle H3d_view;
extern void InvRect(int x0, int y0, int x1, int y1, WinHandle w, char *s);
extern void redraw_window(WinHandle w);
extern void redraw_cw(WinHandle w);
extern void SetupLUT(DWIND *winds);
extern void Screen_Save(void);
extern Rect correct_rect(Rect r);
extern Rect Set_Rect(WinHandle w);
extern Rect Set_Sqr(WinHandle w);
extern void cell_to_pcx(char *pcx_name, GCHandle ch,
int xmax, int ymax, char *pallet);
/***********************************************************/
void Do_AddSub_Img(WinHandle w, int fl_sub)
{ GWHandle chl;
HFILE img_fil,tmp_fil;
long *L,*L1;
int *p,*p1,*p2,*p0,*pp,k,i,j,jz,nx,ny,*pq;
char *hc,*c,name[81];
char *s;
unsigned char *uhc,*pc;
Win2d *ud = h_data(w);
if(!ud->img_name || !ud->ch) return;
if(ud->frag) return;
chl = ud->ch;
s = GetFileName(GetCfgItem("image"),H_CREATE); if (*s == 0) return;
img_fil = HOpen(s,H_READ); if (img_fil == 0) return;
HLocate(img_fil,0l,2048); p = HPosit(img_fil);
L = (long*)p; nx = L[2]; ny = L[3]; ud = h_data(w);
if(nx != ud->iw) { HClose(img_fil); return;}
if(ny != ud->ih) { HClose(img_fil); return;}
if (chl == 0) { HClose(img_fil); return;}
ud = h_data(w);
uhc = (char*)&p[256+128];
if(uhc[249] != 2-ud->ps) return;
if(ud->scale2d == 1)
{
pp = h_malloc(nx*4);
pq = h_malloc(nx*4);
for (j = 0; j < ny; j++)
{ ud = h_data(w);
if(ud->ps == 2)
{ HLocate(img_fil,(long)j*nx*2+2048L,nx*2); p = HPosit(img_fil);
}
else
{ HLocate(img_fil,(long)j*nx+2048L,nx); pc = HPosit(img_fil);
for(i = 0; i < nx; i++) pq[i] = (int)pc[i];
p = pq;
}
GetGWL(chl,(short*)pp,nx,j);
for(i = 0; i < nx; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx,j);
}
h_mfree(pp); h_mfree(pq);
}
else
{ p1 = h_malloc(nx*4); p2 = h_malloc(nx*4);
p0 = h_malloc(nx*4); pp = h_malloc(nx*4);
// Image interpolation
HLocate(img_fil,2048l,nx*2);
p = (int*)HPosit(img_fil);
for (i = 0, k = 0; i < nx-1; i++, k += 2)
{ p1[k] = p[i]; p1[k+1] = (p[i]+p[i+1])/2;
}
p1[k] = p[i];
for (j = 0, jz = 0; j < ny-1; j++, jz += 2)
{ // Write 1 line
GetGWL(chl,(short*)pp,nx*2-1,jz);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p1[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz);
//Read 2 line
HLocate(img_fil,(long)(j+1)*nx*2+2048l,nx*2);
p = (int*)HPosit(img_fil);
for (i = 0, k = 0; i < nx-1; i++, k += 2)
{ p2[k] = p[i]; p2[k+1] = (p[i]+p[i+1])/2;
}
p2[k] = p[i];
for (i = 0; i < nx*2-1; i++) p0[i] = (p1[i]+p2[i])/2;
// Write 2 line
GetGWL(chl,(short*)pp,nx*2-1,jz+1);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p0[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz+1);
// Line2 to Line1
for (i = 0; i < nx*2-1; i++) p1[i] = p2[i];
}
GetGWL(chl,(short*)pp,nx*2-1,jz);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p1[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz);
h_mfree(p1); h_mfree(p2); h_mfree(p0); h_mfree(pp);
}
HClose(img_fil);
ud = h_data(w);
ud->x0 = (ud->iw-ud->w)/2; // Центровка
ud->y0 = (ud->ih-ud->h)/2; // изображения
redraw_cw(w);
}
/***********************************************************/
void Do_Inversion(WinHandle w)
{ int i,k; int imin,imax;
Win2d *ud = h_data(w);
WinCon *udc;
DWIND *p = &ud->dw[0];
if(!ud->img_name || !ud->ch) return;
if (p->on) { if(p->neg) p->neg = 0; else p->neg = 1;
if(!ExistWindow(H3d_view))
{ udc = h_data(MainControl);
udc->inv_prn = p->neg;
}
}
SetupLUT(ud->dw);
redraw_cw(w);
}
/***********************************************************/
// Image filtration functions
static void inch(int *u,int *v)
{int temp;
temp=*u; *u=*v; *v=temp;
}
static int f9(int *mf)
{
int *max,i,j;
for(i = 0;i < 9; i++)
{max=&mf[i];
for(j = i+1;j < 9; j++) if(*max < mf[j]) max = &mf[j];
if(max != &mf[i]) inch(max,&mf[i]);
}
return(mf[4]);
}
static int f1(int *mf)
{long s;
s=(long)mf[0]+2*(long)mf[1]+(long)mf[2]+2*(long)mf[3]
+4*(long)mf[4]+2*(long)mf[5]+(long)mf[6]+2*(long)mf[7]+(long)mf[8];
return(s/16);
}
static int f2(int *mf)
{long s;
s=(long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3]
+(long)mf[5]+(long)mf[6]+(long)mf[7]+(long)mf[8];
return(s/8);
}
static int f3(int *mf)
{long r1,r2;
r1 = (long)mf[0]+(long)mf[1]+(long)mf[2]-(long)mf[6]-(long)mf[7]-(long)mf[8];
r1 = r1*r1;
r2 = (long)mf[0]+(long)mf[3]+(long)mf[6]-(long)mf[2]-(long)mf[5]-(long)mf[8];
r2 = r2*r2;
return((int)(2.0*sqrt((double)(r1+r2))));
}
static int f4(int *mf)
{return( mf[4]);
}
static int f5(int *mf)
{long s;
s=(-2*(long)mf[0]+(long)mf[1]-2*(long)mf[2]+(long)mf[3]
+6*(long)mf[4]+(long)mf[5]-2*(long)mf[6]+(long)mf[7]-2*(long)mf[8])/2;
return((int)s);
}
static int f6(int *mf)
{int e,s;
s = f1(mf); e = mf[4];
if((2*e - s) > 30) e = 2*e - s;
else e = s;
return(e);
}
static int f7(int *mf)
{long s;
s=-(long)mf[0]-(long)mf[1]-(long)mf[2]+(long)mf[3]
+3*(long)mf[4]-(long)mf[5]+(long)mf[6]+(long)mf[7]-(long)mf[8];
return((int)s);
}
static int f8(int *mf)
{long s;
s=((long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3])/4;
return((int)s);
}
static int f10(int *mf)
{return( mf[4]);
}
static void filt(int *p1,int *p2,int *p3,int *po,int str,int nfilt)
{
int mf[9],i,tr;
str=str-1; tr=str-1;
mf[0]=*(p1+str);mf[1]=*p1;mf[2]=*(p1+1);
mf[3]=*(p2+str);mf[4]=*p2;mf[5]=*(p2+1);
mf[6]=*(p3+str);mf[7]=*p3;mf[8]=*(p3+1);
switch (nfilt)
{ case 1: *po=f1(mf); break;
case 2: *po=f2(mf); break;
case 3: *po=f3(mf); break;
case 4: *po=f4(mf); break;
case 5: *po=f5(mf); break;
case 6: *po=f6(mf); break;
case 7: *po=f7(mf); break;
case 8: *po=f8(mf); break;
case 9: *po=f9(mf); break;
case 10: *po=f10(mf); break;
}
for(i = 0; i < tr; i++)
{mf[0] = *(p1+i); mf[1] = *(p1+i+1); mf[2] = *(p1+i+2);
mf[3] = *(p2+i); mf[4] = *(p2+i+1); mf[5] = *(p2+i+2);
mf[6] = *(p3+i); mf[7] = *(p3+i+1); mf[8] = *(p3+i+2);
switch (nfilt)
{ case 1: *(po+i+1) = f1(mf); break;
case 2: *(po+i+1) = f2(mf); break;
case 3: *(po+i+1) = f3(mf); break;
case 4: *(po+i+1) = f4(mf); break;
case 5: *(po+i+1) = f5(mf); break;
case 6: *(po+i+1) = f6(mf); break;
case 7: *(po+i+1) = f7(mf); break;
case 8: *(po+i+1) = f8(mf); break;
case 9: *(po+i+1) = f9(mf); break;
case 10: *(po+i+1) = f10(mf); break;
}
}
mf[0]=*(p1+tr);mf[1]=*(p1+str);mf[2]=*p1;
mf[3]=*(p2+tr);mf[4]=*(p2+str);mf[5]=*p2;
mf[6]=*(p3+tr);mf[7]=*(p3+str);mf[8]=*p3;
switch (nfilt)
{ case 1: *(po+str)=f1(mf); break;
case 2: *(po+str)=f2(mf); break;
case 3: *(po+str)=f3(mf); break;
case 4: *(po+str)=f4(mf); break;
case 5: *(po+str)=f5(mf); break;
case 6: *(po+str)=f6(mf); break;
case 7: *(po+str)=f7(mf); break;
case 8: *(po+str)=f8(mf); break;
case 9: *(po+str)=f9(mf); break;
case 10: *(po+str)=f10(mf); break;
}
}
void Do_Filters(WinHandle w, int nfilt)
{ GWHandle chl;
int i,k;
int *po,*p1,*p2,*p3,*p4,*p5,*pn,iw,ih;
double d1,d2;
Win2d *ud = h_data(w);
if ((chl = ud->ch) == 0) return;
iw=ud->iw; ih=ud->ih;
if(nfilt == 10)
{
po = (int*)h_malloc(iw*2); pn = (int*)h_malloc(iw*2);
p1 = (int*)h_malloc(iw*2); p2 = (int*)h_malloc(iw*2);
p3 = (int*)h_malloc(iw*2); p4 = (int*)h_malloc(iw*2);
p5 = (int*)h_malloc(iw*2);
i = 2;
GetGWL(chl,(short*)p1,iw,i-2);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i-1);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
GetGWL(chl,(short*)p3,iw,i);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
GetGWL(chl,(short*)p4,iw,i+1);
for(k = 0; k < iw; k++) p4[k] = p4[k]-2048;
for( i =2; i < ih-2; i++)
{
GetGWL(chl,(short*)p5,iw,i+2);
for(k = 0; k < iw; k++) p5[k] = p5[k]-2048;
for(k = 2; k < iw-2; k++)
{
d1 = p1[k-2] - p5[k+2]; d1 = d1*d1;
d2 = p5[k-2] - p1[k+2]; d2 = d2*d2;
po[k] = (int)sqrt(d1+d2)+2048;
}
for(k = 0; k < iw; k++) p1[k] = p2[k];
for(k = 0; k < iw; k++) p2[k] = p3[k];
for(k = 0; k < iw; k++) p3[k] = p4[k];
for(k = 0; k < iw; k++) p4[k] = p5[k];
PutGWL(chl,(short*)po,iw,i);
}
h_mfree(pn); h_mfree(po); h_mfree(p1); h_mfree(p2); h_mfree(p3);
h_mfree(p4); h_mfree(p5);
redraw_cw(w);
return;
}
if(nfilt == 4)
{
}
po = (int*)h_malloc(iw*2); pn = (int*)h_malloc(iw*2);
p1 = (int*)h_malloc(iw*2); p2 = (int*)h_malloc(iw*2);
p3 = (int*)h_malloc(iw*2);
i = 1;
GetGWL(chl,(short*)p1,iw,i-1);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
for( i =1; i < ih-1; i++)
{
GetGWL(chl,(short*)p3,iw,i+1);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
filt(p1,p2,p3,po,iw,nfilt);
// memcpy(p1,p2,iw); memcpy(pn,p3,iw);
for(k = 0; k < iw; k++) p1[k] = p2[k];
for(k = 0; k < iw; k++) pn[k] = p3[k];
for(k = 0; k < iw; k++) po[k] = po[k]+2048;
PutGWL(chl,(short*)po,iw,i);
// memcpy(p2,pn,iw);
for(k = 0; k < iw; k++) p2[k] = pn[k];
}
h_mfree(pn); h_mfree(po); h_mfree(p1); h_mfree(p2); h_mfree(p3);
redraw_cw(w);
}
/***********************************************************/
void Do_Scale_Rotate(WinHandle w)
{ int i,k;
int nx,ny,ix,iy;
int *po;
int q1,q2,q3,q4;
double angle;
double hi,hi_t,x,y,u,v,si,co,dx,dy;
double cox = 65536.0;
long cx,cy,cx1,cy1,s1,s2;
long lx,ly,ldx,ldy,lix,liy;
unsigned char *pc,s,p;
IJ ij;
GWHandle ch,chol;
Win2d *ud = h_data(w);
if ((chol=ud->ch) == 0) return;
angle = 3.14159265*ud->angle/180.0;
hi = 1.0/ud->iw; hi_t = hi/ud->scale;
nx = ud->scale*ud->iw; ny = ud->scale*ud->ih;
si = sin(angle); co = cos(angle);
u = -hi_t*(nx/2.0); v = -hi_t*(ny/2.0 - 1);
dx = hi_t*co/hi; dy = hi_t*si/hi;
ldx= cox*dx; ldy = cox*dy;
po = (int*)h_malloc(nx*sizeof(int));
ch = NewGW(f_create("rout.tmp",F_CREATE_NORMAL),0);
for( i = 0; i < ny; i++)
{v+= hi_t;
lx = cox*( u*co - v*si + hi_t*(nx/2.0) )/hi;
ly = cox*( u*si + v*co + hi_t*(ny/2.0) )/hi;
for(k = 0; k < nx; k++)
{
ix = lx >> 16; lx+= ldx;
iy = ly >> 16; ly+= ldy;
liy = iy; liy = liy << 16;
cy = ly - liy;
cy1= 65537L - cy;
lix = ix; lix = lix << 16;
cx = lx - lix;
cx1= 65537L - cx;
ij.i = ix; ij.j = iy; GetGWA(chol, (short*)&q1, 1, &ij);
ij.i = ix+1; ij.j = iy; GetGWA(chol, (short*)&q2, 1, &ij);
ij.i = ix; ij.j = iy+1; GetGWA(chol, (short*)&q3, 1, &ij);
ij.i = ix+1; ij.j = iy+1; GetGWA(chol, (short*)&q4, 1, &ij);
s1 = ((long)q1*cx1+(long)q2*cx) >> 16;
s1 = (s1*cy1)>>16;
s2 = ((long)q3*cx1 + (long)q4*cx) >> 16;
s2 = (s2*cy)>>16;
po[k] = s1+s2;