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

📄 makecolordib.cpp

📁 VC++图像处理程序设计课本和代码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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++)	// 每行
	{
		for(int i=0;i<DibWidth-1;i++)	// 每列
		{
			 int pby_pt=0;
			 //对像素执行算法
			 pby_pt=(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
				   *(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-1)*DibWidth+i+3))
				   +(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i))
				   *(*(p_data+(height-j-1)*DibWidth+i)-*(p_data+(height-j-2)*DibWidth+i));
			*(p_temp+(height-j-1)*DibWidth+i)=2*int(sqrt(pby_pt));
			//判断合法性
			if(*(p_temp+(height-j-1)*DibWidth+i)<0)
				 *(p_temp+(height-j-1)*DibWidth+i)=0;
			if(*(p_temp+(height-j-1)*DibWidth+i)>255)
				 *(p_temp+(height-j-1)*DibWidth+i)=255;
		}
	}
    memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;   //删除暂时分配内存
}

/***************************************************************/
/*函数名称:Smoothness()                                       */
/*函数类型:void                                               */
/*功能:使图像平滑处理。                                       */
/***************************************************************/
void MakeColorDib::Smoothness()   //平滑处理
{
	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] = 1; 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++)	// 每列
		{
	        double 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));
			*(p_temp+(height-j-2)*DibWidth+i+3)=abs(int(pby_pt/9));//取总和的的平均值
		}
	}
   	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
   	delete []p_temp;//删除暂时分配内存
}

/***************************************************************/
/*函数名称:Embossment()                                       */
/*函数类型:void                                               */
/*功能:产生图像浮雕处理效果。                                 */
/***************************************************************/
void MakeColorDib::Embossment()   //浮雕处理
{
	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;j++)	// 每行
	{
		for(int i=0;i<DibWidth-4;i++)	// 每列
		{
			 int pby_pt=0;
			 //对像素得每个分量执行算法
			 pby_pt=*(p_data+(height-j-1)*DibWidth+i)
				   -*(p_data+(height-j-1)*DibWidth+i+3)+128;
			 *(p_temp+(height-j-1)*DibWidth+i+3)=pby_pt;
			//检验合法性
			if(*(p_temp+(height-j-1)*DibWidth+i+3)<0)
				*(p_temp+(height-j-1)*DibWidth+i+3)=0;
			else if(*(p_temp+(height-j-1)*DibWidth+i+3)>255)
				*(p_temp+(height-j-1)*DibWidth+i+3)=255;
		}
	}
    memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;   //删除暂时分配内存
}

/***************************************************************/
/*函数名称:Spread()                                           */
/*函数类型:void                                               */
/*功能:图像扩散处理。                                         */
/***************************************************************/
void MakeColorDib::Spread()   //扩散处理
{ 
	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++)	// 每行
	{
		for(int i=0;i<DibWidth-14;i++)	// 每列
		{
			 int m=0,n=0;
			 m=rand()%5; //取得行随机数
			 n=rand()%5; //取得列随机数
			 int pby_pt=0;	
			 pby_pt=*(p_data+(height-j-1-m)*DibWidth+i+3*n);//得到对应随机像素值
			 *(p_temp+(height-j-3)*DibWidth+i+6)=pby_pt;
		}
	}
    memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;   //删除暂时分配内存
}

/***************************************************************/
/*函数名称:Sharp()                                            */
/*函数类型:void                                               */
/*功能:图像锐化处理。                                         */
/***************************************************************/
void MakeColorDib::Sharp()   //图像锐化
{
 	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-1;j++)	// 每行
	{
		for(int i=0;i<DibWidth-5;i++)	// 每列
		{
	        int pby_pt=0;	
			pby_pt= *(p_data+(height-j-2)*DibWidth+i+3)
			       -*(p_data+(height-j-1)*DibWidth+i);
			*(p_temp+(height-j-2)*DibWidth+i+3)=*(p_data+(height-j-2)*DibWidth+i+3)
				                                 +abs(int(pby_pt/4));
			if(*(p_temp+(height-j-2)*DibWidth+i+3)>255)
			   *(p_temp+(height-j-2)*DibWidth+i+3)=255;
		}
	}
    memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:HighLVBO(int m_GaoTong)                            */
/*函数类型:void                                               */
/*参数:int m_GaoTong,用户给定的阈值来选择矩阵                */
/*功能:对图像使用阈值法进行高通滤波。                         */
/***************************************************************/
void MakeColorDib::HighLVBO(int m_GaoTong)   //高通滤波
{
	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)矩阵
	if(m_GaoTong==1)
	{   //矩阵1(基本高通)
		h[0][0] =1;   h[0][1] =-2;  h[0][2] =1;
		h[1][0] =-2;  h[1][1] =5;   h[1][2] =-2;
		h[2][0] =1;   h[2][1] =-2;  h[2][2] =1;
	}
	else if(m_GaoTong==2)
	{   //矩阵2(中等高通)
		h[0][0] = 0;   h[0][1] = -1; h[0][2] = 0;
		h[1][0] = -1;  h[1][1] =  5; h[1][2] = -1;
		h[2][0] = 0;   h[2][1] = -1; h[2][2] = 0;
	}
	else
	{   //矩阵3(过量高通)
		h[0][0] = -1;  h[0][1] = -1; h[0][2] = -1;
		h[1][0] = -1;  h[1][1] =  9; 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));
			*(p_temp+(height-j-2)*DibWidth+i+3)=abs(pby_pt);
			if(pby_pt>255) //判断是否越界
				*(p_temp+(height-j-2)*DibWidth+i+3)=255;
		}
	}
   	memcpy(p_data,p_temp,height*DibWidth);  // 复制处理后的图像
    delete []p_temp;  //删除暂时分配内存
}

/***************************************************************/
/*函数名称:LowLVBO()                                          */
/*函数类型:void                                               */
/*功能:实现图像低通滤波(3x3)。                                */
/***************************************************************/
void MakeColorDib::LowLVBO()   //低通滤波(3x3)
{
	BYTE *p_data;     //原图数据区指针
	int wide,height,DibWidth;    //原图长、宽、字节宽
	p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
	DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
    double h[3][3];////定义(3x3)矩阵
	h[0][0] = 0.1;  h[0][1] = 0.1; h[0][2] = 0.1;
	h[1][0] = 0.1;  h[1][1] = 0.2; h[1][2] = 0.1;
	h[2][0] = 0.1;  h[2][1] = 0.1; h[2][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++)	// 每列
		{
			double 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))
				//对应的第0行的值乘以矩阵对应值,再相加
				+h[1][0]*(*(p_data+(height-j-2)*DibWidth+i))

⌨️ 快捷键说明

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