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

📄 imageprocess.c

📁 在ccs开发环境下实现的基于dsp的图像二维dct变换和压缩,完整可实现的工程文件, 源文件算法清晰,良好的实现效果
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include "ImageProcess.h"

FILE *Ifp, *Ofp1,*Ofp2,*Ofp3,*Ofp4;
FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;


#ifdef HISTOGRAM
//输入:pYuv原始彩色图像  bufferize:width*height*3/2,包括YUV分量
//输入:width,height:输入图像的宽和高,如176,144
//输入:EquaScale:直方图均衡化的新灰度级,须为2^n

//输出:orig_hist:原始图像的灰度图对应的直方图,buffersize:256 默认原始灰度级为256
//输出:new_hist:均衡化后的直方图,buffersize:Equalscale
//输出:oldYuv原始图像对应的灰度图,buffersize:width*height*3/2,Y分量和pYuv相同
//输出:newYuv经直方图均衡化后的灰度图,buffersize:width*height*3/2
//将输出buffer写入文件可以看到对应的图像或者直方图数据
void  HistEqualize(BYTE *pY,BYTE *pU,BYTE *pV,//input Image
                   BYTE *oldYuv,//原始YUV图像的灰度图象
                   BYTE *newYuv, //Recon Image
                   int EquaScale,  //should no more than 256 
                   unsigned int *orig_hist,  //[256]
	               unsigned int *new_hist  // [EquaScale]    
                   )
{

   int i,ii,k;
   unsigned char *oldpp,*pp,*newpp;
   unsigned char oldgray,newgray;   
   unsigned int newGrayIndex[256];  
   unsigned int tmpGray[256]; 
   unsigned int tmp_hist[256];  
   
   //set hist zero
   for(i=0;i<256;i++)   orig_hist[i]=0;   
   for(i=0;i<EquaScale;i++)  new_hist[i]=0;
 
   //get old grayimage 
   oldpp = oldYuv;
   pp = pY;
   //Y =pYuv
   for (i = 0; i < Y_SIZE; i++)   *(oldpp++)=*(pp++);
   //UV=128 
   for (i=0;i<(Y_SIZE>>1);i++)   *(oldpp++)=128; 
   
   //get original histogram    
   pp=pY;             
   for (i = 0; i < Y_SIZE; i++)
    {
        oldgray = *(pp++);
        orig_hist[oldgray] ++;        
    }   
    
    //do histogram equalization
    for(i=0;i<256;i++)     tmp_hist[i] = orig_hist[i]; 
    for(i=1; i<256; i++)   tmp_hist[i] += tmp_hist[i-1];     
            
    for(i=0; i<256; i++)   tmpGray[i] = tmp_hist[i]*(EquaScale-1);     
    
    //get new grayindex  
    for(i=0,ii=0;i<256;i++)
    {
      if(tmpGray[i]<(Y_SIZE>>1))       
       {  
          newGrayIndex[i]=0;
       }
      else
       {   
           ii=i;
           break;
       } 
    }  
     
    for(i=ii,k=1;i<256;i++)
    { 
      if((tmpGray[i] >= (k*Y_SIZE-(Y_SIZE>>1)))&&(tmpGray[i]< (k*Y_SIZE+(Y_SIZE>>1))))
       {
           newGrayIndex[i]=k;
       }    
      else 
       {
           k++;
           i--;
       }
    } 
      
    //get newImage 
    pp=pY;
    newpp=newYuv;
    
    for(i=0;i<Y_SIZE;i++)
    {
      oldgray = *(pp++);     
      newgray =newGrayIndex[oldgray];     
      *(newpp++)=newgray;
    }    
   
    for (i=0; i<(Y_SIZE>>1); i++)    *(newpp++)=128;
       
    //get the equalized histogram     
    newpp=newYuv;             
    for (i = 0; i < Y_SIZE; i++)
    {
        newgray = *(newpp++);
        new_hist[newgray] ++;        
    }
    
}    


#endif


#ifdef NOISE
//产生均匀分布的随机噪声图像
//输入:width,height:图像的宽和长
//输入:range 产生随机噪声的强度
//输出:noiseYuv:均匀分布的随机噪声图像,灰度图,buffersize:width*height*3/2,
void RandImage( BYTE *noiseYuv, //output noiseImage  
                int range      //input:random range          
                )
{
  unsigned char *noisepp;
  int i,tmpn;
  
  srand(time(NULL));
       
  noisepp=noiseYuv;       
  for(i=0;i<Y_SIZE;i++)
     {   
       tmpn= rand()%range+128;   
       if(tmpn <= 255)  
         {*(noisepp ++ )=tmpn;}    
       else          
         {*(noisepp ++ )= 255; }                        
     } 
      
  for(i=0;i<(Y_SIZE>>1);i++)
     {      
       *(noisepp ++ )=128;            
     }      

}

//在输入图像上加入均匀分布的随机噪声
//输入:pYuv原始彩色图像,buffersize:width*height*3/2
//输入:width,height 输入图像的宽和长
//输入:range 添加噪声的强度
//输出:oldYuv:输入彩色图像的灰度图象:width*height*3/2
//输出:newYuv:输出添加了噪声的灰度图象:width*height*3/2
//输出:noiseYuv:添加的噪声图像 buffersize:width*height*3/2
void AddRandNoise( BYTE *pY, BYTE *pU, BYTE *pV,//input
               unsigned char *newYuv, //output the recon image
               unsigned char *noiseYuv, //output the addnoise image
               int range   //noise range           
              )
            
