我的最终目标是用C ++实现云检测算法。但是,我遇到了一个问题。
我从像素中提取信息时遇到问题。对于数据预处理,使用了SNAP,我可以看到给定像素(经度,纬度,波段值等)的大量信息。
将图像导出为TIFF文件时出现问题。为了解决这个问题,我使用了LibTIFF库。但是,我真的不知道如何提取有关给定像素的特定信息。目前,我在LibTIFF文档中给出了一个标准代码,用于循环遍历图像的所有像素并打印出其值。不幸的是,我得到的价值没有意义。
TIFF* tif = TIFFOpen(filename, "r");
if (tif) {
uint32 imagelength;
double * buf;
tsize_t scanline;
uint32 row;
uint32 i;
tsize_t y;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
scanline = TIFFScanlineSize(tif);
buf = (double *) _TIFFmalloc(scanline);
for (row = 0; row < imagelength; row++) {
int n = TIFFReadScanline(tif, buf, row);
for (y = 0; y < scanline; y++) {
cout << "Row: " << row << " y: " << y << " " << (double) buf[y]
<< endl;
}
}
_TIFFfree(buf);
TIFFClose(tif);
}
所以,我的问题是,是否有一种直接的方法来提取给定像素的特定信息,理想情况下使用LibTIFF?如果没有,最好的方法是什么?如果问题非常基本,我道歉,我找不到任何有关它的信息。提前谢谢。
编辑:输出identify -verbose file.tif
Format: TIFF (Tagged Image File Format)
Mime type: image/tiff
Class: DirectClass
Geometry: 1830x1830+0+0
Resolution: 1x1
Print size: 1830x1830
Units: Undefined
Colorspace: Gray
Type: Grayscale
Endianess: MSB
Depth: 16/8-bit
Channel depth:
Gray: 8-bit
Channel statistics:
Pixels: 3348900
Gray:
min: 0 (0)
max: 13107 (0.2)
mean: 1582.66 (0.0241498)
standard deviation: 1200.55 (0.0183193)
kurtosis: 2.79689
skewness: 1.81966
entropy: 0.63063
Colors: 34
Rendering intent: Undefined
Gamma: 0.454545
Matte color: grey74
Background color: white
Border color: srgb(223,223,223)
Transparent color: none
Interlace: None
Intensity: Undefined
Compose: Over
Page geometry: 1830x1830+0+0
Dispose: Undefined
Iterations: 0
Compression: None
Orientation: TopLeft
Properties:
comment: band2
date:create: 2018-01-09T21:48:10+00:00
date:modify: 2018-01-09T21:48:14+00:00
signature: b3783beb7f7d2bdb32c3c64f8878a02c238a10f221f6a05f93991b26a58a4c78
tiff:alpha: unspecified
tiff:endian: msb
tiff:photometric: min-is-black
tiff:rows-per-strip: 1830
Artifacts:
verbose: true
Tainted: False
Filesize: 49.3701MiB
Number pixels: 3348900
Pixels per second: 3.88504MB
User time: 0.484u
Elapsed time: 0:01.861
答案 0 :(得分:0)
我看过这个并且也很困惑,但也许如果我把我所知道的作为答案的开头,有人比我聪明(@ fmw42也许)可以告诉我们发生了什么。
您的图片是16位灰度。文件中的最大像素值是13,107,其在0-65535的等级上等于0.2或20%意味着所有像素值仅使用可用范围的低20% - 即图像相当暗。这是一个直方图:
如果我用你的程序(即使用libtiff)查看图像的第一行,我看到它在第165列之前是黑色的 - 大概是因为它是卫星图像而地球在扫描时旋转到图像中
我也可以使用ImageMagick查看图像,整个图像可以是文本:
convert image.tif txt:
或者,只是裁掉第一行:
convert image.tif -crop 1830x1+0+0 txt:
当我这样做时,我也看到第一个扫描线中的第一个非黑色像素是165,但它和后续像素与libtiff值不同。 libtiff值位于下图中的左侧,ImageMagick值位于右侧:
我看不出有什么区别 - 这不是一个简单的比例。所以我绘制了由libtiff(绿色)计算的图像的第一条扫描线,并由ImageMagick(紫色)显示:
这里我放大左侧 - 你可以看到它们都从第165栏开始:
在这里我放大了右侧:
它看起来像一个(ImageMagick)具有较低的辐射分辨率(像素亮度的位数较少),因为它更加阶梯状,但有时看起来非常懒惰,并且当它显然可以表示更准确时是完全静态的值。
以下是tiffdump image.tif
image.tif:
Magic: 0x4d4d <big-endian> Version: 0x2a <ClassicTIFF>
Directory 0: offset 10 (0xa) next 0 (0)
ImageWidth (256) LONG (4) 1<1830>
ImageLength (257) LONG (4) 1<1830>
BitsPerSample (258) SHORT (3) 1<16>
Compression (259) SHORT (3) 1<1>
Photometric (262) SHORT (3) 1<1>
ImageDescription (270) ASCII (2) 6<band2\0>
StripOffsets (273) LONG (4) 1<45070554>
SamplesPerPixel (277) SHORT (3) 1<1>
RowsPerStrip (278) LONG (4) 1<1830>
StripByteCounts (279) LONG (4) 1<6697800>
XResolution (282) RATIONAL (5) 1<1>
YResolution (283) RATIONAL (5) 1<1>
PlanarConfig (284) SHORT (3) 1<2>
ResolutionUnit (296) SHORT (3) 1<1>
SampleFormat (339) SHORT (3) 1<1>
34264 (0x85d8) DOUBLE (12) 16<60 0 0 600000 0 -60 0 5.90004e+06 0 0 0 0 0 0 0 1>
34735 (0x87af) SHORT (3) 24<1 1 2 5 1024 0 1 1 1025 0 1 1 1026 34737 22 0 3072 0 1 32629 3073 34737 22 22>
34737 (0x87b1) ASCII (2) 45<WGS 84 / UTM zone 29N|WG ...>
65000 (0xfde8) ASCII (2) 45070067<<?xml version="1.0" enco ...>