图像处理常用算法(C/C++)

转原文:http://gaojinpeng1129.blog.163.com/blog/static/141659068201321194552695/

/*函数名称:MakegGray()                                        */
/*函数类型:void                                               */
/*功能:真彩色转化成256色灰度图像。                            */
/***************************************************************/
void MakeColorDib::MakegGray()    //灰度变化
{
 BYTE *p_data;     //原图数据区指针
 int wide,height,DibWidth;    //原图长、宽、字节宽
 p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();   //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 for(int j=0;jg)
    gray=r;
   else 
    gray=g;
   if(grayGetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();    //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 for(int j=0;j255)
   *p_data=255;
        p_data++;   //指向下一指针
 }
}

/***************************************************************/
/*函数名称:LightReverse()                                     */
/*函数类型:void                                               */
/*功能:图像的亮度取反。                                       */
/***************************************************************/
void MakeColorDib::LightReverse()    //亮度取反
{
 BYTE *p_data;     //原图数据区指针
 int wide,height,DibWidth;    //原图长、宽、字节宽
 p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 for(int j=0;j= 0)
  nStretch = 255 - 2 * m_Increment;
 else
  nStretch = 255 + 2 * m_Increment;
 BYTE *p_data;     //原图数据区指针
 int wide,height,DibWidth;    //原图长、宽、字节宽
 p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 if(m_Increment >= 0)   // m_Increment>=0时
 {
  for(int j=0;jnHigh)
     *pbyBlue=255;
    else
     *pbyBlue=(BYTE)((((int)*pbyBlue - m_Increment) * 255) / nStretch );
    //取得当前点(绿色)的值,调整
    BYTE* pbyGreen = p_data++;
    if(*pbyGreen<=m_Increment)
     *pbyGreen=0;
    else if(*pbyGreen>nHigh)
     *pbyGreen=255;
    else
     *pbyGreen=(BYTE)((((int)*pbyGreen - m_Increment) * 255) / nStretch );
    //取得当前点(红色)的值,调整
    BYTE* pbyRed = p_data++;
    if(*pbyRed<=m_Increment)
     *pbyRed=0;
    else if(*pbyRed>nHigh)
     *pbyRed=255;
    else
     *pbyRed=(BYTE)((((int)*pbyRed - m_Increment) * 255) / nStretch );
   }
   
 }
 else  // m_Increment < 0 时
 {
  for(int j=0;jGetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 for(int j=0;j128)?a:(255-a);   //调整
  }
  
}

/***************************************************************/
/*函数名称:PaintColor(int m_Red,int m_Green,int m_Blue)       */
/*函数类型:void                                               */
/*参数:int m_Red、m_Green、m_Blue,用户给定的红绿蓝值         */
/*功能:对图像使用阈值法进行着色处理。                         */
/***************************************************************/
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //着色处理
{
 BYTE *p_data;     //原图数据区指针
 int wide,height,DibWidth;    //原图长、宽、字节宽
 p_data=this->GetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
 for(int j=0;jGetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
    BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
 for(int j=0;j255)
     *(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;jGetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
    BYTE *p_temp=new BYTE[height*DibWidth]; // 暂时分配内存,以保存新图像
 for(int j=0;j255)
    *(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;jGetData ();   //取得原图的数据区指针
    wide=this->GetWidth ();  //取得原图的数据区宽度
    height=this->GetHeight ();   //取得原图的数据区高度
 DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
    BYTE *p_temp=new BYTE[height*DibWidth];
 for(int j=0;j255)
      *(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;j255) //判断是否越界
    *(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;jGetData ();   //取得原图的数据区指针
    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;jGetData ();   //取得原图的数据区指针
    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;j20)
    *(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;j20)
    *(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;j20)
    *(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


你可能感兴趣的:(图像与音视频,算法,linux,人工智能)