读取JPEG图像并计算图像坐标

时间:2021-09-17 16:57:52

I want to read in a JPEG image with a uniform gray background with several colored balls on it of the same size. I want a program which can take this image and record the coordinates of each ball. What's the best way to do this?

我想要读取具有均匀灰色背景的JPEG图像,其上有几个相同大小的彩球。我想要一个程序,可以拍摄这个图像并记录每个球的坐标。最好的方法是什么?

2 个解决方案

#1


I agree with James. I used the following program once to find red boxes in an image (before most of the red boxes were recolored by the community):

我同意詹姆斯的观点。我使用以下程序一次在图像中找到红色框(在大多数红色框被社区重新着色之前):

/**
 * @author karnokd, 2008.11.07.
 * @version $Revision 1.0$
 */
public class RedLocator {
    public static class Rect {
        int x;
        int y;
        int x2;
        int y2;
    }
    static List<Rect> rects = new LinkedList<Rect>();
    static boolean checkRect(int x, int y) {
        for (Rect r : rects) {
            if (x >= r.x && x <= r.x2 && y >= r.y && y <= r.y2) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("fallout3worldmapfull.png"));
        for (int y = 0; y < image.getHeight(); y++) {
            for (int x = 0; x < image.getWidth(); x++) {
                int c = image.getRGB(x,y);
                int  red = (c & 0x00ff0000) >> 16;
                int  green = (c & 0x0000ff00) >> 8;
                int  blue = c & 0x000000ff;
                // check red-ness
                if (red > 180 && green < 30 && blue < 30) {
                    if (!checkRect(x, y)) {
                        int tmpx = x;
                        int tmpy = y;
                        while (red > 180 && green < 30 && blue < 30) {
                            c = image.getRGB(tmpx++,tmpy);
                            red = (c & 0x00ff0000) >> 16;
                            green = (c & 0x0000ff00) >> 8;
                            blue = c & 0x000000ff;
                        }
                        tmpx -= 2;
                        c = image.getRGB(tmpx,tmpy);
                        red = (c & 0x00ff0000) >> 16;
                        green = (c & 0x0000ff00) >> 8;
                        blue = c & 0x000000ff;
                        while (red > 180 && green < 30 && blue < 30) {
                            c = image.getRGB(tmpx,tmpy++);
                            red = (c & 0x00ff0000) >> 16;
                            green = (c & 0x0000ff00) >> 8;
                            blue = c & 0x000000ff;
                        }
                        Rect r = new Rect();
                        r.x = x;
                        r.y = y;
                        r.x2 = tmpx;
                        r.y2 = tmpy - 2;
                        rects.add(r);
                    }
                }
            }
        }
    }
}

Might give you some hints. The image originates from here.

可能会给你一些提示。图像来自这里。

#2


You can use the ImageIO library to read in an image by using one of the read() methods. This produces a BufferedImage which you can analyze for the separate colors. getRGB() is probably the best way to do this. You can compare this to the getRGB() of a Color object if you need to. That should be enough to get you started.

您可以使用ImageIO库通过其中一个read()方法读入图像。这会生成一个BufferedImage,您可以分析其中的单独颜色。 getRGB()可能是最好的方法。如果需要,可以将其与Color对象的getRGB()进行比较。这应该足以让你开始。

#1


I agree with James. I used the following program once to find red boxes in an image (before most of the red boxes were recolored by the community):

我同意詹姆斯的观点。我使用以下程序一次在图像中找到红色框(在大多数红色框被社区重新着色之前):

/**
 * @author karnokd, 2008.11.07.
 * @version $Revision 1.0$
 */
public class RedLocator {
    public static class Rect {
        int x;
        int y;
        int x2;
        int y2;
    }
    static List<Rect> rects = new LinkedList<Rect>();
    static boolean checkRect(int x, int y) {
        for (Rect r : rects) {
            if (x >= r.x && x <= r.x2 && y >= r.y && y <= r.y2) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) throws Exception {
        BufferedImage image = ImageIO.read(new File("fallout3worldmapfull.png"));
        for (int y = 0; y < image.getHeight(); y++) {
            for (int x = 0; x < image.getWidth(); x++) {
                int c = image.getRGB(x,y);
                int  red = (c & 0x00ff0000) >> 16;
                int  green = (c & 0x0000ff00) >> 8;
                int  blue = c & 0x000000ff;
                // check red-ness
                if (red > 180 && green < 30 && blue < 30) {
                    if (!checkRect(x, y)) {
                        int tmpx = x;
                        int tmpy = y;
                        while (red > 180 && green < 30 && blue < 30) {
                            c = image.getRGB(tmpx++,tmpy);
                            red = (c & 0x00ff0000) >> 16;
                            green = (c & 0x0000ff00) >> 8;
                            blue = c & 0x000000ff;
                        }
                        tmpx -= 2;
                        c = image.getRGB(tmpx,tmpy);
                        red = (c & 0x00ff0000) >> 16;
                        green = (c & 0x0000ff00) >> 8;
                        blue = c & 0x000000ff;
                        while (red > 180 && green < 30 && blue < 30) {
                            c = image.getRGB(tmpx,tmpy++);
                            red = (c & 0x00ff0000) >> 16;
                            green = (c & 0x0000ff00) >> 8;
                            blue = c & 0x000000ff;
                        }
                        Rect r = new Rect();
                        r.x = x;
                        r.y = y;
                        r.x2 = tmpx;
                        r.y2 = tmpy - 2;
                        rects.add(r);
                    }
                }
            }
        }
    }
}

Might give you some hints. The image originates from here.

可能会给你一些提示。图像来自这里。

#2


You can use the ImageIO library to read in an image by using one of the read() methods. This produces a BufferedImage which you can analyze for the separate colors. getRGB() is probably the best way to do this. You can compare this to the getRGB() of a Color object if you need to. That should be enough to get you started.

您可以使用ImageIO库通过其中一个read()方法读入图像。这会生成一个BufferedImage,您可以分析其中的单独颜色。 getRGB()可能是最好的方法。如果需要,可以将其与Color对象的getRGB()进行比较。这应该足以让你开始。