📄 tiduruihuadib.cpp
字号:
void TiDuRuiHuaDib::Leijianzuida(int *tongji)
{
int i,j;
int height,wide;
LPBYTE p_data;
LPBYTE p_temp;
height = this->GetHeight();
wide = this->GetDibWidthBytes();
p_data=this->GetData(); //获得图像数据
p_temp = new BYTE[height*wide];
memcpy(p_temp,p_data,height*wide);
//域值
int Th; //使相对距离最大的域值
int Th0; //域值初始值;
//两类的均值;
int u1,u2;
//相对距离
int s;
int s0; //初始域值所对应的相对距离
//临时变量
int Temp0, Temp1, Temp2, Temp3;
Temp0 = Temp1 = Temp2 = Temp3 = 0;
//初始化Th,Th0
Th=Th0=127;
//计算u1
for (i = 0; i < Th0 + 1; i++)
{
Temp0 += tongji[i] * i;
Temp1 += tongji[i];
}
u1=Temp0/Temp1;
//计算u2
for (i = Th0 + 1; i < 256; i++)
{
Temp2 += tongji[i] * i;
Temp3 += tongji[i];
}
u2=Temp2/Temp3;
//计算相对距离
s0=(u2-Th0)*(Th0-u1)/((u2-u1)*(u2-u1));
for (Th0=1;Th0<255;Th0++)
{
//计算u1
Temp0 = Temp1 = Temp2 = Temp3 = 0;
for (i = 0; i < Th0 + 1; i++)
{
Temp0 += tongji[i] * i;
Temp1 += tongji[i];
}
if (Temp1==0)
{
Temp1=1;
}
u1=Temp0/Temp1;
//计算u2
for (i = Th0 + 1; i < 256; i++)
{
Temp2 += tongji[i] * i;
Temp3 += tongji[i];
}
if (Temp3==0)
{
Temp3=1;
}
u2=Temp2/Temp3;
//计算相对距离
s=(u2-Th0)*(Th0-u1)/((u2-u1)*(u2-u1));
//与s0比较大小
if (s>s0)
{
s0=s;
Th=Th0;
}
}
//根据域值Th对图像二值化
for (j=0;j<height;j++)
{
for (i=0;i<wide;i++)
{
if(*(p_temp+j*wide+i)<Th)
*(p_temp+j*wide+i)=0;
else
*(p_temp+j*wide+i)=255;
}
}
memcpy(p_data,p_temp,height*wide);
delete p_temp;
}
void TiDuRuiHuaDib::Yuzhifenge(int Yuzhi)
{
// 指向源图像的指针
LPBYTE p_data;
LPBYTE lpSrc;
// 指向缓存图像的指针
LPBYTE lpDst;
// 指向缓存DIB图像的指针
LPBYTE temp;
//循环变量
long i;
long j;
//图像的高和宽
long wide;
long height;
p_data=GetData();
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
wide=GetWidth();
else //24位彩色
wide=GetDibWidthBytes();
height=GetHeight();
temp=new BYTE[wide*height];
memset(temp,255,wide*height);
for (j=0;j<height;j++)
{
for(i=0;i<wide;i++)
{
lpSrc=p_data+wide*j+i;
lpDst=temp+wide*j+i;
if(abs(*lpSrc-Yuzhi)<30)
//*lpDst=Yuzhi;
*lpDst=0;
}
}
memcpy(p_data,temp,wide*height);
delete temp;
}
void TiDuRuiHuaDib::nnzhong(int n)
{
DWORD size;
size=GetSize(); //获得图像打小
BYTE* p_temp=new BYTE [size]; //开辟内存
memset(p_temp,255,size);
int yy,xx,n2,nn,chuo,chg,m,medi,madom,mado[1000];
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
if(n<3||n%2!=1)//检查取值是否为3.5.7等的奇数
AfxMessageBox("请输入一个大于等于3的奇数");
if(n>=3&&n%2==1)
n2=(n-1)/2;
nn=n*n;
chuo=(nn-1)/2;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
//n*n中值滤波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把n*n屏蔽窗口部分的所有像素值放入mado[m]
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
mado[m]=p_data[yy*wide+xx];
m++;
}
//把mado[m]中的值按下降顺序用冒泡法排序
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(mado[m]<mado[m+1])
{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
}
}while(chg==1);
//求中值medi
medi=mado[chuo];
//把中值代入显示图像中
p_temp[j*wide+i]=medi;
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
void TiDuRuiHuaDib::nnjunzhi(int n)
{
DWORD size;
size=GetSize();
BYTE *p_data;
int xx,yy,n2,sum;
int wide,height; //原图长、宽
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
if(n<3||n%2!=1)//确认n为奇数
AfxMessageBox("请输入一个大于等于3的奇数");
if(n>=3&&n%2==1) //如果n是大于等于3的奇数
n2=(n-1)/2;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
//用N*N屏蔽窗口平均化
for(int j=n2;j<height-n2;j++)
{
for(int i=n2;i<wide-n2;i++)
{ //求N*N屏蔽窗口内的总和sum
sum=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
sum+=p_data[yy*wide+xx];
//把n*n屏蔽窗口内的平均值四舍五入后作为显示图像像素值
p_temp[j*wide+i]=(int)((float)sum/(n*n)+0.5);
}
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
void TiDuRuiHuaDib::Jubupingjun()
{
DWORD size;
size=GetSize();
BYTE *p_data;//原图数据区指针
BYTE* p_temp=new BYTE[size]; //缓存图像指针
int wide,height;
int n,ji[9],nmin;
float mean[9],bunsan[9],bmin;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
memset(p_temp,255,size); //初始化缓存区域
for(int j=2;j<=height-3;j++)
for(int i=2;i<=wide-3;i++)
{
//求9种近邻区域的均值及其方差
//第1近邻区域
ji[0]=p_data[(j-1)*wide+(i-1)];
ji[1]=p_data[(j-1)*wide+i];
ji[2]=p_data[(j-1)*wide+(i+1)];
ji[3]=p_data[j*wide+(i-1)];
ji[4]=p_data[j*wide+i];
ji[5]=p_data[j*wide+(i+1)];
ji[6]=p_data[(j+1)*wide+(i-1)];
ji[7]=p_data[(j+1)*wide+i];
ji[8]=p_data[(j+1)*wide+(i+1)];
mean[0]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6]+ji[7]+ji[8])/9;
bunsan[0]=0;
for(n=0;n<=8;n++)
bunsan[0]+=ji[n]*ji[n]-mean[0]*mean[0];
//第2近邻区域
ji[0]=p_data[(j-2)*wide+(i-1)];
ji[1]=p_data[(j-2)*wide+i];
ji[2]=p_data[(j-2)*wide+(i+1)];
ji[3]=p_data[(j-1)*wide+(i-1)];
ji[4]=p_data[(j-1)*wide+i];
ji[5]=p_data[(j-1)*wide+(i+1)];
ji[6]=p_data[j*wide+i];
mean[1]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[1]=0;
for(n=0;n<=6;n++)
bunsan[1]+=ji[n]*ji[n]-mean[1]*mean[1];
//第3近邻区域
ji[0]=p_data[(j-1)*wide+(i-2)];
ji[1]=p_data[(j-1)*wide+(i-1)];
ji[2]=p_data[j*wide+(i-2)];
ji[3]=p_data[j*wide+(i-1)];
ji[4]=p_data[j*wide+i];
ji[5]=p_data[(j+1)*wide+(i-2)];
ji[6]=p_data[(j+1)*wide+(i-1)];
mean[2]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[2]=0;
for(n=0;n<=6;n++)
bunsan[2]+=ji[n]*ji[n]-mean[2]*mean[2];
//第4近邻区域
ji[0]=p_data[j*wide+i];
ji[1]=p_data[(j+1)*wide+(i-1)];
ji[2]=p_data[(j+1)*wide+i];
ji[3]=p_data[(j+1)*wide+(i+1)];
ji[4]=p_data[(j+2)*wide+(i-1)];
ji[5]=p_data[(j+2)*wide+i];
ji[6]=p_data[(j+2)*wide+(i+1)];
mean[3]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[3]=0;
for(n=0;n<=6;n++)
bunsan[3]+=ji[n]*ji[n]-mean[3]*mean[3];
//第5近邻区域
ji[0]=p_data[(j-1)*wide+(i+1)];
ji[1]=p_data[(j-1)*wide+(i+2)];
ji[2]=p_data[j*wide+i];
ji[3]=p_data[j*wide+(i+1)];
ji[4]=p_data[j*wide+(i+2)];
ji[5]=p_data[(j+1)*wide+(i+1)];
ji[6]=p_data[(j+1)*wide+(i+2)];
mean[4]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[4]=0;
for(n=0;n<=6;n++)
bunsan[4]+=ji[n]*ji[n]-mean[4]*mean[4];
//第6近邻区域
ji[0]=p_data[(j-2)*wide+(i+1)];
ji[1]=p_data[(j-2)*wide+(i+2)];
ji[2]=p_data[(j-1)*wide+i];
ji[3]=p_data[(j-1)*wide+(i+1)];
ji[4]=p_data[(j-1)*wide+(i+2)];
ji[5]=p_data[j*wide+i];
ji[6]=p_data[j*wide+(i+1)];
mean[5]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[5]=0;
for(n=0;n<=6;n++)
bunsan[5]+=ji[n]*ji[n]-mean[5]*mean[5];
//第7近邻区域
ji[0]=m_pData[(j-2)*wide+(i-2)];
ji[1]=p_data[(j-2)*wide+(i-1)];
ji[2]=p_data[(j-1)*wide+(i-2)];
ji[3]=p_data[(j-1)*wide+(i-1)];
ji[4]=p_data[(j-1)*wide+i];
ji[5]=p_data[j*wide+(i-1)];
ji[6]=p_data[j*wide+i];
mean[6]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[6]=0;
for(n=0;n<=6;n++)
bunsan[6]+=ji[n]*ji[n]-mean[6]*mean[6];
//第8近邻区域
ji[0]=m_pData[j*wide+(i-1)];
ji[1]=p_data[j*wide+i];
ji[2]=p_data[(j+1)*wide+(i-2)];
ji[3]=p_data[(j+1)*wide+(i-1)];
ji[4]=p_data[(j+1)*wide+i];
ji[5]=p_data[(j+2)*wide+(i-2)];
ji[6]=p_data[(j+2)*wide+(i-1)];
mean[7]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[7]=0;
for(n=0;n<=6;n++)
bunsan[7]+=ji[n]*ji[n]-mean[7]*mean[7];
//第9近邻区域
ji[0]=p_data[j*wide+i];
ji[1]=p_data[j*wide+(i+1)];
ji[2]=p_data[(j+1)*wide+i];
ji[3]=p_data[(j+1)*wide+(i+1)];
ji[4]=p_data[(j+1)*wide+(i+2)];
ji[5]=p_data[(j+2)*wide+(i+1)];
ji[6]=p_data[(j+2)*wide+(i+2)];
mean[8]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7;
bunsan[8]=0;
for(n=0;n<=6;n++)
bunsan[8]+=ji[n]*ji[n]-mean[8]*mean[8];
//求方差最小的近邻区域nmin
bmin=bunsan[0];
nmin=0;
for(n=0;n<=8;n++)
{
if(bmin>bunsan[n])
{
bmin=bunsan[n];
nmin=n;
}
//把nmin的值四舍五入后作为显示图像的值
p_temp[j*wide+i]=(int)(mean[nmin]+0.5);
}
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
void TiDuRuiHuaDib::Templat(BYTE *m_pdata, int wide, int height, int tempH, int tempW, int tempMX, int tempMY, float *fpArray, float fCoef)
{
int i,j,k,l; //循环变量
BYTE* temp=new BYTE[wide*height]; //新图像缓冲区
//初始化新图像为原始图像
memcpy( temp,m_pdata,wide*height);
float fResult; //像素值计算结果
for(j=tempMY;j<height-tempH+tempMY+1;j++)
for(i=tempMX;i<wide-tempW+tempMX+1;i++)
{
//计算像素值
fResult=0;
for(k=0;k<tempH;k++)
for(l=0;l<tempW;l++)
fResult=fResult+m_pdata[(j-tempMY+k)*wide+(i-tempMX+l)]*fpArray[k*tempW+l];
//乘上系数
fResult*=fCoef;
//取绝对值
fResult=(float)fabs(fResult);
//判断是否超过255
if(fResult>255)
//若超过255,直接赋值为255
temp[j*wide+i]=255;
else
//未超过255,赋值为计算结果
temp[j*wide+i]=(int)(fResult+0.5);
}
memcpy(m_pdata, temp,wide*height); //复制处理后的图像
delete temp;
}
void TiDuRuiHuaDib::Laplacian()
{
int tempH; //模板高度
int tempW; //模板宽度
float tempC; //模板系数
int tempMY; //模板中心元素Y坐标
int tempMX; //模板中心元素X坐标
float Template[9]; //模板数组
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp1=new BYTE[wide*height]; //新图像缓冲区
//拷贝原图像到缓存图像
memcpy( temp1,p_data,wide*height);
//设置Laplacian模板 参数
tempW=3;
tempH=3;
tempC=1.0;
tempMY=1;
tempMX=1;
Template[0]=-1.0;
Template[1]=-1.0;
Template[2]=-1.0;
Template[3]=-1.0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -