获取图片像素点

本文通过两种方法获取图片的像素点,方法1通过java自带的API,方法2通过OpenCV的API。

1.Java自带API获取像素点

函数声明:

//获取当前像素rgb,其中x代表横坐标(横着的,对应于width)
public int getRGB(int x,int y)

//r、g、b能从color中获取
Color color = new Color(img.getRGB(j, i));

当进行两层循环时,getRGB的参数需要反着写,具体看下面

使用:

BufferedImage img = ImageIO.read(new File("C:\\Users\\***.jpg"));

for (int i = 0; i < height; i++) {//行
    for (int j = 0; j < width; j++) {//列
    
      	Color color = new Color(img.getRGB(j, i)); //反着写,列对应值x轴
        int red = color.getRed();
        int green = color.getGreen();
        int blue = color.getBlue();
        System.out.println("["+i+","+j + "]:(" + red + "," + green + "," + blue + ")");
     }
}

2.opencv获取像素点

函数声明

public double[] get(int row,int col)
//Mat中的方法,获取该点的像素点,
//返回值是一个数组,顺序是B、G、R,是反着的
//ans[0]代表blue值,ans[1]代表green,ans[2]代表red

使用:

Mat img = Imgcodecs.imread("C:\\***.jpg");

for (int i = 0; i < size.height; i++) {
    for (int j = 0; j < size.width; j++) {
        double[] rgb = img.get(i, j);
        System.out.println("["+i+","+j + "]:(" + rgb[2] + "," + rgb[1] + "," + rgb[0] + ")");
    }
}

例子

  • 使用OpenCV获取所有像素点
@Test
    public void sad() {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat img = Imgcodecs.imread("C:\\Users\\Administrator\\Desktop\\w21005s1.jpg");

        img = img.submat(300, 305, 300, 303);//5*3

        Size size = img.size();
        System.out.println(size.height);
        System.out.println(size.width);

        int cnt = 0;
        for (int i = 0; i < size.height; i++) {
            for (int j = 0; j < size.width; j++) {
                double[] rgb = img.get(i, j);
                if (cnt<200)
                    System.out.println("["+i+","+j + "]:(" + rgb[2] + "," + rgb[1] + "," + rgb[0] + ")");
                cnt++;
            }
        }

        System.out.println(cnt);
   }
  • 使用ImageIO获取所有像素点
@Test
    public void ad() throws IOException {
        BufferedImage img = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\w21005s1.jpg"));
        img = img.getSubimage(300,300,3,5);//5*3
        int height = img.getHeight();
        int width = img.getWidth();

        System.out.println(height);//5
        System.out.println(width);//3

        int cnt = 0;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {

                Color color = new Color(img.getRGB(j, i));//getRGB(int x,int y) 其中x坐标代表width
                int red = color.getRed();
                int green = color.getGreen();
                int blue = color.getBlue();

                if (cnt < 200)
                    System.out.println("["+i+","+j + "]:(" + red + "," + green + "," + blue + ")");

                cnt++;
            }
        }
        System.out.println(cnt);
    }

风格对比

  • 参数风格
    他们的参数正好是反着的,行对应的是y轴,列对应的是x轴,所以在使用的时候要略微注意不同
  • opencv的参数风格是:行,列。
  • 而Java原生的参数风格是:x轴,y轴。
  • opencv获取RGB时的顺序是B、G、R,是反着的
double[] rgb = img.get(i, j);

rgb[0]代表blue,rgb[2]代表red

未完待续

操作像素点,可以做有意思的功能,比如,一台相机固定于一个地点,每天中午12:00拍摄一张照片,那么经过一年的拍摄,共能拍摄365或者366张图片,每张图片取最中间的四列像素,这样按照拍摄时间排序,就能够组成一张年度照片,该年度照片记录了这一个地点的中间位置一年的变化情况。

就像这样

java image获取像素 java获取图片像素_像素点