图像的应用(马赛克)
一、采样
采样就是指把时间域或空间域的连续量转化成离散量的过程。图像的采样其实就将多个像素用一个像素取代,每隔一定的间隔取一个像素。
我们首先要获得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;
- }