2

私はプログラミングの経験が限られており、あなたの助けが必要です.

私がいる状況は、xyz 座標とグレースケール値に変換し、それらすべてを 1 つのテキスト ファイルのみにコンパイルする必要がある、白黒の .tiff 画像 (それぞれ 10 Mb の約 400) のスタックがあることです。 x、y、z、グレースケール(z座標、このように:フォルダーの最初の画像z = 0000、2番目の画像0001 ...フォルダー内の画像と同じ数のz座標)。

私はスクリプトを持っています (私はかなり慣れていませんが、Image Magick で行われていると思います)。これは、一度に 1 つの画像に対してのみ実行でき、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グレースケールですべてのファイルを1つにまとめましたが、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 も使用できますが、シェル (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" は空白 1 つだけで区切られており、グレースケールは次のように定義されていると想定していることに注意してください。

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 に答える