此接口描述对 BufferedImage 对象所执行的单输入/单输出操作。它由 AffineTransformOp、ConvolveOp、ColorConvertOp、RescaleOp 和 LookupOp 实现。这些对象可以传入到一个 BufferedImageFilter,以便对 ImageProducer-ImageFilter-ImageConsumer 范例中的 BufferedImage 进行操作。
此类对源图像中的数据执行逐像素的颜色转换。得到的颜色值可以扩展到目标图像的精度。颜色转换可以通过 ColorSpace 对象的数组或 ICC_Profile 对象的数组指定。
ColorConvertOp主要用于实现各种色彩空间的转换,从而达到转换BufferedImage对象类型的目的,可以在实例化ColorConvertOp对象时指定色彩空间。实现灰度功能时,只需在实例化ColorConvertOp时指定色彩空间为ColorSpace.CS_GRAY,然后调用它的filter方法得到返回图像即可。
灰度化的源代码如下:
public BufferedImage doColorGray(BufferedImage bi)
{
ColorConvertOp filterObj = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
return filterObj.filter(bi, null);
}
此类实现从源到目标的查找操作。LookupTable 对象可能包含单个数组或多个数组。
LookupOp在实例化时需要传入LookupTable实例,当前LookupTable接口的两个实现类分别为ByteLookupTable与ShortLookupTable。
运用LookupOp实现彩色图像变成黑白单色图像的功能时,首先要将图像灰度化,然后针对灰度图像在LookupTable中根据像素值进行索引查找,以便设置新的像素值,从而得到黑白单色图像,代码如下:
public BufferedImage doBinaryImage(BufferedImage bi)
{
bi = doColorGray(bi);
byte[] threshold = new byte[256];
for (int i = 0; i < 256; i++)
{
threshold[i] = (i < 128) ? (byte)0 : (byte)255;
}
BufferedImageOp thresholdOp =
new LookupOp(new ByteLookupTable(0, threshold), null);
return thresholdOp.filter(destImage, null);
}
此类实现从源到目标的卷积。使用卷积核的卷积是一种通过输入像素来计算输出像素的空间运算,方法是将核与输入像素邻域相乘。这种运算使得直接邻域可按核数学指定的方式影响输出像素。
ConvolveOp是实现模板卷积工操作的类,通过简单设置卷积核就可以实现图像模糊功能。
但是当处理大多数JPG格式图片的BufferedImage对象实现模糊功能时会报错,这是因为JDK在读取JPG格式对象时,多数情况使用了TYPE_3BYTE_BGR存储方式,而BufferedImageOp实现的滤镜不支持该存储方式的BufferedImage对象,这样就导致了错误。解决方法是通过ColorConvertOp把图像从类型TYPE_3BYTE_BGR转换为TYPE_INT_RGB的BufferedImage对象,所以模糊功能的实现代码如下:
public BufferedImage doBlur(BufferedImage bi)
{
if (bi.getType() == BufferedImage.TYPE_3BYTE_BGR) {
bi = convertType(bi, BufferedImage.TYPE_INT_RGB);
}
float ninth = 1.0f / 9.0f;
float[] blurKernel = {
ninth, ninth, ninth,
ninth, ninth, ninth,
ninth, ninth, ninth
};
BufferedImageOp blurFilter =
new ConvolveOp(new Kernel(3, 3, blurKernel));
return blurFilter.filter(bi, null);
}
//改变图像类型
private BufferedImage convertType(BufferedImage src, int type)
{
ColorConvertOp cco = new ColorConvertOp(null);
BufferedImage dest = new BufferedImage(
src.getWidth(), src.getHeight(), type);
cco.filter(src, dest);
return dest;
}
此类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或 Raster 中 2D 坐标的线性映射。所使用的插值类型由构造方法通过一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
AffineTransformOp支持的操纵包括图像的错切、旋转、放缩、平移。要实现图像的放缩功能,首先要通过AffineTransform.getScaleInstance来获取Scale实例,然后作为参数初始化AffineTransformOp对象实例,最后调用filter方法即可。实现图像放缩功能的代码如下:
public BufferedImage doScale(BufferedImage bi, double sx, double sy)
{
AffineTransformOp atfFilter = new AffineTransformOp(
AffineTransform.getScaleInstance(sx, sy),
AffineTransformOp.TYPE_BILINEAR);
int nw = (int)(bi.getWidth() * sx);
int nh = (int)(bi.getHeight() * sy);
BufferedImage result = new BufferedImage(
nw, nh, BufferedImage.TYPE_3BYTE_BGR);
return atfFilter.filter(bi, result);
}
想了解更多关于数字图像处理:数字图像处理专栏