图像的采样(马赛克)

图像的应用(马赛克)


一、采样

采样就是指把时间域或空间域的连续量转化成离散量的过程。图像的采样其实就将多个像素用一个像素取代,每隔一定的间隔取一个像素。

我们首先要获得Image对象的数组,可以按下面进行:

 

PixelGrabber pg = new PixelGrabber(im, 0, 0, iw,  ih, pix, 0, iw);

pg.grabPixels();

具体的细节可以查看java的帮助文档,这里强调一下pix就是返回的像素数组,是以默认的 RGB ColorModel 形式将像素存储到数组中。

具体的采样原理看到下面的程序就明白了(当然可以定义不用的采样细节,如水平和垂直的采样间隔不相等等,这里采用的是使用平均色取代):

 

像素采样代码   收藏代码
  1. public int[] sample(int[] pix, int iw, int ih, int grey)  
  2.     {             
  3.         //对图像进行采样  
  4.         ColorModel cm = ColorModel.getRGBdefault();  
  5.           
  6.         int d  = (int)(256/grey);        //采样间隔  
  7.         int dd = d*d;  
  8.         for(int i = 0; i < ih; i = i+d)  
  9.         {  
  10.             for(int j = 0; j < iw; j = j+d)  
  11.             {  
  12.                 int r = 0, g = 0, b = 0;                  
  13.                 for(int k = 0; k < d; k++)  
  14.                     for(int l = 0; l < d; l++)  
  15.                         r = r + cm.getRed(pix[(i+k)*iw+(j+l)]);  
  16.                 for(int k = 0; k < d; k++)  
  17.                     for(int l = 0; l < d; l++)  
  18.                         g = g + cm.getGreen(pix[(i+k)*iw+(j+l)]);  
  19.                 for(int k = 0; k < d; k++)  
  20.                     for(int l = 0; l < d; l++)  
  21.                         b = b + cm.getBlue(pix[(i+k)*iw+(j+l)]);  
  22.                 r = (int)(r/dd);  
  23.                 g = (int)(g/dd);  
  24.                 b = (int)(b/dd);  
  25.                 for(int k = 0; k < d; k++)  
  26.                     for(int l = 0; l < d; l++)  
  27.                         pix[(i+k)*iw+(j+l)] = 255<<24|r<<16|g<<8|b;            
  28.             }  
  29.         }         
  30.         return pix;  
  31.     }  

采样结果(采样间隔为grey的值为16):


二、量化

   量化指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。例如:对应连续的实数用最近的整数代替。看完程序相信就没有问题了,附上实验结果。

 

量化代码   收藏代码
  1. public int[] quantize(int[] pix, int iw, int ih, int level)  
  2.     {  
  3.         int greyLevel = 256/level;  
  4.         int tem, r, g, b;  
  5.         //对图像进行量化处理  
  6.         ColorModel cm=ColorModel.getRGBdefault();  
  7.         for(int i = 0; i< iw*ih; i++)  
  8.         {  
  9.             r  = cm.getRed(pix[i]);  
  10.             tem  = r / greyLevel;  
  11.             r = tem*greyLevel;  
  12.             g  = cm.getGreen(pix[i]);  
  13.             tem  = g / greyLevel;  
  14.             g = tem*greyLevel;  
  15.             b  = cm.getBlue(pix[i]);    
  16.             tem  = b / greyLevel;  
  17.             b = tem*greyLevel;  
  18.             pix[i] = 255<<24|r<<16|g<<8|b;  
  19.         }  
  20.         return pix;  
  21.     }     
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值