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

📄 makecolordib.cpp

📁 VC++图像处理程序设计课本和代码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
				+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
				//对应的第0行的值乘以矩阵对应值,再相加
				+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
				+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
				+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
			*(p_temp+(height-j-2)*DibWidth+i+3)=abs(int(pby_pt));
		}
	}
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
	delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:LowLVBObig()                                       */
/*函数类型:void                                               */
/*功能:实现图像低通滤波(5x5)。                                */
/***************************************************************/
void MakeColorDib::LowLVBObig()   //低通滤波(5x5)
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	int h[5][5];//定义(5x5)矩阵
	h[0][0] = 1;  h[0][1] = 1; h[0][2] = 1; h[0][3] = 1; h[0][4] = 1;
	h[1][0] = 1;  h[1][1] = 2; h[1][2] = 2; h[1][3] = 2; h[1][4] = 1;
	h[2][0] = 1;  h[2][1] = 2; h[2][2] = 3; h[2][3] = 2; h[2][4] = 1;
	h[3][0] = 1;  h[3][1] = 2; h[3][2] = 2; h[3][3] = 2; h[3][4] = 1;
	h[4][0] = 1;  h[4][1] = 1; h[4][2] = 1; h[4][3] = 1; h[4][4] = 1;
	BYTE *p_temp=new BYTE[height*DibWidth];	// 暂时分配内存,以保存新图像
	for(int j=0;j<height-4;j++)	// 每行
	{
		for(int i=0;i<DibWidth-14;i++)	// 每列
		{
	        int pby_pt=0;
	        //对应的第0行的值乘以矩阵对应值,再相加
			pby_pt=h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
				  +h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
				  +h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
			      +h[0][3]*(*(p_data+(height-j-1)*DibWidth+i+9))
				  +h[0][4]*(*(p_data+(height-j-1)*DibWidth+i+12))
                  //对应的第1行的值乘以矩阵对应值,再相加
			      +h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
			      +h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
				  +h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
				  +h[1][3]*(*(p_data+(height-j-2)*DibWidth+i+9))
				  +h[1][4]*(*(p_data+(height-j-2)*DibWidth+i+12))
                  //对应的第2行的值乘以矩阵对应值,再相加
			      +h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
				  +h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
				  +h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6))
				  +h[2][3]*(*(p_data+(height-j-3)*DibWidth+i+9))
				  +h[2][4]*(*(p_data+(height-j-3)*DibWidth+i+12))
                  //对应的第3行的值乘以矩阵对应值,再相加
			      +h[3][0]*(*(p_data+(height-j-4)*DibWidth+i))
			      +h[3][1]*(*(p_data+(height-j-4)*DibWidth+i+3))
				  +h[3][2]*(*(p_data+(height-j-4)*DibWidth+i+6))
				  +h[3][3]*(*(p_data+(height-j-4)*DibWidth+i+9))
				  +h[3][4]*(*(p_data+(height-j-4)*DibWidth+i+12))
                  //对应的第4行的值乘以矩阵对应值,再相加
			      +h[4][0]*(*(p_data+(height-j-5)*DibWidth+i))
				  +h[4][1]*(*(p_data+(height-j-5)*DibWidth+i+3))
				  +h[4][2]*(*(p_data+(height-j-5)*DibWidth+i+6))
				  +h[4][3]*(*(p_data+(height-j-5)*DibWidth+i+9))
				  +h[4][4]*(*(p_data+(height-j-5)*DibWidth+i+12));
                  //为了计算方便我们把除以35(矩阵权和)放在求总和之后
			*(p_temp+(height-j-3)*DibWidth+i+6)=abs(int(pby_pt/35));
		}
	}
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
	delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:ShuiPingGROW()                                     */
