📄 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;j<height;j++)
{
for(int i=0;i<wide;i++)
{
if(*p_data>YuZhi) //灰度值大于给定阈值,置为255
*p_data=255;
else
*p_data=0; //不大于置为0
p_data++;
}
}
}
else //24位彩色
{
wide=this->GetWidth();
height=this->GetHeight ();
for(int j=0;j<height;j++)
{
for(int i=0;i<wide;i++) //所有像素依次循环
{
if(*p_data>YuZhi) //若像素值不为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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周围8近邻均值
averg=(int)((p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8);
if(abs(averg-p_temp[j*wide+i])>127.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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
averg2=0;
averg3=0;
//求周围8近邻均值
averg=(int)((p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide*3+i*3]
+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide*3+(i-1)*3]
+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide*3+(i-1)*3]
+p_data[(j+1)*wide*3+i*3]+p_data[(j+1)*wide*3+(i+1)*3])/8);
averg2=(int)((p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide*3+i*3+1]
+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide*3+(i-1)*3+1]
+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide*3+(i-1)*3+1]
+p_data[(j+1)*wide*3+i*3+1]+p_data[(j+1)*wide*3+(i+1)*3+1])/8);
averg3=(int)((p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide*3+i*3+2]
+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide*3+(i-1)*3+2]
+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide*3+(i-1)*3+2]
+p_data[(j+1)*wide*3+i*3+2]+p_data[(j+1)*wide*3+(i+1)*3+2])/8);
if(abs(averg-p_temp[j*wide*3+i*3])>127.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;j<height-1;j++)
{
for (int i=1;i<wide-1;i++)
{
if (*(p_temp + wide * j + i)==255)
continue;
if((*(p_temp + wide * (j-1) + i)+
*(p_temp + wide * (j+1) + i)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * j + i+1))==255*4)
{
*(p_data + wide * j + i)=255;
}
}
}
delete p_temp;
}
// 8连接的情况下,消去周围都为255(白点)的孤立黑点
if (connec==8)
{
for (int j = 1; j < height-1; j ++)
{
for (int i = 1; i < wide-1; i ++)
{
if (*(p_temp + wide * j + i)==255)
continue;
if((*(p_temp + wide * (j-1) + i)+
*(p_temp + wide * (j+1) + i)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * j + i-1)+
*(p_temp + wide * (j-1) + i-1)+
*(p_temp + wide * (j+1) + i+1)+
*(p_temp + wide * (j-1) + i+1)+
*(p_temp + wide * (j+1) + i-1))==255*8)
{
*(p_data + wide * j + i)=255;
}
}
}
delete p_temp;
}
}
/* else //24位彩色
{
int wide= this->GetWidth(); //取得原图的数据区宽
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;j<height-1;j++)
{
for (int i=1;i<wide-1;i++)
{
if ((*(p_temp + wide * j*3 + i*3)==255)&&
(*(p_temp + wide * j*3 + i*3+1)==255) &&
(*(p_temp + wide * j*3 + i*3+2)==255))
continue;
if(((*(p_temp + wide * (j-1)*3 + i*3)+
*(p_temp + wide * (j+1)*3 + i*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * j*3 + (i+1)*3))==255*4)&&
((*(p_temp + wide * (j-1)*3 + i*3+1)+
*(p_temp + wide * (j+1)*3 + i*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * j*3 + (i+1)*3+1))==255*4)&&
((*(p_temp + wide * (j-1)*3 + i*3+2)+
*(p_temp + wide * (j+1)*3 + i*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * j*3 + (i+1)*3+2))==255*4))
{
*(p_data + wide * j*3 + i*3)=255;
*(p_data + wide * j*3 + i*3+1)=255;
*(p_data + wide * j*3 + i*3+2)=255;
}
}
}
delete p_temp;
}
// 8连接的情况下,消去周围都为255(白点)的孤立黑点
if (connec==8)
{
for (int j = 1; j < height-1; j ++)
{
for (int i = 1; i < wide-1; i ++)
{
if ((*(p_temp + wide * j*3 + i*3)==255)&&
(*(p_temp + wide * j*3 + i*3+1)==255)&&
(*(p_temp + wide * j*3 + i*3+2)==255))
continue;
if(((*(p_temp + wide * (j-1)*3 + i*3)+
*(p_temp + wide * (j+1)*3 + i*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * j*3 + (i-1)*3)+
*(p_temp + wide * (j-1)*3 + (i-1)*3)+
*(p_temp + wide * (j+1)*3 + (i+1)*3)+
*(p_temp + wide * (j-1)*3 + (i+1)*3)+
*(p_temp + wide * (j+1)*3 + (i-1)*3))==255*8)&&
((*(p_temp + wide * (j-1)*3 + i*3+1)+
*(p_temp + wide * (j+1)*3 + i*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * j*3 + (i-1)*3+1)+
*(p_temp + wide * (j-1)*3 + (i-1)*3+1)+
*(p_temp + wide * (j+1)*3 + (i+1)*3+1)+
*(p_temp + wide * (j-1)*3 + (i+1)*31+1)+
*(p_temp + wide * (j+1)*3 + (i-1)*3+1))==255*8)&&
((*(p_temp + wide * (j-1)*3 + i*3+2)+
*(p_temp + wide * (j+1)*3 + i*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * j*3 + (i-1)*3+2)+
*(p_temp + wide * (j-1)*3 + (i-1)*3+2)+
*(p_temp + wide * (j+1)*3 + (i+1)*3+2)+
*(p_temp + wide * (j-1)*3 + (i+1)*3+2)+
*(p_temp + wide * (j+1)*3 + (i-1)*3+2))==255*8))
{
*(p_data + wide * j*3 + i*3)=255;
*(p_data + wide * j*3 + i*3+1)=255;
*(p_data + wide * j*3 + i*3+2)=255;
}
}
}
delete p_temp;
}
}*/
}
/***************************************************************/
/*函数名称:threethree() */
/*函数类型:void */
/*功能:对图像进行3*3均值滤波处理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::threethree()
{
float averg,averg2,averg3;
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();//取得原图的数据区指针
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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周围8近邻均值
averg=(int)(p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8;
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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
averg2=0;
averg3=0;
//求周围8近邻均值
averg=(int)(p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide*3+i*3]
+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide*3+(i-1)*3]
+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide*3+(i-1)*3]
+p_data[(j+1)*wide+i*3]+p_data[(j+1)*wide+(i+1)*3])/8;
averg2=(int)(p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide*3+i*3+1]
+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide*3+(i-1)*3+1]
+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide*3+(i-1)*3+1]
+p_data[(j+1)*wide+i*3+1]+p_data[(j+1)*wide+(i+1)*3+1])/8;
averg3=(int)(p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide*3+i*3+2]
+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide*3+(i-1)*3+2]
+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide*3+(i-1)*3+2]
+p_data[(j+1)*wide+i*3+2]+p_data[(j+1)*wide+(i+1)*3+2])/8;
p_temp[j*wide*3+i*3]=(int)averg;
p_temp[j*wide*3+i*3+1]=(int)averg2;
p_temp[j*wide*3+i*3+2]=(int)averg3;
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函数名称:Chaoxian(int T) */
/*函数类型:void */
/*参数:int T,设定的阈值 */
/*功能:超限邻域平均法。 */
/***************************************************************/
void ZaoShengXiaoChuDib::Chaoxian(int T)
{
int averg,averg2,averg3;
BYTE *p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();//取得原图的数据区指针
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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
//求周围8近邻均值
averg=(int)(p_data[(j-1)*wide+(i-1)]+p_data[(j-1)*wide+i]
+p_data[(j-1)*wide+(i+1)]+p_data[j*wide+(i-1)]
+p_data[j*wide+i+1]+p_data[(j+1)*wide+(i-1)]
+p_data[(j+1)*wide+i]+p_data[(j+1)*wide+i+1])/8;
if(abs(p_temp[j*wide+i]-averg)>T)
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;j<height-1;j++)
{
for(int i=1;i<wide-1;i++)
{
averg=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -