plzombie / depress

Program to create djvu from multiple files (using djvulibre)
https://depress.tech/
BSD 2-Clause "Simplified" License
4 stars 1 forks source link

DJVUL? #2

Closed zvezdochiot closed 1 year ago

zvezdochiot commented 1 year ago

Hi @plzombie .

Попробовал перевоять свое "детище" на твой "язык": ImageDjvulThreshold.c.gz

Не знаю взлетит ли у тебя с первого раза, но в моей реализации оно вот такие штуки делает:
djvul

PS: Маски FG и BG и ресайз FG делается отдельно. Смотри также imthreshold-demo.

plzombie commented 1 year ago

Можешь описать, как выхлоп от этой функции запихнуть в csepdjvu? Там только два варианта: фон+передний план+маска или фон+маска. Справка есть здесь https://djvu.sourceforge.net/doc/man/csepdjvu.html Ещё тут http://djvu-soft.narod.ru/scan/low_color_djvu.htm

Я вообще думал сделать следующий алгоритм - пользователь выделяет на изображении иллюстрации (или запускается автоматический алгоритм, который это делает). Затем белый фон с иллюстрацией кодируется как Background. Затем из изображения вырезаются иллюстрации (закрашиваются белым), оно приводится к чб, кодируется как foreground

zvezdochiot commented 1 year ago

@plzombie say:

Можешь описать, как выхлоп от этой функции запихнуть в csepdjvu?

Лови Малоцветное DjVu-кодирование. Это по поводу csepdjvu. А в чём именно вопрос? Про размеры или что? Или как использовать маску?

Но я с чанками горазжо "жёстче" работал, по полной пользуя djvulibre. Смотри Конвертирование djvu в pdf с сохранением сегментации (pdfbeads), скрипты layer из imthreshold и скрипты MFB из imthreshold (используются djvuextract и djvumake).

И наконец. А depressImageApplyDjvulBinarization() взлетела? Я же мог где то и ляпянуть.

@plzombie say:

оно приводится к чб, кодируется как foreground

А почему не noteshrink с кодированием в cpaldjvu (аля DjVu Solo)?

PS: И Binarization как то коряво. Используй общеизвестное Threshold.

plzombie commented 1 year ago

А почему не noteshrink с кодированием в cpaldjvu (аля DjVu Solo)?

Можно с палитрой, можно чб, как угодно. Мне кажется, чб для сканов книг будет предпочтительнее

Лови Малоцветное DjVu-кодирование. Это по поводу csepdjvu. А в чём именно вопрос? Про размеры или что? Или как использовать маску?

Основной вопрос - как в csepdjvu засунуть цветной foreground (не с палитрой), ещё чтобы отдельную маску можно было как-то подать, ещё чтобы разный размер был у foreground и background. Как бы это не вылилось, чтобы пришлось сначала писать свою реализацию csepdjvu

plzombie commented 1 year ago

Не думаю, что barak разберётся в переписке на русском

zvezdochiot commented 1 year ago

@plzombie say:

как в csepdjvu засунуть цветной foreground

Да что ты упёрся в csepdjvu? Ежели хочешь аля DjVu Editor, то пользуй cjb2+c44. После этого дёргай чанки из файлов с помощью djvuextract и компонуй их в djvumake.

Простой пример компоновки можно почерпнуть из мана djvumake:

cjb2 mymask.pbm mymask.djvu
djvumake my.djvu Sjbz=mymask.djvu PPM=myimage.ppm

но там разделение на FG-BG ужасное (это собственно тестовая функция djvumake).

Я пользовал:

djvuextract "mymaks.djvu" Sjbz="mymaks.Sjbz.cnk" # mymask.djvu - cjb2 of B/W
djvuextract "myfg.djvu" BG44="myfg.FG44.cnk" # myfg.djvu - c44 of 1 layer IW4
djvuextract "mybg.djvu" BG44="mybg.BG44.cnk" # mybg.djvu - c44 of 3 layer IW4
djvumake "my.djvu" INFO=,,300 Sjbz="mymaks.Sjbz.cnk" FG44="myfg.FG44.cnk" BG44="mybg.BG44.cnk" # 300 - DPI

PS: Пониманию djvumake может также подсобить djvujpgpack (shell script).

zvezdochiot commented 1 year ago

@plzombie .

Допилил я таки код на базе STB: stb-image-djvul djvul.h.gz

lena

./stbdjvul lena.png lena.mask.png lena.bg.png lena.fg.png
Load: lena.png
image: 512x512:3
BG,FG: 171x171:3
DjVuL... 8 level
Save png: lena.m.png, lena.bg.png, lena.fg.png

bw bg fg

./stbdjvul -c 1 lena.png lena.mask.c1.png lena.bg.c1.png lena.fg.c1.png 
Load: lena.png
image: 512x512:3
BG,FG: 171x171:3
DjVuL... 8 level
Save png: lena.mask.c1.png, lena.bg.c1.png, lena.fg.c1.png.

