我在编程和 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