zoukankan      html  css  js  c++  java
  • 对图像每个像素点量化

    图像可以看成一个个像素点组成,一般来讲每个像素点都划分成了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 }
  • 相关阅读:
    系统消息系统公告数据建模
    Chrome部分站点无法启用Flash问题
    使用netstat命令查看端口的使用情况
    Jave基本数据类型
    Mac下Tomcat安装&配置&80默认端口设置
    React学习及实例开发(一)——开始(转载)
    jQuery、layer实现弹出层的打开、关闭功能实例详解
    jQuery获取节点和子节点文本的方法
    jquery 获取$("#id").text()里面的值 需要进行去空格去换行符操作
    ES6数组新增的几个方法
  • 原文地址:https://www.cnblogs.com/yongjiuzhizhen/p/3454555.html
Copyright © 2011-2022 走看看