图像可以看成一个个像素点组成,一般来讲每个像素点都划分成了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 }
最新评论