📄 imagecodesdoc.cpp
字号:
{
convo[r][0]=GrayValue[r][0];
convo[r][c0-1]=GrayValue[r][c0-1];
}
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
sort[i][j]=GrayValue[r+i][c+j];
convo[r+1][c+1]=SortPinghuaK(sort);//取灰度值最相近6个像素的平均值赋给中心像素
}
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
::SetCursor(mHArrow);
}
unsigned int CImageCodesDoc::SortPinghuaK(unsigned int sort[3][3])
{
unsigned int sort1[9],number[9],cha[9],count,i,j,t,sum;
for(i=0,count=0;i<3;i++)
for(j=0;j<3;j++)
sort1[count++]=sort[i][j];//先把二维数组转化为一维数组
for(i=0;i<9;i++)//cha中存放周围像素与中心像素的差值,number中存放9个像素中每个像素的标号
cha[i]=abs(sort1[i]-sort1[4]),number[i]=i;
for(count=1;count<4;count++)
for(i=0;i<9-count;i++)
if(cha[i]>cha[i+1])
{//大数和对应的标号都要沉底
t=cha[i],cha[i]=cha[i+1],cha[i+1]=t;
t=number[i],number[i]=number[i+1],number[i+1]=t;
}
sort1[number[6]]=0;//把与中心像素最远的3个像素点的值置0。
sort1[number[7]]=0;
sort1[number[8]]=0;
for(sum=0,i=0;i<9;i++)
sum+=sort1[i];//求最接近的6个像素的和
sum=(unsigned int)(sum*0.167);//求6个像素的平均值
if(sum>255)sum=255;//溢出检验
return(sum);//返回平均值
}
void CImageCodesDoc::OnPinghuaK1()
{
// TODO: Add your command handler code here
label=TRUE;//对当前图处理,原理同上
if(convoflag==false) CopyGrayValueToConvo();
::SetCursor(mHWait);
unsigned int r,c,sort[3][3];
unsigned int i,j;
for(c=0;c<c0;c++)
{
GrayValue[0][c]=convo[0][c];
GrayValue[r0-1][c]=convo[r0-1][c];
}
for(r=1;r<r0-1;r++)
{
GrayValue[r][0]=convo[r][0];
GrayValue[r][c0-1]=convo[r][c0-1];
}
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
sort[i][j]=convo[r+i][c+j];
GrayValue[r+1][c+1]=SortPinghuaK(sort);
}
CopyGVToConvo();
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
Grayflag=false;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPinghuaChao() //超限像素平滑
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c,i,j,temp;
double sum=0.0;
::SetCursor(mHWait);
// TemplateConvolution(T);
if(Grayflag==false) Gray();
for(c=0;c<c0;c++)
{
convo[0][c]=GrayValue[0][c];
convo[r0-1][c]=GrayValue[r0-1][c];
}
for(r=1;r<r0-1;r++)
{
convo[r][0]=GrayValue[r][0];
convo[r][c0-1]=GrayValue[r][c0-1];
}
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
sum+=GrayValue[r+i][c+j];
temp=abs((int)(sum*0.11));
if(temp>255)
convo[r+1][c+1]=255;
if(abs(GrayValue[r+1][c+1]-temp)>20)//是否与中心像素相差大于20
convo[r+1][c+1]=temp;//若是,中心像素就改变
else
convo[r+1][c+1]=GrayValue[r+1][c+1];//否则中心像素不变
sum=0.0;
}
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPinghuaChao1()
{
// TODO: Add your command handler code here
label=TRUE; //对当前图进行处理
unsigned int r,c,i,j,temp;
double sum=0.0;
::SetCursor(mHWait);
// TemplateConvolution(T);
if(convoflag==false) CopyGrayValueToConvo();
for(c=0;c<c0;c++)
{
GrayValue[0][c]=convo[0][c];
GrayValue[r0-1][c]=convo[r0-1][c];
}
for(r=1;r<r0-1;r++)
{
GrayValue[r][0]=convo[r][0];
GrayValue[r][c0-1]=convo[r][c0-1];
}
for(r=0;r<r0-2;r++)
for(c=0;c<c0-2;c++)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
sum+=convo[r+i][c+j];
temp=abs((int)(sum*0.11));
if(temp>255)
GrayValue[r+1][c+1]=255;
if(abs(convo[r+1][c+1]-temp)>20)
GrayValue[r+1][c+1]=temp;
else
GrayValue[r+1][c+1]=convo[r+1][c+1];
sum=0.0;
}
CopyGVToConvo();
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
Grayflag=false;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPointStretch() //灰度拉伸
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
double temp;
if(Grayflag==false) Gray();
::SetCursor(mHWait);
for(r=0;r<r0;r++)
for(c=0;c<c0;c++)
{
if(GrayValue[r][c]<150)//拉伸小于150的像素
temp=GrayValue[r][c]*1.5;
else
temp=150+(GrayValue[r][c]-150)*0.286;//抑制大于150的像素
if(temp>255)
convo[r][c]=255;
else
convo[r][c]=(int)(temp);
}
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPointStretch1()
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
double temp;
if(convoflag==false) CopyGrayValueToConvo();
::SetCursor(mHWait);
for(r=0;r<r0;r++)
for(c=0;c<c0;c++)
{
if(convo[r][c]<150)
temp=convo[r][c]*1.5;
else
temp=150+(convo[r][c]-150)*0.286;
if(temp>255)
GrayValue[r][c]=255;
else
GrayValue[r][c]=(int)(temp);
}
CopyGVToConvo();
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
Grayflag=false;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPointWindow() //窗口变换
{
// TODO: Add your command handler code here
label=false;
unsigned int r,c;
if(Grayflag==false) Gray();
::SetCursor(mHWait);
for(r=0;r<r0;r++)
for(c=0;c<c0;c++)
{
if(GrayValue[r][c]>100)//大于100的像素统统赋成100,滤除亮的像素点
convo[r][c]=100;
else
convo[r][c]=GrayValue[r][c];
}
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnPointWindow1()
{
// TODO: Add your command handler code here
label=TRUE;
unsigned int r,c;
if(convoflag==false) CopyGrayValueToConvo();
::SetCursor(mHWait);
for(r=0;r<r0;r++)
for(c=0;c<c0;c++)
{
if(convo[r][c]>110)
GrayValue[r][c]=110;
else
GrayValue[r][c]=convo[r][c];
}
CopyGVToConvo();
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
Grayflag=false;
::SetCursor(mHArrow);
}
void CImageCodesDoc::OnUpdatePinghuaChao(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePinghuaChao1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePinghuaK(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePinghuaK1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointEnhance(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointEnhance1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointStretch(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointStretch1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointWindow(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdatePointWindow1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateEdgePrewitt(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnUpdateEdgePrewitt1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(trans!=NULL);
}
void CImageCodesDoc::OnEdgePrewitt()
{
// TODO: Add your command handler code here
unsigned int i,j,GrayColor,Wx,Wy;
label=false;
if(Grayflag==false) Gray();
::SetCursor(mHWait);
for(i=1;i<r0-1;i++)//prewitt算法
for(j=1;j<c0-1;j++)
{
Wx=(GrayValue[i-1][j+1]+GrayValue[i][j+1]+GrayValue[i+1][j+1])
-(GrayValue[i-1][j-1]+GrayValue[i][j-1]+GrayValue[i+1][j-1]);
Wy=(GrayValue[i+1][j-1]+GrayValue[i+1][j]+GrayValue[i+1][j+1])
-(GrayValue[i-1][j-1]+GrayValue[i-1][j]+GrayValue[i-1][j+1]);
GrayColor=abs(Wx)+abs(Wy);
if(GrayColor>255) GrayColor=255;
convo[i][j]=GrayColor;
}
::SetCursor(mHArrow);
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
convoflag=TRUE;
}
void CImageCodesDoc::OnEdgePrewitt1()
{
// TODO: Add your command handler code here
label=true;
if(convoflag==false) CopyGrayValueToConvo();
unsigned int Wx,Wy,GrayColor;
unsigned int i,j,r,c;
::SetCursor(mHWait);
for(c=0;c<c0;c++)
{
GrayValue[0][c]=255;
GrayValue[r0-1][c]=255;
}
for(r=1;r<r0-1;r++)
{
GrayValue[r][0]=255;
GrayValue[r][c0-1]=255;
}
for(i=1;i<r0-1;i++)
for(j=1;j<c0-1;j++)
{
Wx=(convo[i-1][j+1]+convo[i][j+1]+convo[i+1][j+1])
-(convo[i-1][j-1]+convo[i][j-1]+convo[i+1][j-1]);
Wy=(convo[i+1][j-1]+convo[i+1][j]+convo[i+1][j+1])
-(convo[i-1][j-1]+convo[i-1][j]+convo[i-1][j+1]);
GrayColor=abs(Wx)+abs(Wy);
if(GrayColor>255) GrayColor=255;
GrayValue[i][j]=GrayColor;
}
CopyGVToConvo();
Grayflag=false;
ConvertTo24Bits(convo);
TransBack(convo);
Display();
ConvertTo8Bits(convo);
::SetCursor(mHArrow);
}
void CImageCodesDoc::ProcessMaxl()//对原始图用最大类间方差求取阈值
{
erflag=TRUE;
if(Grayflag==false) Gray();
unsigned int i,j,n[256],GrayColor,t,T,temp,N;
double p[256],w1,w2,u1,u2,d1,d2,dt,dw,at;
double Db,MaxDb;
for(i=0;i<256;i++)
n[i]=0;
t=T=0;
Db=MaxDb=dt=dw=at=0.0;
temp=0;
for(i=1;i<r0-1;i++)
for(j=1;j<c0-1;j++)
{
temp=GrayValue[i][j];
n[temp]++;
}
//统计n[i]
for(i=0;i<256;i++)
N=N+n[i];
//统计N
for(i=0;i<256;i++)
p[i]=(double)(n[i])/(double)(N);
//统计p[i]
for(t=0;t<256;t++)
{
w1=0.0;
for(i=0;i<=t;i++)
w1=w1+p[i];
w2=0.0;
for(i=t+1;i<256;i++)
w2=w2+p[i];
u1=0.0;
for(i=0;i<=t;i++)
u1=u1+i*p[i];
u2=0.0;
for(i=t+1;i<256;i++)
u2=u2+i*p[i];
if(w1==0) w1=0.00001;//防止除零
if(w2==0) w2=0.00001;//防止除零
u1=u1/w1;
u2=u2/w2;
d1=0.0;
for(i=0;i<=t;i++)
d1=d1+(i-u1)*(i-u1)*p[i];
d2=0.0;
for(i=t+1;i<256;i++)
d2=d2+(i-u2)*(i-u2)*p[i];
d1/=w1;
d2/=w2;
dw=w1*d1*d1+w2*d2*d2;
Db=w1*w2*(u1-u2)*(u1-u2);
dt=Db+dw;
at=Db/dt;
//计算类间方差Db
if(at>MaxDb)
{
MaxDb=at;
T=t;
}
}
//求出阈值T
for(i=1;i<r0-1;i++)
for(j=1;j<c0-1;j++)
{
if(GrayValue[i][j]<T)
GrayColor=0;
else
GrayColor=255;
convo[i][j]=GrayColor;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -