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

[图像生成算法]图中所示效果如何实现
现在可以做出来的效果是第一幅图,采用的是Java2D绘制的方法实现,图中的每一个“矩形格子”是根据读取的数据生成的image。第二幅图是在第一幅的基础上做了算法修正,第三幅图是在第二幅图的基础上进行算法修正。最终想实现的效果是第三幅图。现在想请教下第二幅图的效果是如何实现的?
请提供下大概实现技术思路或已有算法,谢谢!
---------------------------------第一幅图------------------------------------------

-----------------------------------------------

---------------------------------第二幅图------------------------------------------

-----------------------------------------------

---------------------------------第三幅图------------------------------------------

-----------------------------------------------

------解决方案--------------------
相当于图形边缘柔和化?

我想大致原理应该是相同色族区按照要求进行一定的色素扩展,当然相对的色族区就会相应缩小,具体也没做过,只是以前见过类似的程序
------解决方案--------------------
主要就是使用BufferedImageOp
参考下面的方法试试,调节kernel使用的sharpen数组的维数与值.
离核心越近的值越大,越远的值越小,慢慢的调节这个数组的值,应该会得到你希望的效果

Java code
    // 创建sharp的图像: 查找边界
    // ConvolveOp是最有用的,也是功能最强大的. convolve: 卷积
    public BufferedImage useConvolveOp(BufferedImage src) {
        float[] sharpen = { 
                0.0f, -1.0f, 0.0f, 
                -1.0f, 5.0f, -1.0f, 
                0.0f, -1.0f, 0.0f 
        };
        int kernelWidth = 3;
        int kernelHeight = 3;
        Kernel kernel = new Kernel(kernelWidth, kernelHeight, sharpen);
        ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, new RenderingHints(
            RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR));
        try {
            // 因为convole处理某些使用ImageIO读取的图片会出错
            // 去掉边上的几个像素
            BufferedImage newSrc = ImageUtil.createARGBBufferedImage(src, src.getWidth()
                    + kernelWidth - 1, src.getHeight() + kernelHeight - 1);
            return op.filter(newSrc, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

------解决方案--------------------
上面的算法效果正好和你的要求相反,你把sharpen的数组换成如下面的,就变成了求像素的平均值,边沿柔和
0.1f 0.1f 0.1f
0.1f 0.2f 0.1f
0.1f 0.1f 0.1f

再调节这些值,反正就是他们的和要为1就行了,可以使用4*4, 5*5, ..., 等的数组,应该可以达到你的要求