当前位置: 代码迷 >> J2SE >> [图像生成算法]图中所示效果怎么实现
  详细解决方案

[图像生成算法]图中所示效果怎么实现

热度:87   发布时间:2016-04-24 02:31:10.0
[图像生成算法]图中所示效果如何实现
现在可以做出来的效果是第一幅图,采用的是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, ..., 等的数组,应该可以达到你的要求
  相关解决方案