www.pudn.com > vcpinhuachuli.rar > ZaoShengXiaoChuDib.cpp
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "ZaoShengXiaoChuDib.h"
#include "MainFrm.h"
#include "DSplitView.h"
ZaoShengXiaoChuDib::ZaoShengXiaoChuDib()
{
}
ZaoShengXiaoChuDib::~ZaoShengXiaoChuDib()
{
}
/***************************************************************/
/*函数名称:GuDing() */
/*函数类型:void */
/*参数:int Yuzhi,设定的阈值 */
/*功能:对图像使用固定阈值法进行二值化。 */
/***************************************************************/
void ZaoShengXiaoChuDib::GuDing(int YuZhi)
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData (); //取得原图的数据区指针
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
wide=this->GetWidth ();
height=this->GetHeight ();
for(int j=0;jYuZhi) //灰度值大于给定阈值,置为255
*p_data=255;
else
*p_data=0; //不大于置为0
p_data++;
}
}
}
else //24位彩色
{
wide=this->GetWidth();
height=this->GetHeight ();
for(int j=0;jYuZhi) //若像素值不为0
*p_data=255; //将其置为255
else
*p_data=0; //不大于置为0
p_data++;
}
}
}
}
/***************************************************************/
/*函数名称:HeiBaiFanZhuan() */
/*函数类型:void */
/*功能:对二值图像的黑白点噪声消除。 */
/***************************************************************/
void ZaoShengXiaoChuDib::HeiBaiFanZhuan()
{
int averg,averg2,averg3;
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();//取得原图的数据区指针
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
wide=this->GetWidth (); //取得原图的数据区宽
height=this->GetHeight (); //取得原图的数据区高
GuDing(100); //进行二值化
BYTE* p_temp=new BYTE[wide*height];// 申请并分配中间缓存
memcpy(p_temp,m_pData,wide*height);// 复制图象数据到中间缓存
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j=1;j127.5)
p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);
delete p_temp;
}
else //24位彩色
{
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight (); //取得原图的数据区高
GuDing(100); //进行二值化
BYTE* p_temp=new BYTE[wide*height*3];// 申请并分配中间缓存
memcpy(p_temp,m_pData,wide*height*3);// 复制图象数据到中间缓存
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j=1;j127.5)
p_temp[j*wide*3+i*3]=averg;
if(abs(averg2-p_temp[j*wide*3+i*3+1])>127.5)
p_temp[j*wide*3+i*3+1]=averg2;
if(abs(averg3-p_temp[j*wide*3+i*3+2])>127.5)
p_temp[j*wide*3+i*3+2]=averg3;
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函数名称:black(int connec) */
/*函数类型:void */
/*参数:int connec,设定的连通选择 */
/*功能:对二值图像进行消除孤立黑像素点。 */
/***************************************************************/
void ZaoShengXiaoChuDib::black(int connec)
{
// 指向DIB象素指针
BYTE *p_data;
p_data=this->GetData(); //取得原图的数据区指针
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
int wide=this->GetWidth(); //取得原图的数据区宽
int height=this->GetHeight(); //取得原图的数据区高
//二值化
GuDing(100);
// 申请并分配中间缓存
BYTE* p_temp=new BYTE[wide*height];
// 复制图象数据到中间缓存
memcpy(p_temp,p_data,wide*height);
// 4连接的情况下,消去上下左右都为255(白点)的孤立黑点
if (connec==4)
{
for (int j=1;jGetWidth(); //取得原图的数据区宽
int height=this->GetHeight(); //取得原图的数据区高
//二值化
GuDing(100);
// 申请并分配中间缓存
BYTE* p_temp=new BYTE[wide*height*3];
// 复制图象数据到中间缓存
memcpy(p_temp,p_data,wide*height*3);
// 4连接的情况下,消去上下左右都为255(白点)的孤立黑点
if (connec==4)
{
for (int j=1;jGetData ();//取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽
height=this->GetHeight (); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
BYTE* p_temp=new BYTE[wide*height];
int size=wide*height;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j=1;jGetData ();//取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽
height=this->GetHeight (); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
BYTE* p_temp=new BYTE[wide*height];
int size=wide*height;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j=1;jT)
p_temp[j*wide+i]=averg;
}
}
memcpy(p_data,p_temp,wide*height);
delete p_temp;
}
else //24位彩色
{
BYTE* p_temp=new BYTE[wide*height*3];
int size=wide*height*3;
memset(p_temp,255,size);
//用3*3屏蔽窗口的8近邻均值进行滤波
for(int j=1;jT)
p_temp[j*wide*3+i*3]=averg;
if(abs(p_temp[j*wide*3+i*3+1]-averg2)>T)
p_temp[j*wide*3+i*3+1]=averg2;
if(abs(p_temp[j*wide*3+i*3+2]-averg3)>T)
p_temp[j*wide*3+i*3*2]=averg3;
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函数名称:nn(int n) */
/*函数类型:void */
/*参数:int n,设定的屏蔽窗口参数(奇数) */
/*功能:对图像进行n*n均值滤波处理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::nn(int n)
{
DWORD size;
size=GetSize();
BYTE *p_data;
int xx,yy,n2,sum,sum2,sum3;
int wide,height; //原图长、宽
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
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)
n2=(n-1)/2;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
//用N*N屏蔽窗口平均化
for(int j=n2;j=3&&n%2==1)
n2=(n-1)/2;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
BYTE* p_temp=new BYTE [wide*height*3];
memset(p_temp,255,wide*height*3);
//用N*N屏蔽窗口平均化
for(int j=n2;j=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(); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
//n*n中值滤波
for(int j=n2;j=3&&n%2==1)
n2=(n-1)/2;
nn=n+n-1;
chuo=(nn-1)/2;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
//十字型中值滤波
for(int j=n2;j=3&&n%2==1)
n2=(n-1)/2;
nn=n*n;
p_data=this->GetData();//取得原图的数据区指针
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
//n*n最大值频率滤波
for(int j=n2;jbiBitCount<9) //灰度图像
{
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
p_data=this->GetData();//取得原图的数据区指针
memcpy(p_temp,p_data,size);
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
//产生随机噪声
for(int j=0;jGetData();//取得原图的数据区指针
memcpy(p_temp,p_data,size);
wide=this->GetWidth()*3; //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
//产生随机噪声
for(int j=0;jGetData();//取得原图的数据区指针
memcpy(p_temp,p_data,size);
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
wide=this->GetWidth(); //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
for(int j=0;j31500)
p_temp[j*wide+i]=0;
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
else //24位彩色
{
size=GetSize();
BYTE* p_temp=new BYTE [size];
p_data=this->GetData();//取得原图的数据区指针
memcpy(p_temp,p_data,size);
wide=this->GetWidth()*3; //取得原图的数据区宽
height=this->GetHeight(); //取得原图的数据区高
for(int j=0;j31500)
p_temp[j*wide+i]=0;
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
}
/***************************************************************/
/*函数名称:jubupingjun() */
/*函数类型:void */
/*功能:对图像进行局部平均化处理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::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(); //取得原图的数据区高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度图像
{
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;
}
else //24位彩色
{
p_temp=new BYTE[wide*height*3];
memset(p_temp,255,wide*height*3);
for(int k=0;k<3;k++)
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*3+(i-1)*3+k+k];
ji[1]=p_data[(j-1)*wide*3+i*3+k];
ji[2]=p_data[(j-1)*wide*3+(i+1)*3+k];
ji[3]=p_data[j*wide*3+(i-1)*3+k];
ji[4]=p_data[j*wide*3+i*3+k];
ji[5]=p_data[j*wide*3+(i+1)*3+k];
ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k];
ji[7]=p_data[(j+1)*wide*3+i*3+k];
ji[8]=p_data[(j+1)*wide*3+(i+1)*3+k];
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*3+(i-1)*3+k];
ji[1]=p_data[(j-2)*wide*3+i*3+k];
ji[2]=p_data[(j-2)*wide*3+(i+1)*3+k];
ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k];
ji[4]=p_data[(j-1)*wide*3+i*3+k];
ji[5]=p_data[(j-1)*wide*3+(i+1)*3+k];
ji[6]=p_data[j*wide*3+i*3+k];
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*3+(i-2)*3+k];
ji[1]=p_data[(j-1)*wide*3+(i-1)*3+k];
ji[2]=p_data[j*wide*3+(i-2)*3+k];
ji[3]=p_data[j*wide*3+(i-1)*3+k];
ji[4]=p_data[j*wide*3+i*3+k];
ji[5]=p_data[(j+1)*wide*3+(i-2)*3+k];
ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k];
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*3+i*3+k];
ji[1]=p_data[(j+1)*wide*3+(i-1)*3+k];
ji[2]=p_data[(j+1)*wide*3+i*3+k];
ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k];
ji[4]=p_data[(j+2)*wide*3+(i-1)*3+k];
ji[5]=p_data[(j+2)*wide*3+i*3+k];
ji[6]=p_data[(j+2)*wide*3+(i+1)*3+k];
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*3+(i+1)*3+k];
ji[1]=p_data[(j-1)*wide*3+(i+2)*3+k];
ji[2]=p_data[j*wide*3+i*3+k];
ji[3]=p_data[j*wide*3+(i+1)*3+k];
ji[4]=p_data[j*wide*3+(i+2)*3+k];
ji[5]=p_data[(j+1)*wide*3+(i+1)*3+k];
ji[6]=p_data[(j+1)*wide*3+(i+2)*3+k];
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*3+(i+1)*3+k];
ji[1]=p_data[(j-2)*wide*3+(i+2)*3+k];
ji[2]=p_data[(j-1)*wide*3+i*3+k];
ji[3]=p_data[(j-1)*wide*3+(i+1)*3+k];
ji[4]=p_data[(j-1)*wide*3+(i+2)*3+k];
ji[5]=p_data[j*wide*3+i*3+k];
ji[6]=p_data[j*wide*3+(i+1)*3+k];
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*3+(i-2)*3+k];
ji[1]=p_data[(j-2)*wide*3+(i-1)*3+k];
ji[2]=p_data[(j-1)*wide*3+(i-2)*3+k];
ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k];
ji[4]=p_data[(j-1)*wide*3+i*3+k];
ji[5]=p_data[j*wide*3+(i-1)*3+k];
ji[6]=p_data[j*wide*3+i*3+k];
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*3+(i-1)*3+k];
ji[1]=p_data[j*wide*3+i*3+k];
ji[2]=p_data[(j+1)*wide*3+(i-2)*3+k];
ji[3]=p_data[(j+1)*wide*3+(i-1)*3+k];
ji[4]=p_data[(j+1)*wide*3+i*3+k];
ji[5]=p_data[(j+2)*wide*3+(i-2)*3+k];
ji[6]=p_data[(j+2)*wide*3+(i-1)*3+k];
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*3+i*3+k];
ji[1]=p_data[j*wide*3+(i+1)*3+k];
ji[2]=p_data[(j+1)*wide*3+i*3+k];
ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k];
ji[4]=p_data[(j+1)*wide*3+(i+2)*3+k];
ji[5]=p_data[(j+2)*wide*3+(i+1)*3+k];
ji[6]=p_data[(j+2)*wide*3+(i+2)*3+k];
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*3+i*3+k]=(int)(mean[nmin]+0.5);
}
}
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
}