栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【图像处理】获取图片像素点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【图像处理】获取图片像素点

获取图片像素点

本文通过两种方法获取图片的像素点,方法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张图片,每张图片取最中间的四列像素,这样按照拍摄时间排序,就能够组成一张年度照片,该年度照片记录了这一个地点的中间位置一年的变化情况。
就像这样

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号