一、采样
采样就是指把时间域或空间域的连续量转化成离散量的过程。图像的采样其实就将多个像素用一个像素取代,每隔一定的间隔取一个像素。
我们首先要获得Image对象的数组,可以按下面进行:
PixelGrabber pg = new PixelGrabber(im, 0, 0, iw, ih, pix, 0, iw);
pg.grabPixels();
具体的细节可以查看java的帮助文档,这里强调一下pix就是返回的像素数组,是以默认的 RGB ColorModel 形式将像素存储到数组中。
具体的采样原理看到下面的程序就明白了(当然可以定义不用的采样细节,如水平和垂直的采样间隔不相等等,这里采用的是使用平均色取代):
public int[] sample(int[] pix, int iw, int ih, int grey) { //对图像进行采样 ColorModel cm = ColorModel.getRGBdefault(); int d = (int)(256/grey); //采样间隔 int dd = d*d; for(int i = 0; i < ih; i = i+d) { for(int j = 0; j < iw; j = j+d) { int r = 0, g = 0, b = 0; for(int k = 0; k < d; k++) for(int l = 0; l < d; l++) r = r + cm.getRed(pix[(i+k)*iw+(j+l)]); for(int k = 0; k < d; k++) for(int l = 0; l < d; l++) g = g + cm.getGreen(pix[(i+k)*iw+(j+l)]); for(int k = 0; k < d; k++) for(int l = 0; l < d; l++) b = b + cm.getBlue(pix[(i+k)*iw+(j+l)]); r = (int)(r/dd); g = (int)(g/dd); b = (int)(b/dd); for(int k = 0; k < d; k++) for(int l = 0; l < d; l++) pix[(i+k)*iw+(j+l)] = 255<<24|r<<16|g<<8|b; } } return pix; }
采样结果(采样间隔为grey的值为16):
二、量化
量化指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。例如:对应连续的实数用最近的整数代替。看完程序相信就没有问题了,附上实验结果。
public int[] quantize(int[] pix, int iw, int ih, int level) { int greyLevel = 256/level; int tem, r, g, b; //对图像进行量化处理 ColorModel cm=ColorModel.getRGBdefault(); for(int i = 0; i< iw*ih; i++) { r = cm.getRed(pix[i]); tem = r / greyLevel; r = tem*greyLevel; g = cm.getGreen(pix[i]); tem = g / greyLevel; g = tem*greyLevel; b = cm.getBlue(pix[i]); tem = b / greyLevel; b = tem*greyLevel; pix[i] = 255<<24|r<<16|g<<8|b; } return pix; }