Разделяя файл сырых данных RGB на 3 файла, один для каждого канала?

Который cp Вы используете? Инструменты UNIX являются видом подобных среди различных систем, но могут вести себя по-другому в некоторых ситуациях.

GNU cp имеет поведение, которое Вы хотите. BSD cp имеет поведение, которое Вы описываете. Попытайтесь удалить наклонную черту с первого аргумента и записать:

cp -R /parentFolder/folder2 /parentFolder/folder1/folder1.1

вместо:

cp -R /parentFolder/folder2/ /parentFolder/folder1/folder1.1

Согласно Википедии (1), это то, как BSD cp делает то, что Вы хотите.

2
20.11.2018, 22:30
3 ответа

Вы попробовали 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

Вы теперь имеете три ppmфайлы формата, которые являются разделенными каналами RGB (см. также rgb3toppm). Они могут быть преобразованием в другое использование форматов ppmtoX, например. ppmtopng. Используйте"white"вместо цвета в 2-м параметре для отъезда каждого как шкалы полутонов.

Imagemagick convert может также быть также полезным, это обработает RGB, RGBA и 16-разрядные форматы .raw также, и это имеет a -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

и R/G/B будет записан в image_0.raw image_1.raw image_2.raw файлы


Примечание, convert команда была обновлена на основе справки и обратной связи от Stephane Chazelas, было несколько изменений в поведении цветового пространства от ImageMagic-6.7.7, которые вызывают проблемы из-за (я верю), sRGB используемый вместо RGB.
  # 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
4
27.01.2020, 22:01
  • 1
    echo -n '\x40\x50\x60' | convert -size 1x1 -depth 8 rgb:- -channel R -separate -depth 8 gray:- | od -An -tx1 дает мне 0xd вместо 0x40. –  Stéphane Chazelas 22.02.2013, 14:06
  • 2
    Попытайтесь использовать printf вместо echo, это работает на меня. –  mr.spuratic 22.02.2013, 14:09
  • 3
    echo -n '\x40\x50\x60' действительно производит три байта 0x40, 0x50 и 0x60 в моей оболочке (zsh), но тем не менее, преобразуйте выводы один 0xd байт. Я только что протестировал с последней версией, выпущенной три дня назад. Это производит 0x40 для Вас? Отметьте это при преобразовании в rgb:- вместо gray:-, Я действительно вижу 0x40 0x40 0x40 как ожидалось. –  Stéphane Chazelas 22.02.2013, 14:32
  • 4
    Это работает, если я добавляю -set colorspace RGB (или -set colorspace Gray для этого вопросы) и изменение -channel R -separate кому: -fx r. –  Stéphane Chazelas 22.02.2013, 14:39
  • 5
    6.2.2 и 6.3.2 обе работы как ожидалось, позвольте мне создать 6.8.3-3... –  mr.spuratic 22.02.2013, 14:51

С 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"}'

Они разделили бы a 123123123123 "файл" в a 1111 "красный", 2222 "зеленый" и 3333 "синий". Если вместо этого Вы хотите "красный" файл, который имеет 100100100100, это - все еще файл RGB, но где другие цвета были подавлены, необходимо будет адаптировать код выше для вывода дополнительных байтов 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
0
27.01.2020, 22:01

Можно также сделать использование разделения каналов MATLAB. Чтение это: http://blogs.mathworks.com/steve/2011/03/08/tips-for-reading-a-camera-raw-file-into-matlab/, который это показывает, как считать Необработанные данные. Разделение каналов в MATLAB легко, как выборка некоторых элементов в матрице.

0
27.01.2020, 22:01

Теги

Похожие вопросы