BufferedImageOp接口实现滤镜

此接口描述对 BufferedImage 对象所执行的单输入/单输出操作。它由 AffineTransformOp、ConvolveOp、ColorConvertOp、RescaleOp 和 LookupOp 实现。这些对象可以传入到一个 BufferedImageFilter,以便对 ImageProducer-ImageFilter-ImageConsumer 范例中的 BufferedImage 进行操作。


ColorConvertOp实现灰度功能

此类对源图像中的数据执行逐像素的颜色转换。得到的颜色值可以扩展到目标图像的精度。颜色转换可以通过 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);
    }

LookupOp实现黑白功能

此类实现从源到目标的查找操作。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实现模糊功能

此类实现从源到目标的卷积。使用卷积核的卷积是一种通过输入像素来计算输出像素的空间运算,方法是将核与输入像素邻域相乘。这种运算使得直接邻域可按核数学指定的方式影响输出像素。

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;
    }

AffineTransformOp实现图像zoom in/out功能

此类使用仿射转换来执行从源图像或 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);
    }

想了解更多关于数字图像处理:数字图像处理专栏

你可能感兴趣的:(数字图像处理,Java,数字图像处理,BufferedImageOp,BufferedImage,Java,数字图像处理)