📄 bmptestview.cpp
字号:
}
if (black>white)
m_Gradmax=black;
else
m_Gradmax=white;
m_Grade[0]=black;
m_Grade[255]=white;
}
pDoc->m_BM=false;
Invalidate();
}
void CBmpTestView::OnZftBalance()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i;
double m_GradAdd[256];
long j;
m_GradAdd[0]=m_Grade[0];
// calculate integral
for ( i=1;i<256;i++)
{
m_GradAdd[i]=0;
}
for ( i=1;i<256;i++)
{
m_GradAdd[i]=m_GradAdd[i-1]+m_Grade[i];
}
for ( i=1;i<256;i++)
{
m_GradAdd[i]=m_GradAdd[i]*255/m_GradAdd[255];
}
// 归一化阈值面积function
for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
{
*(pDoc->m_Dib.m_Buffer+j)=(int) (m_GradAdd[(*(pDoc->m_Dib.m_Buffer+j))]*255/m_GradAdd[255]);
}
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
}
for ( i=0;i<256;i++)
{
if (m_Grade[i]>m_Gradmax)
m_Gradmax=m_Grade[i];
}
pDoc->m_BM=false;
Invalidate();
}
void CBmpTestView::OnImageShow()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnDtsmIn()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP!=8)
{
AfxMessageBox( "此图像为非256色图像,目前该算子还不支持这种图像格式");
return;
}
float T0,u1,u2,T1,w1,w2,u;
int i,decimal, sign;
long j;
char string[80]="二值化最佳阈值为",*string1,*string2;
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
}
u=0;
for(i=0;i<256;i++)
u=u+(float) i*m_Grade[i]/(int) pDoc->m_Dib.BufferSize;
T0=u;T1=0;
while (fabs(T0-T1)>0.01)
{
w1=0;w2=0;u1=0;u2=0;
for(i=0;i<=int(T0);i++)
{
w1=w1+m_Grade[i];
u1=u1+i*m_Grade[i];
}
for(i=int(T0)+1;i<256;i++)
{
w2=w2+m_Grade[i];
u2=u2+i*m_Grade[i];
}
T1=T0;u1=u1/w1;u2=u2/w2;T0=0.5*(u1+u2);
}
string2=_fcvt(T0, 0, &decimal, &sign );
string1=strcat(string,string2);
AfxMessageBox(string1);
for ( j=0;j<(long int) pDoc->m_Dib.BufferSize;j++)
{
*(pDoc->m_Dib.m_Buffer+j)=(*(pDoc->m_Dib.m_Buffer+j)>=T0)?255:0;
}
}
void CBmpTestView::OnDtsmShow()
{
// TODO: Add your command handler code here
CBmpTestView::OnImageShow();
}
void CBmpTestView::OnDtsmOut()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
float u,uT[255],w[255],sigma[255],sigmamax;
int i,T,Topt;
long j;
char string[80]="类间方差法二值化最佳阈值为",*string1,*string2,buffer[10];
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
}
u=0;
for(i=0;i<256;i++)
{
u=u+i*m_Grade[i];
}
u=u/pDoc->m_Dib.BufferSize;
sigmamax=0;Topt=0;
for(T=0;T<256;T++)
{
w[T]=0;uT[T]=0;
for(i=0;i<=T;i++)
{
w[T]=w[T]+m_Grade[i];
uT[T]=uT[T]+i*m_Grade[i];
}
uT[T]=uT[T]/pDoc->m_Dib.BufferSize;
w[T]=w[T]/pDoc->m_Dib.BufferSize;
sigma[T]=(u*w[T]-uT[T])*(u*w[T]-uT[T])/w[T]*(1-w[T]);
if(sigma[T]>sigmamax)
{
sigmamax=sigma[T];Topt=T;
}
}
string2=_itoa(Topt, buffer,10);
string1=strcat(string,string2);
AfxMessageBox(string1);
}
void CBmpTestView::OnRecFilt()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j,image[4][4],Height,Width;
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width +1;j++)
{
image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
*(pDoc->m_Dib.m_Buffer+i*Width+j)=(image[1][1]+image[1][2]+image[1][3]+image[2][1]+image[2][2]+image[2][3]+image[3][1]+image[3][2]+image[3][3])/9;
}
}
pDoc->m_BM=true;
Invalidate();
}
/*void queue(int *im,int n)
//int im[],n;
{
int i,j,medium;
for(i=1;i<n;i++)
{
for(j=i+1;j<n+1;j++)
{
if(im(j)>im(i))
{
medium=im(i);
im(i)=im(j);
im(j)=medium;
}
}
}
}*/
void CBmpTestView::OnMidFilt()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
BYTE * m_Buffer1;
int i,Height,Width,i1,j1,j;
//filtering
m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
}
if(pDoc->m_Dib.BPP==8)
{
int image[10],medium;
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width +1;j++)
{
image[5]=(int) *(m_Buffer1+i*Width+j);
image[4]=(int) *(m_Buffer1+i*Width+j-1);
image[6]=(int) *(m_Buffer1+i*Width+j+1);
image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
image[1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
image[3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
image[8]=(int) *(m_Buffer1+(i+1)*Width+j);
image[7]=(int) *(m_Buffer1+(i+1)*Width+j-1);
image[9]=(int) *(m_Buffer1+(i+1)*Width+j+1);
for(i1=1;i1<9;i1++)
{
for(j1=i1+1;j1<10;j1++)
{
if(image[j1]>image[i1])
{
medium=image[i1];
image[i1]=image[j1];
image[j1]=medium;
}
}
}
*(pDoc->m_Dib.m_Buffer+i*Width+j)=image[5];
}
}
}
else
{
// 24位彩色中值滤波
int image[10][4],medium[4],k;
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (i=1;i<Height-1;i++)
{
for (j=1;j<(int)Width/3 ;j++)
{
for(k=0;k<3;k++)
{
image[5][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
image[4][k+1]=(int) *(m_Buffer1+i*Width+(j-1)*3+k);
image[6][k+1]=(int) *(m_Buffer1+i*Width+(j+1)*3+k);
image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
image[1][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
image[3][k+1]=(int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
image[8][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
image[7][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
image[9][k+1]=(int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
}
//冒泡排序
for(i1=1;i1<9;i1++)
{
for(j1=i1+1;j1<10;j1++)
{
if((image[j1][1]+image[j1][2]+image[j1][3])/3>(image[i1][1]+image[i1][2]+image[i1][3])/3)
{
for(k=1;k<4;k++)
{
medium[k]=image[i1][k];
image[i1][k]=image[j1][k];
image[j1][k]=medium[k];
}
}
}
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=image[5][1];
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[5][2];
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[5][3];
}
}
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnEdgeRobert()
{
// TODO: Add your command handler code here
#include <math.h>
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP>8)
{
AfxMessageBox("该算子不能处理8位图像");
return;
}
BYTE * m_Buffer1;
int i,j,image[10],Height,Width,a,b;
//filtering
m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
}
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width -1;j++)
{
image[1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
image[3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
image[7]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
image[9]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
a=abs(image[1]-image[9]);
b=abs(image[3]-image[7]);
*(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>b)?a:b);
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnEdgeLaplace()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP>8)
{
AfxMessageBox("该算子只能处理8位图像");
return;
}
int i,j,image[10],Height,Width,a;
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
// Total=(int) pDoc->m_Dib.BufferSize;
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width +1;j++)
{
image[5]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
image[4]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
image[6]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
image[2]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
image[1]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
image[3]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
image[8]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
image[7]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
image[9]=(unsigned int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
a=image[2]+image[4]+image[6]+image[8]-4*image[5];
*(pDoc->m_Dib.m_Buffer+i*Width+j)=((a>0)?a:0);
}
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnGauseFilt()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP>8)
{
AfxMessageBox("该算子只能处理8位图像");
return;
}
int i,j,image[4][4],Height,Width;
double a0,a1,a2;
a0=1/sqrt(2*3.14);
a1=0.6065/sqrt(2*3.14);
a2=exp(-1)/sqrt(2*3.14);
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width +1;j++)
{
image[2][2]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j);
image[2][1]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j-1);
image[2][3]=(int) *(pDoc->m_Dib.m_Buffer1+i*Width+j+1);
image[1][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j);
image[1][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j-1);
image[1][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i-1)*Width+j+1);
image[3][2]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j);
image[3][1]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j-1);
image[3][3]=(int) *(pDoc->m_Dib.m_Buffer1+(i+1)*Width+j+1);
*(pDoc->m_Dib.m_Buffer+i*Width+j)=(int)(image[1][1]*a2+image[1][2]*a1+image[1][3]*a2+image[2][1]*a1+image[2][2]*a0+image[2][3]*a1+image[3][1]*a2+image[3][2]*a1+image[3][3]*a2);
}
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnEdgeMarr()
{
// TODO: Add your command handler code here
OnGauseFilt();
OnEdgeLaplace();
}
void CBmpTestView::OnStruAdd()
{
// 二值形态学:膨胀,结构和
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int i,j,image[4][4],Height,Width,a,k;
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
BYTE * m_Buffer1;
m_Buffer1=new BYTE[pDoc->m_Dib.BufferSize];
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
*(m_Buffer1+j)=*(pDoc->m_Dib.m_Buffer+j);
}
m_Gradmax=0;
for ( i=0;i<256;i++)
{
m_Grade[i]=0;
}
for ( j=0;j<(int) pDoc->m_Dib.BufferSize;j++)
{
m_Grade[int(*(pDoc->m_Dib.m_Buffer+j))]++;
}
m_Gradmax=0;
for ( i=1;i<256;i++)
{
if (m_Grade[i]>m_Gradmax)
{
m_Gradmax=m_Grade[i];
k=i;
}
}
for (i=1;i<Height-1;i++)
{
for (j=1;j<Width +1;j++)
{
image[2][2]=(unsigned int) *(m_Buffer1+i*Width+j);
image[2][1]=(unsigned int) *(m_Buffer1+i*Width+j-1);
image[2][3]=(unsigned int) *(m_Buffer1+i*Width+j+1);
image[1][2]=(unsigned int) *(m_Buffer1+(i-1)*Width+j);
image[1][1]=(unsigned int) *(m_Buffer1+(i-1)*Width+j-1);
image[1][3]=(unsigned int) *(m_Buffer1+(i-1)*Width+j+1);
image[3][2]=(unsigned int) *(m_Buffer1+(i+1)*Width+j);
image[3][1]=(unsigned int) *(m_Buffer1+(i+1)*Width+j-1);
image[3][3]=(unsigned int) *(m_Buffer1+(i+1)*Width+j+1);
a=image[1][1]||image[1][2]||image[1][3]||image[2][1]||image[2][2]||image[2][3]||image[3][1]||image[3][2]||image[3][3];
*(pDoc->m_Dib.m_Buffer+i*Width+j)=(a?k:0);
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnStruSub()
{
// TODO: Add your command handler code here
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -