【问题标题】:Create polygon of non-transparent parts of image创建图像不透明部分的多边形
【发布时间】:2015-01-31 23:12:12
【问题描述】:

我想要实现的是获取image 的掩码,将其转换为尺寸为(image.getWidth(), image.getHeight()) 的Array,然后获取所有像素并查看它们是否具有0 的alpha 值.

如果他们这样做了,那么:

  • 为我目前正在检查的x, y 坐标添加值1。

否则:

  • 为我目前正在检查的x, y 坐标添加值0。

到目前为止,我知道如何编程。如果您有兴趣,这是我正在使用的代码:

private int[] createMask(BufferedImage image) {

    final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
    final int width = image.getWidth();
    final int height = image.getHeight();
    final boolean hasAlphaChannel = image.getAlphaRaster() != null;

    int[][] result = new int[height][width];
    if (hasAlphaChannel) {
        for (int pixel = 0, row = 0, col = 0; pixel < pixels.length; pixel += 4) {
            int alpha = pixels[pixel];
            if(alpha != 0) {
                result[row][col] = 1;
            } else {
                result[row][col] = 0;
            }

            if (col == width) {
                col = 0;
                row++;
            }
        } 
    }

    return result;
}

在我得到这个面具之后,我试图使用这个Array 通过这个代码或者它的一个替代品来绘制一个Polygon(从http://docs.oracle.com/javase/tutorial/2d/geometry/arbitrary.html 获得):

    int x1Points[] = {0, 100, 0, 100};
    int y1Points[] = {0, 50, 50, 0};
    GeneralPath polygon = 
    new GeneralPath(GeneralPath.WIND_EVEN_ODD,
                    x1Points.length);
    polygon.moveTo(x1Points[0], y1Points[0]);

    for (int index = 1; index < x1Points.length; index++) {
        polygon.lineTo(x1Points[index], y1Points[index]);
    };

    polygon.closePath();
    g2.draw(polygon);

但是,我需要创建一个方法,它可以为我提供由 Point 对象组成的 Array 中的所有坐标,以围绕图像创建一个“蒙版”。

    public Point[] getCords(int[] mask) {
        ArrayList<Point> points = new ArrayList<Point>(); //you can change this to whatever you want to use

        //get coords to surround the mask
        // >> involving `0` (for transparent) and `1` (non transparent) 
        //  >> these are contained in the `mask` Array...

        return points.toArray(new Points[0]);

所以,总结一下:

  • 我需要从包含值1 和0 的int[] 数组中获取一个勾勒出图像可见像素的多边形,前者用于非透明像素,后者用于透明像素,分别。

【问题讨论】:

  • 您的问题有点误导,因为您两次陈述“您要实现的目标”,而这两个实例说明了不同的目标(一个是您开始工作,另一个是实际问题)。
  • @Suseika 抱歉,这实际上是不正确的措辞。我只是在陈述我已经拥有的东西。
  • 没关系,只需编辑您的问题,以便将来有类似问题的人能够欣赏您的问题。

标签: java arrays image polygon


【解决方案1】:

(下面是相关java代码的链接)

要创建蒙版边框,请执行以下操作:对于每对坐标 (x,y),检查其 8 个相邻点中的任何一个是否位于蒙版之外。但是,请记住,生成的蒙版不一定是 1 像素宽,对其进行矢量化可能并不简单,如本例所示(白色是蒙版区域,红色是蒙版内的蒙版边框,黑色是未蒙版区域) :

幸运的是,即使您在遮罩的某些位置获得超过 1 像素的边框,您也可以通过从该遮罩中拒绝遮罩的某些像素来构建可多边形化的子遮罩来解决此问题。下图以蓝色显示子掩码的边框:

我不久前实现了这样的算法。有您可以使用的代码,但它与我的解决方案非常紧密地结合在一起,但是您可以从中找到一些见解:Thick mask border resolution。它的想法是,从初始掩码开始,您通过使用谓词填充原始掩码来构建子掩码,该谓词检查子掩码边界的单元格是否最多有 2 个基本方向邻居(序数方向邻居在这里无关紧要)。

获得蓝色子掩码的边界后,构建一个图,其中顶点是子掩码边界的点,边位于基本相邻点之间。然后遍历该图的每个组件,对于每个组件,您会得到一个构成多边形的点列表。

【讨论】:

  • 看起来和我想要的完全一样!惊人的!当我在我的电脑上时会详细查看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2019-02-10
  • 2012-02-24
  • 1970-01-01
  • 2023-04-03
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多