java读取tiff图像的像素值

注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情。
由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久。希望这篇文章能够为正处于此时期的童鞋做些贡献吧。
正文:
首先,需要在maven中添加上geotools的依赖;明确:geotools是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。这个工具包里面包含了我们需要提取像素值的方法,以及获取图像的经纬度等元数据(这个元数据并非指的是拍摄地点等信息)。文章末会附上下载连接和相关教程以及开发文档。
通过getBounds()方法可以获取图像的经纬度范围:

import java.io.File;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.gce.geotiff.GeoTiffReader;
import org.geotools.geometry.Envelope2D;
public class Localtest {

    public static void main(String[] args) throws Exception {
        // String path = "C:\\Users\\86156\\Desktop\\imageio-tiff\\src\\main\\resources\\in\\drifted\\imageio\\Show.tif";
        String path = "E:/aod.tiff";
        GetImageExt(path);
    }

    public static String GetImageExt(String path) {
        String strExtent = "";
        double coverageMinX = 0.000;
        double coverageMaxX = 0.000;
        double coverageMinY = 0.000;
        double coverageMaxY = 0.000;
        try {
            String ImageUrl = path.replace("\\", "\\\\");
            File ImageFile = new File(ImageUrl);
            GeoTiffReader reader = new GeoTiffReader(ImageFile);
            GridCoverage2D coverage = reader.read(null);
            Envelope2D coverageEnvelope = coverage.getEnvelope2D();
            coverageMinX = coverageEnvelope.getBounds().getMinX();
            coverageMaxX = coverageEnvelope.getBounds().getMaxX();
            coverageMinY = coverageEnvelope.getBounds().getMinY();
            coverageMaxY = coverageEnvelope.getBounds().getMaxY();

        } catch (Exception e) {
            // TODO: handle exception
        }
        System.out.println(coverageMinX);
        System.out.println(coverageMaxX);
        System.out.println(coverageMinY);
        System.out.println(coverageMaxY);
        return strExtent;

    }
}

这里得到的是图像的经纬度范围。

通过getSampleFloat(i, j, 0)方法可以获取具体像素位置的像素值,该像素值于在arcgis等gis软件内显示识别的内容一致。

Raster sourceRaster = sourceImage.getData();
        float[] adsaf = {0};
        float[] q = sourceRaster.getPixel(229, 237, adsaf);
        float ibandvalue = sourceRaster.getSampleFloat(88, 88, 0);
        System.out.println(ibandvalue);
        for (int i = 0; i < iwidth; i++) {
            for (int j = 0; j < iheight; j++) {
                if(sourceRaster.getSampleFloat(i, j, 0)!=0)
                    System.out.print("(i=" + i + ",j=" + j + ")"+sourceRaster.getSampleFloat(i, j, 0));
            }
            System.out.println();
        } 

运行结果:
在这里插入图片描述
上面代码我只截取了一部分,如果有需要全部可以站内私信发你,输出结果只显示了非0的,但实际应当根据边界判断去遍历图像,下图是在arcgis中识别的结果。
在这里插入图片描述
至此可以遍历并保存对比了。
下面是geotools和帮助文档的下载链接和提取码
复制这段内容后打开百度网盘手机App,操作更方便哦
链接:https://pan.baidu.com/s/1wPV9rCyVllUTcBrcUeT1qA
提取码:le88

阿里云盘:https://www.aliyundrive.com/s/ob8TPnTxeGZ
如果觉得本文对您有用请点个赞支持一下。

评论 82
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Le05280

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值