C++图像处理函数及程序(一)
阅读原文时间:2023年07月15日阅读:3

C++开源项目:

Boost.GIL:通用图像库
CImg :用于图像处理的小型开源C++工具包
CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。
FreeImage :开源库,支持现在多媒体应用所需的通用图片格式和其他格式。
GDCM:Grassroots DICOM 库
ITK:跨平台的开源图像分析系统
Magick++:ImageMagick程序的C++接口
MagickWnd:ImageMagick程序的C++接口
OpenCV : 开源计算机视觉类库
tesseract-ocr:OCR引擎
VIGRA :用于图像分析通用C++计算机视觉库
VTK :用于3D计算机图形学,图像处理和可视化的开源免费软件系统。

函数名称: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;  //删除暂时分配内存
}

我的个人博客文章地址,欢迎访问
我的CSDN文章地址,欢迎访问
我的简书文章地址,欢迎访问
我的GitHub主页,欢迎访问

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章