RGB 원시 파일을 각 채널당 하나씩 3개의 파일로 분할하시겠습니까?

RGB 원시 파일을 각 채널당 하나씩 3개의 파일로 분할하시겠습니까?

RGB 원시 파일을 각각 빨간색, 녹색 및 파란색 채널이 포함된 3개의 파일로 변환해야 합니다.

답변1

netpbm 도구를 사용해 보셨나요? 이는 R8G8B8 및 기타 8비트 RGB 명령어에 적용됩니다.

너비 100 높이 200 RGB 순차 원시 파일의 경우:

rawtoppm -rgb 100 200 input.rgb > image.ppm
ppmtorgb3 image.ppm 

이제 3가지 pgm형식의 회색조 이미지 파일이 있으며 각각 .red .grn.blu..pgm거의짧은 헤더를 제외한 원시 바이너리 형식은 다음과 같습니다.

tail +4 image.red > image_r.raw
tail +4 image.grn > image_g.raw
tail +4 image.blu > image_b.raw

정말 이런 오리지널 채널을 원한다면. 또는 추가 처리를 위해 다음을 수행합니다.

pgmtoppm red   image.red > image_red.ppm
pgmtoppm green image.grn > image_grn.ppm 
pgmtoppm blue  image.blu > image_blue.ppm

이제 독립적인 RGB 채널인 세 가지 형식 파일이 있습니다 ppm( 참조 rgb3toppm). 예를 들어 다음을 사용하여 ppmtoX다른 형식으로 변환 할 수 있습니다 . 두 번째 매개변수의 색상 대신 ppmtopng" "를 사용하고 각 매개변수는 회색조로 둡니다.white

Imagemagick convert도 유용할 수 있으며 RGB, RGBA 및 16비트 원시 형식도 처리하고 -separate채널 분할 옵션이 있습니다.

for ch in R G B; do
  convert -set colorspace RGB -size 100x200 -depth 8 rgb:image.rgb \
      -channel ${ch} -separate -depth 8 gray:image_${ch}.raw
done

-set colorspace이 옵션이 입력에 적합한지 확인하세요 . 최신 버전에서는 단일 명령으로 이 작업을 수행할 수 있습니다.http://www.imagemagick.org/Usage/color_basics

convert ... -channel RGB -separate gray:image_%d.raw

image_0.raw image_1.raw image_2.rawR/G/B가 파일 에 기록됩니다.


convert도움말과 피드백을 기반으로 명령이 업데이트되었습니다 .스티븐 차제라스, ImageMagic-6.7.7부터 RGB 대신 sRGB를 사용하여 문제를 일으키는 색 공간 동작에 일부 변경이 있었습니다.

  # colorspace changes mean this works differently after ImageMagick-6.7.6
  convert -size 100x200 -depth 8 rgb:image.rgb \
      -channel ${ch} -separate -depth 8 gray:image_${ch}.raw

답변2

ksh93을 사용하면 다음을 수행할 수 있습니다.

command /opt/ast/bin/cut -r3 -Nb1 < file > red
command /opt/ast/bin/cut -r3 -Nb2 < file > green
command /opt/ast/bin/cut -r3 -Nb3 < file > blue

/opt/ast/bin/cut(예, 알고 있습니다. 시스템에 하나도 없지만 ksh93아마도 아직 하나가 내장되어 있을 것입니다.)

그리고 perl:

perl -F -ane '
  BEGIN{
    $/=\3;
    map {open $f[$n++], ">", $_} qw{red green blue}
  }
  for $i (0..2) {print {$f[$i]} $F[$i]}'

표준 Unix 도구만 사용하여 다음을 수행할 수 있습니다.

od -vAn -tu1 < file |
  tr -cs 0-9 '[\n*]' |
  grep . |
  paste - - - |
  awk '{printf "%c", $1 > "red"
        printf "%c", $2 > "green"
        printf "%c", $3 > "blue"}'

그러면 123123123123"파일"이 1111"빨간색", 2222"녹색", 3333"파란색"으로 분리됩니다. 대신 여전히 RGB 파일이지만 다른 색상이 억제된 "빨간색" 파일을 원할 경우 100100100100위의 코드를 조정하여 다른 색상에 대한 추가 NUL 바이트를 출력하거나 ImageMagick 등을 사용할 수 있습니다. 유틸리티 convert:

size=$(wc -c < file)
convert -size "1x$size" -channel GB -fx 0 rgb:- rgb:- < file > red
# ...and so on for green and blue

답변3

채널 분리를 위해 MATLAB을 사용할 수도 있습니다. 이것을 읽어보세요: http://blogs.mathworks.com/steve/2011/03/08/tips-for-reading-a-camera-raw-file-into-matlab/ RAW 데이터를 읽는 방법을 보여줍니다. MATLAB에서 채널을 분리하는 것은 행렬의 특정 요소를 샘플링하는 것만큼 쉽습니다.

관련 정보