如何将 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
我的编程经验有限,需要您的帮助。
我现在的情况是我有一堆黑白 .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