图像可以看成一个个像素点组成,一般来讲每个像素点都划分成了0-255个灰度,这就是图像的量化。当然量化可以更高或更低,可以将灰度从0-63变化,也可以从0-16变化,等等。所谓量化,就是对图像的采样。

  例如下面我们用opencv将图像按量化层级为64来量化:

    首先,取出每个像素的灰度值,这些值的取值范围是0~255。按量化层级为64来量化,即将其灰度值除以四再乘以四即可。

代码如下:

 1 /*     
 2 功能:读入图像文件,对图像量化,然后显示图像在屏幕上,并将量化后的图像保存
 3 */
 4 #include <stdlib.h>
 5 #include <stdio.h>
 6 #include <math.h>
 7 #include <cv.h>
 8 #include <highgui.h>
 9 int main(int argc, char *argv[])
10 {
11     IplImage* img = 0; 
12     int height,width,step,channels;
13     uchar *data;
14     int i,j,k;
15     if(argc<2)
16     {
17         printf("Usage: main <image-file-name>/n/7");
18         exit(0);
19     }
20     // 载入图像  
21     img=cvLoadImage(argv[1],-1);
22     if(!img)
23     {
24         printf("Could not load image file: %s/n",argv[1]);
25         exit(0);
26     }
27     // 获取图像信息
28     height    = img->height;  
29     width     = img->width;    
30     step      = img->widthStep;    
31     channels  = img->nChannels;
32     data      = (uchar *)img->imageData;
33     printf("Processing a %dx%d image with %d channels/n",height,width,channels); 
34     // 创建窗口
35     cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); 
36     cvMoveWindow("mainWin", 100, 100);
37     // 量化图像
38     for(i=0;i<height;i++) 
39         for(j=0;j<width;j++) 
40             for(k=0;k<channels;k++)
41                 data[i*step+j*channels+k]=data[i*step+j*channels+k]/4;
42     for(i=0;i<height;i++) 
43         for(j=0;j<width;j++) 
44             for(k=0;k<channels;k++)
45                 data[i*step+j*channels+k]=data[i*step+j*channels+k]*4;
46     // 显示图像
47     cvShowImage("mainWin", img );
48     /*保存图像*/
49     cvSaveImage("lena.pgm",img);
50     cvWaitKey(0);
51     cvReleaseImage(&img );
52     printf("height=%d  width=%d step=%d channels=%d",height,width,step,channels);
53     return 0;
54 }