日期:2014-05-20  浏览次数:20706 次

图像处理时碰到的一个问题,细节见文章
现在在做一个手写识别的小程序,
在一个800*350的画板上写了个字符,将其转化成BufferedImage,然后调用代码1,将其缩小成16*16的图片,根据RGB值转化成16*16的0,1矩阵,但是得到的矩阵跟我手写的那个字符完全不符合啊!求大神帮我看看有什么问题。或者说还有什么图像缩小算法吗?
代码1:

   /**
 * 
 * @param srcImg  待处理图像
 * @param width   缩小后的长度
 * @param height  缩小后的宽度
 * @return
 */
 public BufferedImage SuoImg(BufferedImage srcImg,int width,int height){
BufferedImage targetImg=null;
double Sx=(double)width/srcImg.getWidth();
double Sy=(double)height/srcImg.getHeight();
int type=srcImg.getType();
if(type==0){
ColorModel cm=srcImg.getColorModel();
WritableRaster raster=cm.createCompatibleWritableRaster(width,height);
boolean alpha=cm.isAlphaPremultiplied();
targetImg=new BufferedImage(cm, raster, alpha,null);
}else{
targetImg=new BufferedImage(width, height, type);
}
Graphics2D g2=targetImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
g2.drawRenderedImage(srcImg,AffineTransform.getScaleInstance(Sx, Sy));
g2.dispose();
return targetImg;
}

------解决方案--------------------
BufferedImage有缩小图像的功能吧
------解决方案--------------------
图片缩小后会丢失很多数据的,很正常的现象。
------解决方案--------------------
引用:
Quote: 引用:

BufferedImage有缩小图像的功能吧

嗯,是有。我发现问题了,是不是因为写的字符笔画太细了,本来缩写区域比较大,把它缩小成16*16,缩小倍数过大,没有笔画显示了

楼主的这个说法,我非常赞同。
因为缩小图片,是按照比例来缩小的。如果原图中是细线,按比例缩小后不构成一像素的内容就会被忽略掉。