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

来源:互联网 发布:linux gem命令 编辑:程序博客网 时间:2024/05/16 07:40

查资料时看到的一篇博文,转下来先,原文: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;j<height;j++) // 每行  for(int i=0;i<DibWidth;i+=3) // 每列  {   BYTE* pbyBlue = p_data++;   //得到蓝色值   BYTE* pbyGreen = p_data++;  //得到绿色值   BYTE* pbyRed = p_data++;    //得到红色值   BYTE r = *pbyRed;   BYTE g = *pbyGreen;   BYTE b = *pbyBlue;   //取到原r,g,b中的最大值作为像素三分量值的新值   int gray=0;   if(r>g)    gray=r;   else     gray=g;   if(gray<b)    gray=b;            *pbyBlue = gray;     //将取到的最大值赋给像素的蓝分量   *pbyGreen = gray;    //将取到的最大值赋给像素的绿分量   *pbyRed = gray;      //将取到的最大值赋给像素的红分量  }}/***************************************************************//*函数名称:LightAlter(int m_Light)                            *//*函数类型:void                                               *//*参数:int m_Light,用户给定的阈值                            *//*功能:对图像使用阈值法进行亮度调整。                         *//***************************************************************/void MakeColorDib::LightAlter(int m_Light)    //亮度调整{ 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<height;j++) // 每行 for(int i=0;i<DibWidth;i++) // 每列 {     int a=0;  a=int(*p_data*m_Light/100);   //调整当前点的亮度  *p_data=a;  //判断范围,取得合理的值  if(a<0)    *p_data=0;       if(a>255)   *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<height;j++) // 每行  for(int i=0;i<DibWidth;i++) // 每列  {   int a=*p_data;   //取得当前点的值   *p_data=255-a;    //取反   p_data++;  //指向下一指针    }}/***************************************************************//*函数名称:ContrastAlter(int m_Increment)                     *//*函数类型:void                                               *//*参数:int m_Increment,用户给定的阈值                        *//*功能:对图像使用阈值法调整对比度处理。                       *//***************************************************************/void MakeColorDib::ContrastAlter(int m_Increment)   ///对比度处理{ int nHigh = 255 - m_Increment; //对于极端情况加以处理 if(nHigh < m_Increment) {  nHigh = 127;  m_Increment = 120; } if(m_Increment < -127)  m_Increment = -120; //扩展或压缩区间的长度 int nStretch = 255; if(m_Increment >= 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;j<height;j++) // 每行   for(int i=0;i<DibWidth-3;i+=3) // 每列   {       //取得当前点(蓝色)的值,调整    BYTE* pbyBlue = p_data++;        if(*pbyBlue<=m_Increment)     *pbyBlue=0;    else if(*pbyBlue>nHigh)     *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;j<height;j++)   for(int i=0;i<DibWidth-3;i+=3)   { //取得当前点(蓝色)的值,调整    BYTE* pbyBlue = p_data++;    *pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);    //取得当前点(红色)的值,调整    BYTE* pbyGreen = p_data++;    *pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);    //取得当前点(红色)的值,调整    BYTE* pbyRed = p_data++;    *pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment);       } }}/***************************************************************//*函数名称:Exposal()                                          *//*函数类型:void                                               *//*功能:图像曝光处理。                                         *//***************************************************************/void MakeColorDib::Exposal() //曝光处理{ 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<height;j++) // 每行  for(int i=0;i<DibWidth;i++) // 每列  {   BYTE* pbydata = p_data++;  //取得当前点的值   BYTE a=*pbydata;   //传给临时变量   *pbydata=(a>128)?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;j<height;j++) // 每行  for(int i=0;i<DibWidth;i+=3) // 每列  {      BYTE* pbyBlue = p_data++; //取得当前点(蓝色)的值        BYTE* pbyGreen = p_data++;  //取得当前点(绿色)的值   BYTE* pbyRed = p_data++;    //取得当前点(红色)的值   BYTE r = *pbyRed;   BYTE g = *pbyGreen;   BYTE b = *pbyBlue;      BYTE gray=(BYTE)(((WORD)r * 59 + (WORD)g * 30 + (WORD)b * 11) / 100);   *pbyBlue = (BYTE)((m_Blue * gray) / 255);     *pbyGreen = (BYTE)((m_Green * gray) / 255);   *pbyRed = (BYTE)((m_Red * gray) / 255);  }}/***************************************************************//*函数名称:NeonLight()                                        *//*函数类型:void                                               *//*功能:使图像产生霓虹处理效果。                               *//***************************************************************/void MakeColorDib::NeonLight()   //霓虹处理{ 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))    +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;  //删除暂时分配内存}/***************************************************************/函数名称:LowVBObig()函数类型:void功能:实现函数低通滤波(5*5)/***************************************************************/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;  //删除暂时分配内存} 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 厨房热水管漏水怎么办 水管热接漏水怎么办 陶瓷浴缸下水漏水怎么办 热溶水管漏水怎么办 浴缸下水口漏水怎么办 浴缸下水器漏水怎么办 铁皮接头处漏水怎么办 马桶被堵死了怎么办 家里灯泡坏了怎么办 家里电路烧了怎么办 如果电脑开不了怎么办 热水器水管子漏水怎么办 淋浴头开关滴水怎么办 淋浴头一直滴水怎么办 饮水机放桶漏水怎么办 热水器热水阀门漏水怎么办 热水器热水出口漏水怎么办 热水器上水管漏水怎么办 水管往外漏水怎么办 ppr热水管漏水怎么办 大半夜水闸爆了怎么办 热水器不热水了怎么办 水龙头外皮裂了怎么办 电热水龙头坏了怎么办 太阳能存不住水怎么办 混水阀断裂漏水怎么办 洗澡淋浴头漏水怎么办 马桶有异物堵住怎么办 捷达机油盖漏油怎么办 乳化油臭了怎么办 自行车前叉严重生锈怎么办 自行车链条生锈了怎么办 自行车链子生锈了怎么办 对切削液过敏怎么办 齿轮油加到机油怎么办 机油加液压油里怎么办 液压油里面有水怎么办 加油站双层复合管漏油怎么办 预制屋面板底面渗漏怎么办 焊电焊眼睛疼怎么办 下水主管道篦子怎么办