{   
  int i;
  int sum;

  BYTE *ppY=pY, *ppU=pU, *ppV=pV, *newpp=newYuv,*noisepp=noiseYuv; 
  
  srand(time(NULL));
       
  for(i=0;i<Y_SIZE;i++)
  {             
      *(noisepp ++ ) = rand()%range;                        
  }
  for(i=0;i<UV_SIZE<<1;i++)
  	*noisepp ++ =128;
                       
  noisepp=noiseYuv;

  for(i=0;i<Y_SIZE;i++)   
  {
     sum=*(ppY ++ ) + *(noisepp++) ; 
     if(sum >=255)  
     {
       *(newpp ++ ) = 255;
     }
     else
     {
       *(newpp ++ ) = sum;                        
     } 
  }     
  
  for(i=0;i<UV_SIZE;i++)
  	*newpp++ = *ppU++;
  for(i=0;i<UV_SIZE;i++)
  	*newpp++ = *ppV++;
            
}


#endif 



#ifdef FILTER
//空间滤波,模板大小4x4,对均值滤波模板为全1
//输入:pYuv:输入图像
//输入:CoeffArray:滤波模板系数,1x16数组,a[4][4]排列方法为{a[0][0],a[0][1],a[0][2],...,a[3][2],a[3][3]}
//输入:width,height:输入图像的宽和长
//输出:newYuv:经滤波后的彩色图像

int CoefArray[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//{a[0][0],a[0][1],a[0][2]...a[3][2],a[3][3]}

void SpaceFilter(BYTE *pY,BYTE *pU,BYTE *pV,//input Image
                 BYTE *newYuv
                 )
{

/*    unsigned char *pp, *ppU=pU, *ppV=pV,*newpp;//,*oldpp;
    int tmpNum;     
    int i,x,y;   

         //do filter to Y        
         for(y=0; y<DATA_LINES-3; y++)
         for(x=0; x<DATA_PELS-3; x++)
           {
             newpp   = newYuv + y*DATA_PELS +x;
             pp      = pY + y*DATA_PELS +x;             
             tmpNum  = (*(pp++))*CoefArray[0];
             tmpNum += (*(pp++))*CoefArray[1];
             tmpNum += (*(pp++))*CoefArray[2];
             tmpNum += (*(pp++))*CoefArray[3];
             
             pp      = pY + (y+1)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[4];
             tmpNum += (*(pp++))*CoefArray[5];
             tmpNum += (*(pp++))*CoefArray[6];
             tmpNum += (*(pp++))*CoefArray[7];
             
             pp      = pY + (y+2)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[8];
             tmpNum += (*(pp++))*CoefArray[9];
             tmpNum += (*(pp++))*CoefArray[10];
             tmpNum += (*(pp++))*CoefArray[11];
             
             pp      = pY + (y+3)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[12];
             tmpNum += (*(pp++))*CoefArray[13];
             tmpNum += (*(pp++))*CoefArray[14];
             tmpNum += (*(pp++))*CoefArray[15];
             
             tmpNum =tmpNum>>4;  //1/16                    
          
             //check if overflow
             if(tmpNum > 255) *newpp=255;
             else     *newpp=tmpNum;        
           }
           
         for(y=DATA_LINES-3;  y<DATA_LINES;  y++)
         for(x=DATA_PELS-3;   x<DATA_PELS; x++)
          {
             newpp  = newYuv + y*DATA_LINES +x;
             *newpp = 0;                        
          }          
         //set U V
         newpp = newYuv + Y_SIZE;

  for(i=0;i<UV_SIZE;i++)
  	*newpp++ = *ppU++;
  for(i=0;i<UV_SIZE;i++)
  	*newpp++ = *ppV++;
*/

    unsigned char *pp,*ppU=pU, *ppV=pV,*newpp;//,*oldpp;
    int tmpNum;     
    int i,x,y;   
    
         //do filter to Y        
         for(y=0; y<DATA_LINES-3; y++)
         for(x=0; x<DATA_PELS-3; x++)
           {
             newpp   = newYuv + y*DATA_PELS +x;
             pp      = pY + y*DATA_PELS +x;             
             tmpNum  = (*(pp++))*CoefArray[0];
             tmpNum += (*(pp++))*CoefArray[1];
             tmpNum += (*(pp++))*CoefArray[2];
             tmpNum += (*(pp++))*CoefArray[3];
             
             pp      = pY + (y+1)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[4];
             tmpNum += (*(pp++))*CoefArray[5];
             tmpNum += (*(pp++))*CoefArray[6];
             tmpNum += (*(pp++))*CoefArray[7];
             
             pp      = pY + (y+2)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[8];
             tmpNum += (*(pp++))*CoefArray[9];
             tmpNum += (*(pp++))*CoefArray[10];
             tmpNum += (*(pp++))*CoefArray[11];
             
             pp      = pY + (y+3)*DATA_PELS +x;
             tmpNum += (*(pp++))*CoefArray[12];
             tmpNum += (*(pp++))*CoefArray[13];
             tmpNum += (*(pp++))*CoefArray[14];
             tmpNum += (*(pp++))*CoefArray[15];
             
             tmpNum =tmpNum>>4;  //*1/16                    
          
             //check if overflow
             if(tmpNum > 255) *newpp=255;
             else     *newpp=tmpNum;        
          
           }
           
         for(y=DATA_LINES-3;  y<DATA_LINES;  y++)
         for(x=DATA_PELS-3;   x<DATA_PELS; x++)
          {
             newpp  = newYuv + y*DATA_PELS +x;
             *newpp = 0;                        
          }          
         //set U V
         newpp = newYuv + Y_SIZE;
//         pp    = pYuv + Y_size;  
         for(i=0;i<UV_SIZE;i++)
         {      
           *(newpp ++ )=*(ppU++);            
         }      
         for(i=0;i<UV_SIZE;i++)
         {      
           *(newpp ++ )=*(ppV++);            
         }      
}


#endif



⌨️ 快捷键说明

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