LINUX.ORG.RU

Djvu & imagemagick & «смешанный» вид кодирования (продолжение)

 ,


0

2

В посте Djvu кодирование сканов & imagemagick я привёл пример скрипта для «смешанного» кодирования изображения в djvu. В этом скрипте процесс составления «смешанного» djvu был разложен по полочкам, в виде определённой схемы (JB+FG+BG=DjVu). Приводимые в данном посте скрипты нацелены не на детальность схемы, а на улучшение показателя «качество/размер» результата кодирования.

Первый скрипт использует imagemagick. Для построения маски в нём используется «серое» (в градациях серого) изображение от оригинала и применяется несколько фитч:

  1. выравнивание яркости «серого» изображения и оригинала;
  2. выравнивание «серого» фона второй степени;
  3. усиление «серых» контуров;
  4. уменьшение шума в «сером» изображении.
cat djvu-2cc.sh

#!/bin/bash

if [ -z "$1" ]
then
	echo "USAGE: bash $0 images [dpi=300]"
	exit 1
else
	src="$1"
fi
if [ -z "$2" ]
then
	tdpi="300"
else
	tdpi="$2"
fi
ttmp="/tmp/djvu-colors-$$"

convert -verbose "$src" "$ttmp.a.ppm"
tdim=`identify "$ttmp.a.ppm" | awk '{ print $3 }'`
convert -negate "$ttmp.a.ppm" "$ttmp.a.pgm"
convert "$ttmp.a.ppm" "$ttmp.b.pgm"
convert -negate "$ttmp.a.pgm" "$ttmp.c.pgm"
convert "$ttmp.b.pgm" "$ttmp.c.pgm" -average "$ttmp.a.pgm"
rm -f "$ttmp.b.pgm" "$ttmp.c.pgm"

convert -filter Gaussian -resize 1x1! -resize "$tdim"! "$ttmp.a.pgm" "$ttmp.d1.pgm"
convert -filter Gaussian -resize 2x2! -resize "$tdim"! "$ttmp.a.pgm" "$ttmp.d2.pgm"
composite -compose minus "$ttmp.d1.pgm" "$ttmp.d2.pgm" "$ttmp.c.pgm"
composite -compose minus "$ttmp.d2.pgm" "$ttmp.d1.pgm" "$ttmp.d.pgm"
rm -f "$ttmp.d1.pgm" "$ttmp.d2.pgm"
composite -compose minus "$ttmp.a.pgm" "$ttmp.c.pgm" "$ttmp.e.pgm"
composite -compose plus "$ttmp.e.pgm" "$ttmp.d.pgm" "$ttmp.a.pgm"
rm -f "$ttmp.c.pgm" "$ttmp.d.pgm" "$ttmp.e.pgm"
convert -filter Gaussian -resize 16.6666666667% -resize "$tdim"! "$ttmp.a.pgm" "$ttmp.b.pgm"
composite -compose minus "$ttmp.a.pgm" "$ttmp.b.pgm" "$ttmp.c.pgm"
composite -compose minus "$ttmp.b.pgm" "$ttmp.a.pgm" "$ttmp.d.pgm"
rm -f "$ttmp.b.pgm"
composite -compose plus "$ttmp.a.pgm" "$ttmp.c.pgm" "$ttmp.e.pgm"
composite -compose minus "$ttmp.e.pgm" "$ttmp.d.pgm" "$ttmp.a.pgm"
composite -compose plus "$ttmp.a.pgm" "$ttmp.c.pgm" "$ttmp.e.pgm"
composite -compose minus "$ttmp.e.pgm" "$ttmp.d.pgm" "$ttmp.a.pgm"
rm -f "$ttmp.c.pgm" "$ttmp.d.pgm" "$ttmp.e.pgm"
convert -despeckle -despeckle "$ttmp.a.pgm" "$ttmp.b.pgm"
convert -despeckle -despeckle "$ttmp.b.pgm" "$ttmp.a.pgm"
rm -f "$ttmp.b.pgm"

convert +dither -colors 2 -normalize "$ttmp.a.pgm" "$ttmp.m.pbm"
rm -f "$ttmp.a.pgm"

cjb2 -clean -dpi "$tdpi" "$ttmp.m.pbm" "$ttmp.m.djvu"
ls -l "$ttmp.m.djvu"
djvumake "$src.djvu" INFO=,,"$tdpi" Sjbz="$ttmp.m.djvu" PPM="$ttmp.a.ppm"
ls -l "$src.djvu"
rm -f "$ttmp.a.ppm"
rm -f "$ttmp.m.pbm"
rm -f "$ttmp.m.djvu"
echo ""

Этот скрипт хорошо работает на обычных изображениях страниц, но не на больших изображениях (чертежах). Imagemagick не справляется с изображениями 20000x10000. Для таких чертежей остается использовать упрощённую схему с использованием netpbm.

cat djvu-pnm-n.sh

#!/bin/bash

if [ -z "$1" ]
then
	echo "USAGE: bash $0 images [dpi=300]"
	exit 1
else
	src="$1"
fi
if [ -z "$2" ]
then
	tdpi="300"
else
	tdpi="$2"
fi
ttmp="/tmp/djvu-colors-$$"

anytopnm "$src" > "$ttmp.a.ppm"
ppmtopgm  "$ttmp.a.ppm" | pnmnorm | pgmtopbm -threshold -value 0.499 > "$ttmp.m.pbm"

cjb2 -clean -dpi "$tdpi" "$ttmp.m.pbm" "$ttmp.m.djvu"
ls -l "$ttmp.m.djvu"
djvumake "$src.djvu" INFO=,,"$tdpi" Sjbz="$ttmp.m.djvu" PPM="$ttmp.a.ppm"
ls -l "$src.djvu"
rm -f "$ttmp.a.ppm"
rm -f "$ttmp.m.pbm"
rm -f "$ttmp.m.djvu"
echo ""

Последний скрипт хорошо работает только на чертежах в градациях серого.

Deleted

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.