图像的数字化

 一、采样

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

我们首先要获得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;
	}	
 

 

 

你可能感兴趣的:(图像的采样,图像的量化)