📄 处理..c
字号:
g1 = norm (dx[i-1][j-1], dy[i-1][j-1]);
} else
{
g3 = norm (dx[i+1][j-1], dy[i+1][j-1]);
g1 = norm (dx[i-1][j+1], dy[i-1][j+1]);
}
} else
{
xx = fabs(yc)/fabs(xc);
yy = 1.0;
g2 = norm (dx[i][j+1], dy[i][j+1]);
g4 = norm (dx[i][j-1], dy[i][j-1]);
if (xc*yc > 0.0)
{
g3 = norm (dx[i-1][j-1], dy[i-1][j-1]);
g1 = norm (dx[i+1][j+1], dy[i+1][j+1]);
}
else
{
g1 = norm (dx[i-1][j+1], dy[i-1][j+1]);
g3 = norm (dx[i+1][j-1], dy[i+1][j-1]);
}
}
if ( (g > (xx*g1 + (yy-xx)*g2)) &&
(g > (xx*g3 + (yy-xx)*g4)) )
{
if (g*MAG_SCALE <= 255)
list0[i][j] = (unsigned char)(g*MAG_SCALE);
else
list0[i][j] = 255;
list2[i][j] = atan2 (yc, xc) *ORI_SCALE;
} else
{
list0[i][j] = 0;
list2[i][j] = 0;
}
}
}
}
void seperable_convolution (struct IMAGE *image,BYTE **list1, int Dx,int Dy,float *gau, int width,
float **smx, float **smy)
{
int i,j,k, I1, I2, nr, nc;
float x, y;
nr = Dx;
nc = Dy;
for (i=0; i<nr; i++)
for (j=0; j<nc; j++)
{
x = gau[0] * list1[i][j]; y = gau[0] * list1[i][j];
for (k=1; k<width; k++)
{
I1 = (i+k)%nr; I2 = (i-k+nr)%nr;
y += gau[k]*list1[I1][j] + gau[k]*list1[I2][j];
I1 = (j+k)%nc; I2 = (j-k+nc)%nc;
x += gau[k]*list1[i][I1] + gau[k]*list1[i][I2];
}
smx[i][j] = x; smy[i][j] = y;
}
}
void dxy_seperable_convolution (float** im, int nr, int nc, float *gau,
int width, float **sm, int which)
{
int i,j,k, I1, I2;
float x;
for (i=0; i<nr; i++)
for (j=0; j<nc; j++)
{
x = 0.0;
for (k=1; k<width; k++)
{
if (which == 0)
{
I1 = (i+k)%nr; I2 = (i-k+nr)%nr;
x += -gau[k]*im[I1][j] + gau[k]*im[I2][j];
}
else
{
I1 = (j+k)%nc; I2 = (j-k+nc)%nc;
x += -gau[k]*im[i][I1] + gau[k]*im[i][I2];
}
}
sm[i][j] = x;
}
}
float norm (float x, float y)
{
return (float) sqrt ( (double)(x*x + y*y) );
}
//gaussian 函数//
float gauss(float x)
{
float xx;
if (sigma == 0) return 0.0;
xx = (float)exp((double) ((-x*x)/(2*sigma*sigma)));
return xx;
}
// Gaussian函数的一阶倒数 //
float dGauss (float x)
{
return -x/(sigma*sigma) * gauss(x);
}
//canny边缘检测.....................................//
void EX13(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8)) return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
canny(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
Offset=0;
}
//小波变换.................................//
void EX14(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8))
return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
wavelet(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
Offset=0;
}
//小波函数//
void wavelet(struct IMAGE *image,int x,int y,int Dx,int Dy)
{ BYTE *buf1,*buf0;
BYTE **list1,**list0;
int i,j,Ni,Nj;
float **original,**original1;
float mse=0;
Ni=Dx,Nj=Dy;
buf1 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
buf0 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
getimage(image,x,y,Dx,Dy,buf1);
list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
original=allocate_2d_float(Ni,Nj,0);
original1=allocate_2d_float(Ni,Nj,0);
for(i=0;i<Dy;i++) {
list1[i]=buf1+i*Dx;
list0[i]=buf0+i*Dx;
}
//for(i=0;i<Dx;i++)
// for(j=0;j<Dy;j++)
// list1[i][j]=list1[i][j]+(float)(rand()/1000); 加噪声
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
original[i][j]=list1[i][j];
}
}
wavelet_transform_test(original,original1,Ni,Nj,1);
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
list0[i][j]=(BYTE)original1[i][j];
}
}
for(i=1;i<Dy-1;i++)
setimage(image,x+1,y+i,Dx-2,1,&list0[i][1]);
free(buf1);
free(buf0);
free(list1);
free(list0);
}
//小波变换.................................//
void EX17(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8))
return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
wavelet_edge(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
Offset=0;
}
//小波函数//
void wavelet_edge(struct IMAGE *image,int x,int y,int Dx,int Dy)
{ BYTE *buf1,*buf0;
BYTE **list1,**list0;
BYTE *buf2;
BYTE **list2;
int width;
float **dx,**dy;
int i,j;
float z;
int low= 0,high=-1;
int Ni,Nj;
float **original,**original1;
float mse=0;
Ni=Dx,Nj=Dy;
buf2 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
buf1 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
buf0 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
getimage(image,x,y,Dx,Dy,buf1);
list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
list2=(BYTE**) malloc(Dy*sizeof(BYTE*));
dx = allocate_2d_float(Dx,Dy,0);
dy = allocate_2d_float(Dx,Dy,0);
original=allocate_2d_float(Ni,Nj,0);
original1=allocate_2d_float(Ni,Nj,0);
for(i=0;i<Dy;i++) {
list1[i]=buf1+i*Dx;
list0[i]=buf0+i*Dx;
list2[i]=buf2+i*Dx;
}
//for(i=0;i<Dx;i++)
// for(j=0;j<Dy;j++)
// list1[i][j]=list1[i][j]+(float)(rand()/1000); 加噪声
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
original[i][j]=list1[i][j];
}
}
wavelet_transform_edge(original,original1,Ni,Nj,1);
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
list0[i][j]=(BYTE)original1[i][j];
}
}
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
dx[i][j]=list0[i][j];
}
}
wavelet_transform_edge(original,original1,Ni,Nj,0);
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
list0[i][j]=(BYTE)original1[i][j];
}
}
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
dy[i][j]=list0[i][j];
}
}
for (i=0; i<Ni; i++)
{ for (j=0; j<Nj; j++)
{
z = norm (dx[i][j], dy[i][j]);
list0[i][j] = (unsigned char)(z*MAG_SCALE);
}
}
nonmax_suppress (dx, dy, Image[1]->wid,Image[1]->hei, list0, list2);
hysteresis (high, low, Image[1], list1,list0, list2);
for(i=1;i<Dy-1;i++)
setimage(image,x+1,y+i,Dx-2,1,&list1[i][1]);
free(dx[0]); free(dx);
free(dy[0]); free(dy);
free(buf1);
free(buf0);
free(list1);
free(list0);
free(buf2);
free(list2);
}
//小波重构...........................................//
void EX15(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8))
return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
waveletinverse(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
Offset=0;
}
//小波回复//
void waveletinverse(struct IMAGE *image,int x,int y,int Dx,int Dy)
{ BYTE *buf1,*buf0;
BYTE **list1,**list0;
int i,j,Ni,Nj;
float **original,**original1;
float mse=0;
Ni=Dx,Nj=Dy;
buf1 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
buf0 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
getimage(image,x,y,Dx,Dy,buf1);
list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
original=allocate_2d_float(Ni,Nj,0);
original1=allocate_2d_float(Ni,Nj,0);
for(i=0;i<Dy;i++) {
list1[i]=buf1+i*Dx;
list0[i]=buf0+i*Dx;
}
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
original[i][j]=list1[i][j];
}
}
wavelet_inverse_test(original,original1,Ni,Nj);
for(i=0;i<Ni;i++) {
for(j=0;j<Nj;j++) {
list0[i][j]=(BYTE)original1[i][j];
}
}
for(i=1;i<Dy-1;i++)
setimage(image,x+1,y+i,Dx-2,1,&list0[i][1]);
free(buf1);
free(buf0);
free(list1);
free(list0);
}
void EX18(HWND hWnd)
{
if ((Image[0]->hdib==NULL)||(Image[0]->bitcount<8))
return;
ClearDDB();
WriteDDB(Image[0], 0, 0, 0, 0,512,512);
ColorToGray(0,1);
hmm_edge(Image[1],0,0,Image[1]->wid,Image[1]->hei);
WriteDDB(Image[1],512, 0, 0, 0,512,512);
InvalidateRect(hWnd,NULL,FALSE);
Offset=0;
}
void hmm_edge(struct IMAGE *image,int x,int y,int Dx,int Dy)
{
BYTE **list0,**list1;
BYTE *buf0,*buf1;
float **original,**original1;
struct HMM *phmm;
int **O;
int i,j,t,m,k;
int T=3;
double **alpha, **beta, **gamma;
int *pniter;
double *plogprobinit;
double *plogprobfinal;
double **delta;
int **psi;
int **q;
double *pprob;
buf0 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
list0=(BYTE**) malloc(Dy*sizeof(BYTE*));
buf1 =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
list1=(BYTE**) malloc(Dy*sizeof(BYTE*));
original=allocate_2d_float(Dx,Dy,0);
original1=allocate_2d_float(Dx,Dy,0);
getimage(image,x,y,Dx,Dy,buf1);
O=(int **)imatrix(1,T,1,Dx/8*Dy/8);
phmm =(struct HMM*)malloc(sizeof(struct HMM*));
alpha=(double **)dmatrix(1,T,1,2);
beta=(double **)dmatrix(1,T,1,2);
gamma=(double **)dmatrix(1,T,1,2);
plogprobinit=dvector(1,T);
plogprobfinal=dvector(1,T);
pniter=ivector(1,T);
delta=(double **)dmatrix(1,T,1,2);
psi=(double **)dmatrix(1,T,1,2);
q=(int **)imatrix(1,T,1,(Dx/8)*(Dy/8));
pprob=dvector(1,2);
for(i=0;i<Dy;i++)
{list0[i]=buf0+i*Dx;
list1[i]=buf1+i*Dx;
}
for(i=0;i<Dx;i++) {
for(j=0;j<Dy;j++) {
original[i][j]=list1[i][j];
}
}
wavelet_transform_test(original,original1,Dx,Dy,1);
for(i=0;i<Dx;i++) {
for(j=0;j<Dy;j++) {
list0[i][j]=(BYTE)original1[i][j];
}
}
wavelet_hmm_edgev(Image[1],0,0,Image[1]->wid,Image[1]->hei,O);
InitHMM( phmm,2,256);
BaumWelch(phmm, T,O,alpha,beta,
gamma,pniter,plogprobinit,plogprobfinal,Dx,Dy);
for(m=1;m<=(Dx/8)*(Dy/8);m++)
{
ViterbiLog(phmm,T,O,delta,psi,q,pprob,m);
}
for(m=1;m<=(Dx/8)*(Dy/8);m++)
{
for(t=1;t<=T;t++)
{
if(q[t][m]==1) q[t][m]=0;
else q[t][m]=255;
}
}
m=0;
for(i=1;i<=Dx/8;i++) {
for(j=Dy/8;j<Dy/4;j++) {
m++;
list0[i-1][j]=q[1][m];
}
}
m=0;
for(i=1;i<=Dx/4;i+=2) {
for(j=Dy/4;j<Dy/2;j+=2) {
m++;
list0[i-1][j]=q[2][m];
}
}
m=0;
for(i=1;i<=Dx/2;i+=4) {
for(j=Dy/2;j<Dy;j+=4) {
m++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -