터미널을 사용하여 여러 tiff 이미지를 단일 텍스트 파일의 xyz 좌표로 변환하는 방법은 무엇입니까?

터미널을 사용하여 여러 tiff 이미지를 단일 텍스트 파일의 xyz 좌표로 변환하는 방법은 무엇입니까?

저는 프로그래밍과 Linux에 대한 경험이 부족하여 여러분의 도움이 필요합니다.

제가 처한 상황은 xyz 좌표와 회색조 값으로 변환하고 이 모든 이미지를 x ,y,z,회색조를 사용하는 텍스트 파일(z 좌표, 예: 폴더의 첫 번째 이미지 z=0000, 두 번째 이미지 0001... 폴더에 있는 이미지 수만큼의 z 좌표).

나는 이 작업을 수행하지만 한 번에 하나의 이미지에 대해서만 x, y 좌표와 회색조 값만 추가하는 스크립트(매우 익숙하지 않지만 Image Magick으로 완료된 것 같습니다)가 있지만 아니요 지.

스크립트는 다음과 같습니다

TXT 이미지의 정확한 형식은 변환 명령에 의해 정의되며, 가비지 헤더의 경우 '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"는 "4자리 숫자, 0으로 채워짐"을 의미합니다. 즉, 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 

관련 정보