/*函数类型:void                                               */
/*功能:使图像水平增强。                                       */
/***************************************************************/
void MakeColorDib::ShuiPingGROW()   //水平增强
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	int h[3][1];//定义(3x1)矩阵
	h[0][0] = -1;  
	h[1][0] = 2; 
	h[2][0] = -1;
	BYTE *p_temp=new BYTE[height*DibWidth];	// 暂时分配内存,以保存新图像
	for(int j=0;j<height-2;j++)	// 每行
	{
		for(int i=0;i<DibWidth-8;i++)	// 每列
		{
			int pby_pt=0;
			//对应的3行的值乘分别以矩阵对应值,再相加
			pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
				+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
				+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i));
			if(pby_pt>20)
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
			else
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
		}
	}
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:ChuiZhiGROW()                                      */
/*函数类型:void                                               */
/*功能:使图像垂直增强。                                       */
/***************************************************************/
void MakeColorDib::ChuiZhiGROW()   //垂直增强
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	int h[1][3];//定义(1x3)矩阵
	h[0][0] = -1; 
	h[0][1] = 2;
	h[0][2] = -1;
	BYTE *p_temp=new BYTE[height*DibWidth];	// 暂时分配内存,以保存新图像
	for(int j=0;j<height-2;j++)	// 每行
	{
		for(int i=0;i<DibWidth-8;i++)	// 每列
		{
			int pby_pt=0;
			//对应的第0行的值乘以矩阵对应值,再相加
			pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
				+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
				+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6));
			if(pby_pt>20)
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
			else
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
		}
	}
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
	delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:ShuangXiangGROW()                                  */
/*函数类型:void                                               */
/*功能:使图像双向增强。                                       */
/***************************************************************/
void MakeColorDib::ShuangXiangGROW()    //双向增强
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	int h[3][3];//定义(3x3)矩阵
	h[0][0] = -1;  h[0][1] = -1; h[0][2] = -1;
	h[1][0] = -1;  h[1][1] =  8; h[1][2] = -1;
	h[2][0] = -1;  h[2][1] = -1; h[2][2] = -1; 
	BYTE *p_temp=new BYTE[height*DibWidth];	// 暂时分配内存,以保存新图像
	for(int j=0;j<height-2;j++)	// 每行
	{	
		for(int i=0;i<DibWidth-8;i++)	// 每列
		{
			int pby_pt=0;
			//对应的第0行的值乘以矩阵对应值,再相加
			pby_pt= h[0][0]*(*(p_data+(height-j-1)*DibWidth+i))
				+h[0][1]*(*(p_data+(height-j-1)*DibWidth+i+3))
				+h[0][2]*(*(p_data+(height-j-1)*DibWidth+i+6))
				//对应的第1行的值乘以矩阵对应值,再相加
				+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))
				+h[1][1]*(*(p_data+(height-j-2)*DibWidth+i+3))
				+h[1][2]*(*(p_data+(height-j-2)*DibWidth+i+6))
				//对应的第2行的值乘以矩阵对应值,再相加
				+h[2][0]*(*(p_data+(height-j-3)*DibWidth+i))
				+h[2][1]*(*(p_data+(height-j-3)*DibWidth+i+3))
				+h[2][2]*(*(p_data+(height-j-3)*DibWidth+i+6));
			if(pby_pt>20)
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt)+100;
			else
				*(p_temp+(height-j-2)*DibWidth+i)=abs(pby_pt);
		}
	}	
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
	delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:Mosaic()                                           */
/*函数类型:void                                               */
/*功能:使图像产生马赛克效果。                                 */
/***************************************************************/
void MakeColorDib::Mosaic()    //马赛克
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
	BYTE *p_temp=new BYTE[height*DibWidth];	// 暂时分配内存,以保存新图像
	for(int j=0;j<height-4;j+=5)	// 每行
	{	
	    for(int i=0;i<DibWidth-14;i+=15)	// 每列
		{   //对应周围(5x5)矩阵蓝色值求和平均
			int pby_pt=0;
			for(int m=0;m<5;m++)
				for(int n=0;n<15;n+=3)
				{   
					pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n);
				}
				
			for(m=0;m<5;m++)
				for(int n=0;n<14;n+=3)
				{
					*(p_temp+(height-j-1-m)*DibWidth+i+n)=int(pby_pt/25);
				}	
            //对应周围(5x5)矩阵绿色值求和平均
			pby_pt=0;
			for(m=0;m<5;m++)
				for(int n=0;n<15;n+=3)
				{
					pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+1);
				}
			for(m=0;m<5;m++)
				for(int n=0;n<14;n+=3)
				{
					*(p_temp+(height-j-1-m)*DibWidth+i+n+1)=int(pby_pt/25);
				}
            //对应周围(5x5)矩阵红色值求和平均
			pby_pt=0;
			for(m=0;m<5;m++)
				for(int n=0;n<15;n+=3)
				{
					pby_pt+=*(p_data+(height-j-1-m)*DibWidth+i+n+2);
				}
			for(m=0;m<5;m++)
				for(int n=0;n<14;n+=3)
				{
					*(p_temp+(height-j-1-m)*DibWidth+i+n+2)=int(pby_pt/25);
				}
		}			
	}
	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
	delete []p_temp;  //删除暂时分配内存
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -