ImageProcessing-ElectronicPublications / scantailor-experimental

Scan Tailor Experimental is an interactive post-processing tool for scanned pages.
https://github.com/Tulon/scantailor/tree/experimental
GNU General Public License v3.0
30 stars 0 forks source link

Feature: Amount of curvature in CylindricalSurfaceDewarper. #15

Closed zvezdochiot closed 1 month ago

zvezdochiot commented 8 months ago

Hi all.

It is possible to adjust the curvature of intermediate lines in CylindricalSurfaceDewarper.: https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/dewarping/CylindricalSurfaceDewarper.cpp#L130-L132 to:

    double const img_directrix12f_proj = (1.0 - pln_straight_line_y) * img_directrix1_proj
                                       + pln_straight_line_y * img_directrix2_proj;
    double const img_directrix12fa_proj = (img_directrix12f_proj - pln_straight_line_y) * m_amountCurve
                                        + pln_straight_line_y;
    QPointF const img_straight_line_pt(toPoint(m_pln2img(Vector2d(pln_x, img_directrix12fa_proj))));

and: https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/dewarping/CylindricalSurfaceDewarper.cpp#L173-L175 to:

    double const img_directrix12f_proj = (1.0 - pln_straight_line_y) * img_directrix1_proj
                                       + pln_straight_line_y * img_directrix2_proj;
    double const img_directrix12fa_proj = (img_directrix12f_proj - pln_straight_line_y) * m_amountCurve
                                        + pln_straight_line_y;
    QPointF const img_straight_line_pt(toPoint(m_pln2img(Vector2d(pln_x, img_directrix12fa_proj))));

Дальше по-русски:

Использовал уже существующий механизм: https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/dewarping/DepthPerception.h#L31 сделал ещё один объект этого класса и протащил его до: https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/filters/deskew/OptionsWidget.h#L78-L80

Только вот небольшая засада - не обновляется сетка при движениях пользунка, в отличии от "Восприятия глубины". При этом сам параметр меняется. Ежели перелистнуть на другую страницу и вернуться, то изменения кривизны промежуточных линий происходят. Но это же никуда не годится, для работы надо видеть изменения сетки во время регулировки ползунка.

Такие вот дела, такая вот напасть.

plzombie commented 8 months ago

@zvezdochiot

А вот этот вот код куда-нибудь вставил?

emit reloadRequested();
emit invalidateThumbnail(m_pageId);

При изменении значения слайдера надо добавить, я так понимаю. Может только первой строчки должно быть достаточно, надо смотреть

zvezdochiot commented 8 months ago

@plzombie .

Как куда? В OptionsWidget.cpp, в функции событий ползунка. Только я ж говорю, значения то меняются, а вот как заставить сетку перестроится, как это происходит в "Восприятии глубины" - это осталось для меня тайной.

plzombie commented 8 months ago

А это тоже добавлял?

double const depth_perception = m_pageParams.dewarpingParams().depthPerception();
emit depthPerceptionSetByUser(depth_perception);

Оно там внутри обновляет изображение https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/filters/deskew/Task.cpp#L843 https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/filters/deskew/DewarpingView.cpp#L249

zvezdochiot commented 8 months ago

@plzombie , да я пытался про-grep-ить depthPerceptionSetByUser. Обломился. Не понимаю я этой магии. Поэтому тупо копировал всё с depthPerception.

plzombie commented 8 months ago

@zvezdochiot просто со старым значением попробуй вызвать

zvezdochiot commented 8 months ago

@plzombie , так всё работает, за исключением интерактивности. Перелистнул на другую страницу, вернулся обратно - вуаля! Только как с таким работать то?

plzombie commented 8 months ago

@zvezdochiot Надо в https://github.com/ImageProcessing-ElectronicPublications/scantailor-experimental/blob/d9edb7019b5d0750146d1649d4f865586b3433c3/src/filters/deskew/DewarpingView.cpp#L249 на update(); точку остановки поставить и посмотреть, куда там проваливается дальше. Почему не перерисовывается DewarpingView Или поставить точку остановки в DewarpingView::onPaint и посмотреть, откуда она вызывается, при каких условиях

zvezdochiot commented 8 months ago

@plzombie , понял тебя. Как будет настроение, попробую "ковырнуть замазку". Правда я по большей части такие "трюки" через qDebug() делаю. Но у всех свои замашки.

noobie-iv commented 8 months ago

Деварп тут хорош, да не очень 😄. Первое, что в нем надо починить - пропрорции.

Одни страницы он делает широкими (плющит):

Bug-Wide

Другие страницы делает узкими (колбасит):

Bug-Narrow

zvezdochiot commented 8 months ago

@noobie-iv say:

надо починить

:information_source: Починить или поломать? Как ни странно все эти "эффекты" укладываются в единную мат. модель. Ломать эту модель совсем не стоит. А вот компенсировать эти "эффекты" можно, но только дополнительной отдельной мат. моделью: дополнительными множителями масштабных компонент трансформации (возможно задаваемых вручную) по X и Y. Но это уже строго за пределами данных алгоритмов: это уже строго отдельно.

:question: И самое важное: А что взамен? Что то я не наблюдаю ни разу этого самого "взамен".

PS: А вы на этих страницах "Восприятие глубины" (Depth Perception) регулировать не пробовали? (значение поумолчанию == 2.0)

PS2: Вы scantailor-deviant ещё мержить не собираетесь? По-моему уже пора. Работает же. Как работает? - это обсуждаемо, но работает.

noobie-iv commented 8 months ago

Да вроде починить надо. Можно прогнать в STEX все ту же книгу с dwg.ru: https://elima.ru/books/?id=7081. Там видно, что некоторые страницы просто на глаз получаются сильно широкие, а некоторые - слишком узкие. И это не лечится настройкой глубины.

Честно говоря, там страницы не просто развернуты, а еще и местами примяты, так что и цилиндрическая развертка работает так себе; средние строки остаются кривыми, даже когда верх/низ идеально ровный. Но на такое нужен уже вообще другой код, с трассировкой и разверткой всех строк (или строк по выбору). А пока какой-нибудь дополнительный параметр "Вес исходных пропорций" явно нужен.

В STD автоматика еще не работает, только ручная развертка; при включении автоматики вместо работы получаются вылеты. Видимо, я неправильно вручную развернул шаблоны, которые не собирались. Но я уже нашел, как их починить.

Автоматика с поправленными шаблонами запустилась в мусорной неопубликованной ветке, которую я сейчас пересобираю, и потом запушу. По непонятной причине там сломан Watershed-фильтр, и маску страницы я просто временно заливаю белым. Плюс там вообще не показывают искажения превьюшки-заглушки. И нет применения "ко всем страницам". С точки зрения пользователя это все еще нерабочая программа.

Есть на гитхабе ночные сборки? Вот туда такое можно бы заливать.

zvezdochiot commented 8 months ago

@noobie-iv say:

Есть на гитхабе ночные сборки? Вот туда такое можно бы заливать.

Pre-release? В тех же самых релизах, выбирается тип релиза. Ffmpeg вообще использует бота для ежедневных автосборок.

PS: Эту "проблему" можно решить одним числом: внести где-нибудь параметр xy_cor, близким к единице. В транформации домножить масштабные компоненты:

scale_x *= xy_cor;
scale_y /= xy_cor;

или, что более удобно, пользовать прибавку к единице:

xy_cor = 1.0 + dxy_cor*1e-3;

PS2: По поводу "что взамен?". Для сравнения перспективных трансформаций:

noobie-iv commented 8 months ago

Все-таки эта книжка очень хороша для тестирования. Одни страницы в ней высотой 3300px, другие 2200. Даже на одной фотке левая страница может быть нормальной ширины, а правая - зауженная. Возможно, оператор был пьян, а возможно, работал в условиях сильной болтанки. STEX такие страницы разворачивает в чуть более узкие верстии, чем STU, но в принципе не справляются оба. Думал, можно сделать микс из двух алгоритмов, но потестировав книжку, вижу, что это не поможет. Подозреваю, что такое можно восстановить в автомате, только если трассировать каждую строку и каждую букву. Видимо, относительно простым решением будет добавить масштабные множители к ширине и высоте на стадии разметки страниц, где уже должны быть направляющие, под которые можно подгонять размеры.

zvezdochiot commented 1 month ago

:information_source: Повесил корекцию промежуточных кривых на "Восприятие глубины", зарезервировав вход под отдельный параметр. Так то по уму нужен отдельный регулятор, но пока меня устраивает и один регулятор на два параметра.