如何使用终端将多个 tiff 图像转换为单个文本文件中的 xyz 坐标?

如何使用终端将多个 tiff 图像转换为单个文本文件中的 xyz 坐标?

我在编程和 Linux 方面的经验有限,我需要你的帮助。

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

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

脚本是:

TXT图像的确切格式由convert命令定义,然后'tail'用于垃圾标题,'tr'用于字符将每个非数字字符替换为单个空格,以便后面的'while'可以读取很容易,丢弃任何可能留下的评论号码。

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 灰度值 1 0 0 灰度值 `

最后一个:

3095 2951 400 灰度值

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

答案1

我会在 ImageMagick 中使用更简单的脚本,然后sed使用输出。问题在于确定您的 Z 图像。

假设 Z=27 处的图像是DCM0027.tif,并且您有从 1 到 420 的图像。

然后您需要根据数字生成文件名,并解析文件本身。为了便于使用,XYZ.txt 文件是增量生成的:

 #!/bin/sh

 rm -f XYZ.txt
 for i in $( seq 1 420 ); do
      FILE=$( printf "DCM%04d.tif" )
      convert -depth 8 -colorspace gray $FILE txt:- \
         | sed -e "s/^\\([0-9]*\\),\\([0-9]*\\):.*gray(\\([0-9]*\\))/\1,\2,$i,\3/g' >> XYZ.txt
 done

以上必须作为脚本运行(保存到 img.sh 等中)。如果需要参数化数字 1 和 420,可以将它们替换为 $1 和 $2。然后你就会跑img.sh 1 420

另一种可能性是重定向脚本本身:

 #!/bin/sh
 for i in $( seq $1 $2 ); do
      FILE=$( printf $3 )
      convert -depth 8 -colorspace gray $FILE txt:- \
         | sed -e "s/^\\([0-9]*\\),\\([0-9]*\\):.*gray(\\([0-9]*\\))/\1,\2,$i,\3/g'
 done

上面需要两个数字文件名结构和保存数据的重定向:

 img.sh 1 500 "DCM%04d.tif" > XYZ.txt

“%04d”表示“四位数字,零填充”。因此,0001、0002、0003。如果数字是 DCM1FILE.tif、DCM9FILE.tif、DCM10FILE.tif 等,则可以使用“DCM%dFILE.tif”作为文件模式。

最后,如果您需要文件夹中 .tif 文件的数量,您可以使用$( ls *.tif | wc -l )(可能存在一些更简单的方法):

 img.sh 1 $( ls DCM*.tif | wc -l) "DCM%04d.tif" > XYZ.txt

答案2

谢谢@Iserni,我感谢你的努力,但我认为我不理解你的脚本。

顺便说一句,最后我解决了这个问题,我将其发布在这里,也许对某人有用。

从一个文件中的 .tiff 灰度到 .txt,带有 z 坐标,如下所示:

x y z Gray (always zero)

要了解一张图片何时结束而另一张图片何时开始,请查看“z”值的变化。编译它:chmod +x ./script.sh然后:

./script.sh>xyzfile.txt

不要忘记文件夹中只有图片和脚本。

#!/bin/bash 
z=0 
for i in pic*; do
 z=$[$z+1] 
convert -depth 8 -colorspace Gray $i 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"
 fi
 done
 done 

相关内容