bw bg fg

zvezdochiot commented 1 year ago

Hi @plzombie .

Дело пошло: DjVuLibre ticket #107.

zvezdochiot commented 1 year ago

Hi @plzombie .

Обнаружил конкретнейший логический ляп. То то я всё думал, что это картинка такая размыленная получается. Теперь всё пучком:

orig -> reсonstruct -> M+BG+FG

zvezdochiot commented 1 year ago

Hi @plzombie .

Добавил демку stb-image-djvul-demo с уже готовыми DjVu-шками и рецептами изготовления. Всё в пределах DjVuLibre и DjVuL. Пример специально в виде картины, потому как на простом изображении текста особенностей не разберёшь.

PS: Сделано всё "топорно", не использована возможность "маски" при кодировании в c44.

plzombie commented 1 year ago

В общем-то сделал, с твоим примером получилось байт-в-байт. Но нужна какая-то настройка качества для c44 ещё, потому что жмёт слишком агрессивно, особенно chroma.

zvezdochiot commented 1 year ago

Hi @plzombie .

Меня беспокоит вопрос цветности. Ежели ImageDjvulThreshold передавать изображения не RGB, а Grey, то будет segment fault. А качество же задаётся параметрами c44, либо slice, либо decibel. Какие параметры slice можно посмотреть с помощью djview в существующих DjVu-шках.

PS: Я наверное доделаю DjVuL с передачей ей channels <= 3.

PS2: Я сделяль :) : https://github.com/ImageProcessing-ElectronicPublications/stb-image-djvul/commit/9e57b5d842e3db733eb41bdac307c98d0105e4b7

PS3: Забыл спросить: c44 пользует pbm-маски для кодирования (важный/неважный пиксель). Стоит валять функцию для генерации масок Bg и Fg на основе основной маски, или сам смогёшь?

zvezdochiot commented 1 year ago

Hi @plzombie .

Михаил, пожайлуста, погляди simpledjvu. Я собственно хочу вырезать из него "кирпичный" алгоритм и вставить DjVuL. Но из-за плюсов у меня отторжение мозга. Не всёк пока, сможет ли "оно" работать с PPM?

plzombie commented 1 year ago

@zvezdochiot Привет. Нет. https://github.com/ImageProcessing-ElectronicPublications/simpledjvu/blob/master/src/normalize.cpp#L52 https://github.com/barak/djvulibre/blob/1a47fd3a6396efcbcba892bb415185ddeb6d3535/libdjvu/GBitmap.h#L86 - здесь используется класс GBitmap из djvulibre, который только для чб и полутоновых. И у тебя там лицензия Unlicense, а в исходниках GNU GPL 3.

Кстати, на счёт djvul. Он под unlicense? Или под zlib? Или там что-то от monday2000 осталось ещё?

zvezdochiot commented 1 year ago

@plzombie say:

Кстати, на счёт djvul. Он под unlicense?

Да. Ежели что, все вопросы к автору, то есть мне. monday2000 не при делах, его алгоритм совсем другой. Под Zlib он попал только в пределах imthreshold, до кучи, так сказать. А насчёт simpledjvu, ежели Mikhail Dektyarev возразит, то сменю, а ежели нет, то всё пучком. PR я ему уже отправил.

@plzombie say:

здесь используется класс GBitmap

А какой класс использует PPM? c44 ковырять? Случайно не #include "GPixmap.h"? Всё. Нашёл. https://github.com/barak/djvulibre/blob/1a47fd3a6396efcbcba892bb415185ddeb6d3535/tools/c44.cpp#L757-L758 Буду кумекать.

plzombie commented 1 year ago

А какой класс использует PPM? c44 ковырять?

GPixmap

zvezdochiot commented 1 year ago

@plzombie say:

который только для чб и полутоновых.

Больше трёпу, чем делу. Вот вам ответ от дилетанта и любителя: mfbdjvu.

zvezdochiot commented 1 year ago

@plzombie say:

Можешь описать, как выхлоп от этой функции запихнуть в csepdjvu?

Присмотревшись, я понял, что для некоторых изображений более выгоден csepdjvu. Уж не "сделать" ли мне "его" на базе DjVuL? У меня есть маска (по маске я всегда могу отбелить фон), есть reconstruct (я могу восстановить исходный размер FG, после чего отбелить фон). Единственное что не хватает - KMeans, но он есть у меня в noteshrink. Вот только DjVuL для создания маски в данном случае слабо подходит, но у меня есть Sauvola. "Смотрю я на всё это и вижу" достаточно геморойненько всё "звучит", но ежели надо, то я могу "постараться" и для "этого" варианта сегментации изображения.

Такие вот дела. Сам себя читаю и уже ничего делать не хочу.