📄 bmptestview.cpp
字号:
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]=(int) *(m_Buffer1+i*Width+j);
image[2][1]=(int) *(m_Buffer1+i*Width+j-1);
image[2][3]=(int) *(m_Buffer1+i*Width+j+1);
image[1][2]=(int) *(m_Buffer1+(i-1)*Width+j);
image[1][1]=(int) *(m_Buffer1+(i-1)*Width+j-1);
image[1][3]=(int) *(m_Buffer1+(i-1)*Width+j+1);
image[3][2]=(int) *(m_Buffer1+(i+1)*Width+j);
image[3][1]=(int) *(m_Buffer1+(i+1)*Width+j-1);
image[3][3]=(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::OnStruOpen()
{
// TODO: Add your command handler code here
OnStruSub();
OnStruAdd();
}
void CBmpTestView::OnStruClose()
{
// TODO: Add your command handler code here
OnStruAdd();
OnStruSub();
}
void CBmpTestView::OnEditBackup()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_Dib.restoreimage();
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnEditBlue()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP<=8)
{
AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
return;
}
if(pDoc->m_Dib.GetBlueImg())
Invalidate();
}
void CBmpTestView::OnEditGreen()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP<=8)
{
AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
return;
}
if(pDoc->m_Dib.GetGreenImg())
Invalidate();
}
void CBmpTestView::OnEditRed()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP<=8)
{
AfxMessageBox( "此图像为256色图像,目前暂时不能分出独立通道");
return;
}
if(pDoc->m_Dib.GetRedImg())
Invalidate();
}
void CBmpTestView::OnEdgeColorprewitt()
{
// TODO: 一种强有力的非线性算子,加强了纵向,但也造成横向断裂
# include <math.h>
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP<=8)
{
AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
return;
}
int i,j,k,image[10][4],Height,Width;
unsigned int a;
BYTE * m_Buffer1;
double e1,e2,e3;
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
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);
}
for (i=1;i<Height-1;i++)
{
for (j=1;j<(int)Width/3 -1;j++)
{
for (k=0;k<3;k++)
{
image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
image[4][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j-1)*3+k);
image[6][k+1]=(unsigned int) *(m_Buffer1+i*Width+(j+1)*3+k);
image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
}
e1=sqrt(pow((image[1][1]-image[3][1]),2)+pow((image[1][2]-image[3][2]),2)+pow((image[1][3]-image[3][3]),2));
e2=sqrt(pow((image[4][1]-image[6][1]),2)+pow((image[4][2]-image[6][2]),2)+pow((image[4][3]-image[6][3]),2));
e3=sqrt(pow((image[7][1]-image[9][1]),2)+pow((image[7][2]-image[9][2]),2)+pow((image[7][3]-image[9][3]),2));
a=(unsigned int)(e1+e2+e3);
a=((a>255)?255:a);
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnEdgeColorrobert()
{
// TODO: 一种强烈的非线性算子,加强了双45度方向,保持了字符笔划的完整性
# include <math.h>
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP<=8)
{
AfxMessageBox( "此图像为256色图像,目前该算子还不支持这种图像格式");
return;
}
int i,j,k,image[10][4],Height,Width;
unsigned int a;
BYTE * m_Buffer1;
double e2,e1;
//filtering
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
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);
}
for (i=1;i<Height-1;i++)
{
for (j=1;j<(int)Width/3 -1;j++)
{
for (k=0;k<3;k++)
{
image[1][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j-1)*3+k);
image[3][k+1]=(unsigned int) *(m_Buffer1+(i-1)*Width+(j+1)*3+k);
image[7][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j-1)*3+k);
image[9][k+1]=(unsigned int) *(m_Buffer1+(i+1)*Width+(j+1)*3+k);
}
e1=pow((image[1][1]-image[9][1]),2)+pow((image[1][2]-image[9][2]),2)+pow((image[1][3]-image[9][3]),2);
e2=pow((image[3][1]-image[7][1]),2)+pow((image[3][2]-image[7][2]),2)+pow((image[3][3]-image[7][3]),2);
a=(unsigned int)sqrt(e1+e2);
a=((a>255)?255:a);
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=a;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=a;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=a;
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnMidFiltLine()
{
// 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[6],medium;
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (j=0;j<Width +1;j++)
{
for (i=2;i<Height-2;i++)
{
image[3]=(int) *(m_Buffer1+i*Width+j);
image[2]=(int) *(m_Buffer1+(i-1)*Width+j);
image[4]=(int) *(m_Buffer1+(i+1)*Width+j);
image[1]=(int) *(m_Buffer1+(i-2)*Width+j);
image[5]=(int) *(m_Buffer1+(i+2)*Width+j);
//冒泡排序
for(i1=1;i1<5;i1++)
{
for(j1=i1+1;j1<6;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[3];
}
}
}
else
{
// 24位彩色中值滤波
int image[6][4],medium[4],k;
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
for (j=0;j<(int)Width/3;j++)
{
for (i=2;i<Height-2;i++)
{
for(k=0;k<3;k++)
{
image[3][k+1]=(int) *(m_Buffer1+i*Width+j*3+k);
image[2][k+1]=(int) *(m_Buffer1+(i-1)*Width+j*3+k);
image[4][k+1]=(int) *(m_Buffer1+(i+1)*Width+j*3+k);
image[1][k+1]=(int) *(m_Buffer1+(i-2)*Width+j*3+k);
image[5][k+1]=(int) *(m_Buffer1+(i+2)*Width+j*3+k);
}
//冒泡排序
for(i1=1;i1<5;i1++)
{
for(j1=i1+1;j1<6;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[3][1];
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=image[3][2];
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=image[3][3];
}
}
}
}
if(m_Buffer1)
{
delete [] m_Buffer1;
m_Buffer1=0;
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnDensityScan()
{
// TODO: Add your command handler code here
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
# include <math.h>
int i,j,Height,Width;
if(pDoc->m_Dib.BPP==8)
return;
Height=(int) pDoc->m_Dib.Height;
Width=(int) pDoc->m_Dib.Bpl;
int image[2048][4],b[2048],count;
double diff;
//扫描从图像底部开始
for (i=0;i<Height;i++)
{
for(j=0;j<(int)Width/3;j++)
{
image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
if(image[j][1]<60)
{
image[j][1]=0;
image[j][2]=0;
image[j][3]=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
}
}
j=0;
count=0;
while (j<(int)Width/3)
{
//因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
diff=abs(image[j][1]-image[j+1][1])*1.7;
b[j]=(((int)diff>150)?1:0);
count+=b[j];
j++;
}
//变化15次已是最高限了,再高就会使车牌出现空线
if (count<15)
{
for(j=0;j<(int)Width/3;j++)
{
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
}
}
else
{
//分区域扫描法
count=0;
//第一节
for(j=0;j<(int)Width/45;j++)
count+=b[j];
//剩余部分的简化算法
do
{
//变化6次是最佳经验值
if(count<4)
{
*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+(j-(int)Width/45)*3+2)=0;
}
count=count+b[j]-b[j-(int)Width/45];
j++;
}while(j<(int)Width/3);
for(j=j-(int)Width/45;j<(int)Width/3;j++)
{
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
}
//进一步扫描,消除图像中的残留点
for(j=0;j<(int)Width/3;j++)
{
image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
}
j=0;
count=0;
while (j<(int)Width/3)
{
//因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
diff=abs(image[j][1]-image[j+1][1])*1.7;
b[j]=(((int)diff>220)?1:0);
count+=b[j];
j++;
}
//变化3次已是最高限了,再高就会使车牌出现空线
if (count<8)
{
for(j=0;j<(int)Width/3;j++)
{
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
}
}
}
}
for (i=Height-5;i<Height;i++)
{
for (j=0;j<(int)Width/3 ;j++)
{
*(pDoc->m_Dib.m_Buffer+i*Width+j*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+j*3+2)=0;
}
}
//反向扫描
for (i=0;i<Height;i++)
{
for (j=0;j<(int)Width/3 ;j++)
{
image[j][1]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3);
image[j][2]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+1);
image[j][3]=(unsigned int) *(pDoc->m_Dib.m_Buffer+i*Width+j*3+2);
}
j=(int)Width/3;
while (j>=1)
{
//因每点三分量均相等,故可简化 diff=sqrt(pow((image[j][1]-image[j+3][1]),2)+pow((image[j][2]-image[j+3][2]),2)+pow((image[j][3]-image[j+3][3]),2));
diff=abs(image[j][1]-image[j-1][1])*1.7;
b[j]=(((int)diff>60)?1:0);
j--;
}
//变化15次已是最高限了,再高就会使车牌出现空线
//分区域扫描法
count=0;
//第一节
for(j=(int)Width/3-1;j>=(int)Width/3-(int)Width/45;j--)
count+=b[j];
//剩余部分的简化算法
do
{
//变化6次是最佳经验值
if(count<4)
{
*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+1)=0;
*(pDoc->m_Dib.m_Buffer+i*Width+(j+(int)Width/45)*3+2)=0;
}
count=count+b[j]-b[j+(int)Width/45];
j--;
}while(j>=1);
}
pDoc->m_BM=true;
Invalidate();
}
void CBmpTestView::OnRowDilation()
{
// TODO: Add your command handler code here
// 形态学:横向膨胀,结构和,两边各扩展6个像素
CBmpTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_Dib.BPP==8)
return;
int i,j,i1,j1,Height,Width,a;
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);
}
for (i=2;i<Height-3;i++)
{
for (j=4;j<(int)Width/3-5;j++)
{
a=0;
for (i1=-2;i1<3;i1++)
{
for(j1=-4;j1<5;j1++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -