小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

圖像處理常用算法(C/C++)

 dbn9981 2016-11-05

圖像處理常用算法(C/C++)

2013年10月24日 ? 綜合 ? 共 19931字 ? 字號    評論關(guān)閉

查資料時看到的一篇博文,轉(zhuǎn)下來先,原文:http://gaojinpeng1129.blog.163.com/blog/static/141659068201321194552695/

 

/*函數(shù)名稱:MakegGray()                                        */
/*函數(shù)類型:void                                               */
/*功能:真彩色轉(zhuǎn)化成256色灰度圖像。                            */
/***************************************************************/
void MakeColorDib::MakegGray()    //灰度變化
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();   //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 for(int j=0;j<height;j++) // 每行
  for(int i=0;i<DibWidth;i+=3) // 每列
  {
   BYTE* pbyBlue = p_data++;   //得到藍(lán)色值
   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;     //將取到的最大值賦給像素的藍(lán)分量
   *pbyGreen = gray;    //將取到的最大值賦給像素的綠分量
   *pbyRed = gray;      //將取到的最大值賦給像素的紅分量
  }
}

/***************************************************************/
/*函數(shù)名稱:LightAlter(int m_Light)                            */
/*函數(shù)類型:void                                               */
/*參數(shù):int m_Light,用戶給定的閾值                            */
/*功能:對圖像使用閾值法進(jìn)行亮度調(diào)整。                         */
/***************************************************************/
void MakeColorDib::LightAlter(int m_Light)    //亮度調(diào)整
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();    //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 for(int j=0;j<height;j++) // 每行
 for(int i=0;i<DibWidth;i++) // 每列
 {   
  int a=0;
  a=int(*p_data*m_Light/100);   //調(diào)整當(dāng)前點的亮度
  *p_data=a;
  //判斷范圍,取得合理的值
  if(a<0) 
   *p_data=0;  
     if(a>255)
   *p_data=255;
        p_data++;   //指向下一指針
 }
}

/***************************************************************/
/*函數(shù)名稱:LightReverse()                                     */
/*函數(shù)類型:void                                               */
/*功能:圖像的亮度取反。                                       */
/***************************************************************/
void MakeColorDib::LightReverse()    //亮度取反
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 for(int j=0;j<height;j++) // 每行
  for(int i=0;i<DibWidth;i++) // 每列
  {
   int a=*p_data;   //取得當(dāng)前點的值
   *p_data=255-a;    //取反
   p_data++;  //指向下一指針  
  }
}

/***************************************************************/
/*函數(shù)名稱:ContrastAlter(int m_Increment)                     */
/*函數(shù)類型:void                                               */
/*參數(shù):int m_Increment,用戶給定的閾值                        */
/*功能:對圖像使用閾值法調(diào)整對比度處理。                       */
/***************************************************************/
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;
 //擴(kuò)展或壓縮區(qū)間的長度
 int nStretch = 255;
 if(m_Increment >= 0)
  nStretch = 255 - 2 * m_Increment;
 else
  nStretch = 255 + 2 * m_Increment;
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 if(m_Increment >= 0)   // m_Increment>=0時
 {
  for(int j=0;j<height;j++) // 每行
   for(int i=0;i<DibWidth-3;i+=3) // 每列
   {   
    //取得當(dāng)前點(藍(lán)色)的值,調(diào)整
    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 );
    //取得當(dāng)前點(綠色)的值,調(diào)整
    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 );
    //取得當(dāng)前點(紅色)的值,調(diào)整
    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)
   { //取得當(dāng)前點(藍(lán)色)的值,調(diào)整
    BYTE* pbyBlue = p_data++;
    *pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);
    //取得當(dāng)前點(紅色)的值,調(diào)整
    BYTE* pbyGreen = p_data++;
    *pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);
    //取得當(dāng)前點(紅色)的值,調(diào)整
    BYTE* pbyRed = p_data++;
    *pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment);    
   }
 }
}

/***************************************************************/
/*函數(shù)名稱:Exposal()                                          */
/*函數(shù)類型:void                                               */
/*功能:圖像曝光處理。                                         */
/***************************************************************/
void MakeColorDib::Exposal() //曝光處理
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 for(int j=0;j<height;j++) // 每行
  for(int i=0;i<DibWidth;i++) // 每列
  {
   BYTE* pbydata = p_data++;  //取得當(dāng)前點的值
   BYTE a=*pbydata;   //傳給臨時變量
   *pbydata=(a>128)?a:(255-a);   //調(diào)整
  }
  
}

/***************************************************************/
/*函數(shù)名稱:PaintColor(int m_Red,int m_Green,int m_Blue)       */
/*函數(shù)類型:void                                               */
/*參數(shù):int m_Red、m_Green、m_Blue,用戶給定的紅綠藍(lán)值         */
/*功能:對圖像使用閾值法進(jìn)行著色處理。                         */
/***************************************************************/
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //著色處理
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 for(int j=0;j<height;j++) // 每行
  for(int i=0;i<DibWidth;i+=3) // 每列
  {   
   BYTE* pbyBlue = p_data++; //取得當(dāng)前點(藍(lán)色)的值     
   BYTE* pbyGreen = p_data++;  //取得當(dāng)前點(綠色)的值
   BYTE* pbyRed = p_data++;    //取得當(dāng)前點(紅色)的值
   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);
  }
}

/***************************************************************/
/*函數(shù)名稱:NeonLight()                                        */
/*函數(shù)類型:void                                               */
/*功能:使圖像產(chǎn)生霓虹處理效果。                               */
/***************************************************************/
void MakeColorDib::NeonLight()   //霓虹處理
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-4;j++) // 每行
 {
  for(int i=0;i<DibWidth-1;i++) // 每列
  {
    int pby_pt=0;
    //對像素執(zhí)行算法
    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);  // 復(fù)制處理后的圖像
    delete []p_temp;   //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:Smoothness()                                       */
/*函數(shù)類型:void                                               */
/*功能:使圖像平滑處理。                                       */
/***************************************************************/
void MakeColorDib::Smoothness()   //平滑處理
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    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]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 {
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
         double pby_pt=0;
                    //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
       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))
                    //對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
        +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))
                    //對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
              +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);  // 復(fù)制處理后的圖像
    delete []p_temp;//刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:Embossment()                                       */
/*函數(shù)類型:void                                               */
/*功能:產(chǎn)生圖像浮雕處理效果。                                 */
/***************************************************************/
void MakeColorDib::Embossment()   //浮雕處理
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height;j++) // 每行
 {
  for(int i=0;i<DibWidth-4;i++) // 每列
  {
    int pby_pt=0;
    //對像素得每個分量執(zhí)行算法
    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);  // 復(fù)制處理后的圖像
    delete []p_temp;   //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:Spread()                                           */
/*函數(shù)類型:void                                               */
/*功能:圖像擴(kuò)散處理。                                         */
/***************************************************************/
void MakeColorDib::Spread()   //擴(kuò)散處理
{ 
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-4;j++) // 每行
 {
  for(int i=0;i<DibWidth-14;i++) // 每列
  {
    int m=0,n=0;
    m=rand()%5; //取得行隨機(jī)數(shù)
    n=rand()%5; //取得列隨機(jī)數(shù)
    int pby_pt=0; 
    pby_pt=*(p_data+(height-j-1-m)*DibWidth+i+3*n);//得到對應(yīng)隨機(jī)像素值
    *(p_temp+(height-j-3)*DibWidth+i+6)=pby_pt;
  }
 }
    memcpy(p_data,p_temp,height*DibWidth);  // 復(fù)制處理后的圖像
    delete []p_temp;   //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:Sharp()                                            */
/*函數(shù)類型:void                                               */
/*功能:圖像銳化處理。                                         */
/***************************************************************/
void MakeColorDib::Sharp()   //圖像銳化
{
  BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    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);  // 復(fù)制處理后的圖像
    delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:HighLVBO(int m_GaoTong)                            */
/*函數(shù)類型:void                                               */
/*參數(shù):int m_GaoTong,用戶給定的閾值來選擇矩陣                */
/*功能:對圖像使用閾值法進(jìn)行高通濾波。                         */
/***************************************************************/
void MakeColorDib::HighLVBO(int m_GaoTong)   //高通濾波
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 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]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 {
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
   int pby_pt=0;
   //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
   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))
    //對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
    +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))
    //對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
    +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);  // 復(fù)制處理后的圖像
    delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:LowLVBO()                                          */
/*函數(shù)類型:void                                               */
/*功能:實現(xiàn)圖像低通濾波(3x3)。                                */
/***************************************************************/
void MakeColorDib::LowLVBO()   //低通濾波(3x3)
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
    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]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 {
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
   double pby_pt=0;
            //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加 
   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))
    //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
    +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))
    //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
    +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);  // 復(fù)制處理后的圖像
 delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/

函數(shù)名稱:LowVBObig()

函數(shù)類型:void

功能:實現(xiàn)函數(shù)低通濾波(5*5)
/***************************************************************/
void MakeColorDib::LowLVBObig()   //低通濾波(5x5)
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 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]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-4;j++) // 每行
 {
  for(int i=0;i<DibWidth-14;i++) // 每列
  {
         int pby_pt=0;
         //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
   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))
                  //對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
         +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))
                  //對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
         +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))
                  //對應(yīng)的第3行的值乘以矩陣對應(yīng)值,再相加
         +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))
                  //對應(yīng)的第4行的值乘以矩陣對應(yīng)值,再相加
         +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(矩陣權(quán)和)放在求總和之后
   *(p_temp+(height-j-3)*DibWidth+i+6)=abs(int(pby_pt/35));
  }
 }
 memcpy(p_data,p_temp,height*DibWidth);  // 復(fù)制處理后的圖像
 delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:ShuiPingGROW()                                     */
/*函數(shù)類型:void                                               */
/*功能:使圖像水平增強(qiáng)。                                       */
/***************************************************************/
void MakeColorDib::ShuiPingGROW()   //水平增強(qiáng)
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 int h[3][1];//定義(3x1)矩陣
 h[0][0] = -1;  
 h[1][0] = 2; 
 h[2][0] = -1;
 BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 {
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
   int pby_pt=0;
   //對應(yīng)的3行的值乘分別以矩陣對應(yīng)值,再相加
   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);  // 復(fù)制處理后的圖像
    delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:ChuiZhiGROW()                                      */
/*函數(shù)類型:void                                               */
/*功能:使圖像垂直增強(qiáng)。                                       */
/***************************************************************/
void MakeColorDib::ChuiZhiGROW()   //垂直增強(qiáng)
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 int h[1][3];//定義(1x3)矩陣
 h[0][0] = -1; 
 h[0][1] = 2;
 h[0][2] = -1;
 BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 {
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
   int pby_pt=0;
   //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
   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);  // 復(fù)制處理后的圖像
 delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:ShuangXiangGROW()                                  */
/*函數(shù)類型:void                                               */
/*功能:使圖像雙向增強(qiáng)。                                       */
/***************************************************************/
void MakeColorDib::ShuangXiangGROW()    //雙向增強(qiáng)
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 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]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-2;j++) // 每行
 { 
  for(int i=0;i<DibWidth-8;i++) // 每列
  {
   int pby_pt=0;
   //對應(yīng)的第0行的值乘以矩陣對應(yīng)值,再相加
   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))
    //對應(yīng)的第1行的值乘以矩陣對應(yīng)值,再相加
    +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))
    //對應(yīng)的第2行的值乘以矩陣對應(yīng)值,再相加
    +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);  // 復(fù)制處理后的圖像
 delete []p_temp;  //刪除暫時分配內(nèi)存
}

/***************************************************************/
/*函數(shù)名稱:Mosaic()                                           */
/*函數(shù)類型:void                                               */
/*功能:使圖像產(chǎn)生馬賽克效果。                                 */
/***************************************************************/
void MakeColorDib::Mosaic()    //馬賽克
{
 BYTE *p_data;     //原圖數(shù)據(jù)區(qū)指針
 int wide,height,DibWidth;    //原圖長、寬、字節(jié)寬
 p_data=this->GetData ();   //取得原圖的數(shù)據(jù)區(qū)指針
    wide=this->GetWidth ();  //取得原圖的數(shù)據(jù)區(qū)寬度
    height=this->GetHeight ();   //取得原圖的數(shù)據(jù)區(qū)高度
 DibWidth=this->GetDibWidthBytes();   //取得原圖的每行字節(jié)數(shù)
 BYTE *p_temp=new BYTE[height*DibWidth]; // 暫時分配內(nèi)存,以保存新圖像
 for(int j=0;j<height-4;j+=5) // 每行
 { 
     for(int i=0;i<DibWidth-14;i+=15) // 每列
  {   //對應(yīng)周圍(5x5)矩陣藍(lán)色值求和平均
   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);
    } 
            //對應(yīng)周圍(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);
    }
            //對應(yīng)周圍(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);  // 復(fù)制處理后的圖像
 delete []p_temp;  //刪除暫時分配內(nèi)存
}



 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多