如何将 tiff 图像编译成单个文本文件中的 xyz 坐标?

How to compile tiff images into xyz coordinates in a single text file?

我的编程经验有限,需要您的帮助。

我现在的情况是我有一堆黑白 .tiff 图像(大约 400 张,每张 10 Mb),我需要将其转换为 xyz 坐标和灰度值并编译所有这些只有一个带有 x、y、z、灰度的文本文件(z 坐标,这样:文件夹的第一张图像 z=0000,第二张图像 0001...与文件夹中的图像一样多的 z 坐标)。

我有一个脚本(我很不熟悉,但我认为它是用 Image Magick 完成的)可以做到这一点,但一次只能用于一个图像,并且只添加 x、y 坐标和一个灰度值,但没有 z。

根据我在此处发布的先前版本修改的脚本(因为现在它使用灰度并仅存储我需要的值)是:

## The exact format of the TXT image is defined by the convert command, then 'tail' is used to junk the header, 
## 'tr' to character replace every non-number character with a single space, so that the later 'while' can read 
## it easily, junking any comment numbers that may have been left.

convert -depth 8 -colorspace RGB  txt:- |
    tail -n +2 | tr -cs '0-9.\n'  ' ' |
    while read x y Gray junk; 
    do
    if [ "$Gray" -eq 0 ]; then
        echo "$x,$y $Gray"
        done

到运行我把它放在linux终端:

chmod +x img.sh

之后(我选择了与图片相同的名称,但文件名是 .txt):

./img.sh pic0000.tif > pic0000.txt

我还尝试将其更改为一次完成所有操作,替换了以下行:

convert -depth 8 -colorspace RGB  txt:- |

convert -depth 8 -colorspace RGB $* txt:- |

并将其放入终端

chmod +x ./img.sh
./img.sh *.tif > *.txt

现在它使用 x y 灰度将所有文件放在一个文件中,但我无法添加 z 值。

顺便说一句,创建txt文件需要很长时间。

最终 XYZ 文件的第一行必须是,例如:

0 0 0 value in greyscale 
1 0 0 value in greyscale
...
and the last: 
3095 2951 400 value in greyscale

你能给我任何线索、想法或解决方案吗?任何帮助将不胜感激。

虽然也可以使用 Fortran,但 shell (bash) 脚本可以直接执行此操作。例如,假设 "conv.sh" 有以下

allout="alldata.out"   # name of a combined XYZ file
[ -f $allout ] && rm -i $allout

for inpfile in image*.txt ; do

    echo "processing $inpfile"
    z=$( echo $inpfile | sed -e 's/image\([0-9]*\)\.txt//' )
    echo "z = $z"

    outfile=data${z}.out    # name of each XYZ file

    awk -F'[, ]' -v z=$z '{ printf( "%5d,%5d,%5d %16.6f\n", , , z, 0.2989 *  + 0.5870 *  + 0.1140 *  ) }' $inpfile > $outfile

    cat $outfile >> $allout
done

我们运行它在数据文件(image*.txt)所在的目录中:

$ chmod +x ./conv.sh
$ ./conv.sh

然后我们获得一组输出文件 (data0000.out, ..., data0400.out) 加上它们的组合文件 (alldata.out)。请注意,我假设输入文件中的 "x,y" 和 "r,g,b" 仅由一个空格分隔,并且灰度定义为

0.2989 * R + 0.5870 * G + 0.1140 * B

但是定义似乎不是唯一的(例如Wiki page显示0.2126 * R + 0.7152 * G + 0.0722 * B)所以请选择你想要的定义。


编辑:您也可以使用 for 循环直接添加 z 值,如下所示:

output="output.txt"
rm -f $output   # combined XYZ file

for (( z=0 ; z <= 400; z++ )); do
    inpfile=pic${z}.tif
    convert -depth 8 -colorspace RGB $inpfile txt:- | tail -n +2 | tr -cs '0-9.\n' ' ' | while read x y Gray junk; do if [ "$Gray" -eq 0 ]; then echo "$x,$y,$z $Gray" done >> $output
done

如果输入名称类似于 "pic0000.tif" 到 "pic0400.tif",您可能需要在 z 值前面填充零,例如,

for (( z=0 ; z <= 400; z++ )); do

    if (( z < 10 ))   ; then n=000$z ; fi
    if (( z < 100 ))  ; then n=00$z  ; fi
    if (( z < 1000 )) ; then n=0$z   ; fi

    inpfile=pic${n}.tif    # "n" is the file index from 0000 to 0400

    convert ....  # same as above
done