添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

注意:读取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
如果觉得本文对您有用请点个赞支持一下。

注意:读取tiff图像的像素值,并非rgb,这是GIS方向的同学应当明晓的事情。由于本人之前糊里糊涂的将tiff图像的rgb值作为了像素值来读取,白折腾很久很久。希望这篇文章能够为正处于此时期的童鞋做些贡献吧。正文:首先,需要在maven中添加上geotools的依赖;明确:geotools是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。这个工具包里面包含了我们需要提取像素值的方法,以及获取图像的经纬度等元数据(这个元数据并非指的是拍摄地点等信息)。文章末会附上下载连接和
从前面的文字中就可以看出,对数字图像的处理都是在像素级上操作的,准确地讲是操作像素点的RGB值,在图像取反和灰度图像转换两篇中已经涉及到了对RGB操作的相关代码,相信大家已经也看到了,就是这一段:for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { int p = image.getRGB(i
TIFF Java 标记图像文件格式库 是由与合作。 政府拥有“无限权利”,并且正在发布此软件,以通过为开发人员提供向新方向发展的机会来增加政府投资的影响。 中规定了软件的使用,修改和分发权。 如果您想为这个项目做贡献,请提出请求。 我们将审核拉取请求并讨论更改。 该项目的所有请求请求贡献将根据MIT许可证发布。 先前根据开放源代码许可证发布,然后由NGA员工进行修改的软件源代码被视为“联合作品”(请参见17 USC§101); 它具有部分版权,部分公共领域,并且总体上受非政府作者的版权保护,并且必须根据原始开源许可证的条款进行发布。 是用于读取和写入“标记图像文件格式”文件的Java库。 它主要是为了向Android应用程序提供许可友好的TIFF功能而创建的。 实现基于和以下JavaScript实现: : 查看最新的 // File input = ...
public static void getPicArrayData(String path){ BufferedImage bimg = ImageIO.read(new File(path)); int [][] data = new int[bimg.getWidth()][bimg.getHeight()]; for(int i=0;i<bimg.getWidth(); // 锁定位图数据,获取像素值 BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format16bppGrayScale); // 获取像素值的字节数 int stride = bitmapData.Stride; int bytesPerPixel = stride / width; // 定义一个二维数组存储像素值 ushort[,] pixels = new ushort[height, width]; // 逐行读取像素值 unsafe byte* p = (byte*)bitmapData.Scan0; for (int y = 0; y < height; y++) for (int x = 0; x < width; x++) // 获取当前像素的指针 ushort* pixelPtr = (ushort*)(p + y * stride + x * bytesPerPixel); // 获取像素值 ushort pixelValue = *pixelPtr; // 存储像素值 pixels[y, x] = pixelValue; // 解锁位图数据 bitmap.UnlockBits(bitmapData); 上述代码使用LockBits方法锁定位图数据,获取像素值之后再使用UnlockBits方法解锁位图数据。在获取像素值时,使用了指针操作来提高效率。注意,由于C#中的多维数组是按行存储的,因此在存储像素值时,需要按照[y, x]的顺序存储。