⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zaoshengxiaochudib.cpp

📁 VC++图像处理程程序设计配套光盘的第五章平滑处理的程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -