2

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

我所处的情况是我有一堆黑白 .tiff 图像(每个 10 Mb 大约 400 个),我需要将其转换为 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 $1 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 $1 txt:- |

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

并将其放入终端

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

现在它将所有文件与 xy 灰度放在一起,但我无法添加 z 值。

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

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

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

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

4

1 回答 1

2

虽然也可以使用 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/\1/' )
    echo "z = $z"

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

    awk -F'[, ]' -v z=$z '{ printf( "%5d,%5d,%5d %16.6f\n", $1, $2, z, 0.2989 * $3 + 0.5870 * $4 + 0.1140 * $5 ) }' $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 页面显示 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
于 2015-09-10T17:18:56.577 回答