Skip to content

Commit acc57ab

Browse files
committed
0.2024.04.06: output: autozones regulator
1 parent 87f0307 commit acc57ab

23 files changed

+305
-77
lines changed

src/stages/output/BlackWhiteOptions.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ BlackWhiteOptions::BlackWhiteOptions()
3232
m_thresholdAdjustment(0),
3333
m_thresholdWindowSize(200),
3434
m_thresholdCoef(0.3),
35+
m_autoPictureCoef(0.0),
3536
m_autoPictureOff(false)
3637
{
3738
}
@@ -44,6 +45,7 @@ BlackWhiteOptions::BlackWhiteOptions(QDomElement const& el)
4445
m_thresholdAdjustment(el.attribute("thresholdAdj").toInt()),
4546
m_thresholdWindowSize(el.attribute("thresholdWinSize").toInt()),
4647
m_thresholdCoef(el.attribute("thresholdCoef").toDouble()),
48+
m_autoPictureCoef(el.attribute("autoPictureCoef").toDouble()),
4749
m_autoPictureOff(el.attribute("autoPictureOff") == "1")
4850
{
4951
if (m_dimmingColoredCoef < -1.0 || m_dimmingColoredCoef > 2.0)
@@ -71,6 +73,7 @@ BlackWhiteOptions::toXml(QDomDocument& doc, QString const& name) const
7173
el.setAttribute("thresholdAdj", m_thresholdAdjustment);
7274
el.setAttribute("thresholdWinSize", m_thresholdWindowSize);
7375
el.setAttribute("thresholdCoef", m_thresholdCoef);
76+
el.setAttribute("autoPictureCoef", m_autoPictureCoef);
7477
el.setAttribute("autoPictureOff", m_autoPictureOff ? "1" : "0");
7578
return el;
7679
}
@@ -106,6 +109,10 @@ BlackWhiteOptions::operator==(BlackWhiteOptions const& other) const
106109
{
107110
return false;
108111
}
112+
if (m_autoPictureCoef != other.m_autoPictureCoef)
113+
{
114+
return false;
115+
}
109116
if (m_autoPictureOff != other.m_autoPictureOff)
110117
{
111118
return false;

src/stages/output/BlackWhiteOptions.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,15 @@ class BlackWhiteOptions
100100
m_thresholdCoef = val;
101101
}
102102

103+
double autoPictureCoef() const
104+
{
105+
return m_autoPictureCoef;
106+
}
107+
void setAutoPictureCoef(double val)
108+
{
109+
m_autoPictureCoef = val;
110+
}
111+
103112
bool autoPictureOff() const
104113
{
105114
return m_autoPictureOff;
@@ -120,6 +129,7 @@ class BlackWhiteOptions
120129
int m_thresholdAdjustment;
121130
int m_thresholdWindowSize;
122131
double m_thresholdCoef;
132+
double m_autoPictureCoef;
123133
bool m_autoPictureOff;
124134

125135
static ThresholdFilter parseThresholdMethod(QString const& str);

src/stages/output/OptionsWidget.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ OptionsWidget::OptionsWidget(
268268
thresholdCoef, SIGNAL(valueChanged(double)),
269269
this, SLOT(thresholdCoefChanged(double))
270270
);
271+
connect(
272+
autoPictureCoef, SIGNAL(valueChanged(double)),
273+
this, SLOT(autoPictureCoefChanged(double))
274+
);
271275
connect(
272276
autoPictureOffCB, SIGNAL(clicked(bool)),
273277
this, SLOT(autoPictureOffToggled(bool))
@@ -801,6 +805,16 @@ OptionsWidget::thresholdCoefChanged(double value)
801805
emit reloadRequested();
802806
}
803807

808+
void
809+
OptionsWidget::autoPictureCoefChanged(double value)
810+
{
811+
BlackWhiteOptions black_white_options(m_colorParams.blackWhiteOptions());
812+
black_white_options.setAutoPictureCoef(value);
813+
m_colorParams.setBlackWhiteOptions(black_white_options);
814+
m_ptrSettings->setColorParams(m_pageId, m_colorParams);
815+
emit reloadRequested();
816+
}
817+
804818
void
805819
OptionsWidget::autoPictureOffToggled(bool const checked)
806820
{
@@ -1163,6 +1177,7 @@ OptionsWidget::updateColorsDisplay()
11631177
}
11641178
if (mixed_options_visible)
11651179
{
1180+
autoPictureCoef->setValue(black_white_options.autoPictureCoef());
11661181
autoPictureOffCB->setChecked(black_white_options.autoPictureOff());
11671182
}
11681183

src/stages/output/OptionsWidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ private slots:
127127

128128
void thresholdCoefChanged(double value);
129129

130+
void autoPictureCoefChanged(double value);
131+
130132
void autoPictureOffToggled(bool checked);
131133

132134
void applyColorsModeButtonClicked();

src/stages/output/OutputGenerator.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ OutputGenerator::process(
523523
}
524524
else
525525
{
526-
bw_mask = estimateBinarizationMask(status, GrayImage(transformed_image), dbg);
526+
bw_mask = estimateBinarizationMask(status, GrayImage(transformed_image), dbg, black_white_options.autoPictureCoef());
527527
}
528528

529529
if (dbg)
@@ -811,10 +811,47 @@ OutputGenerator::normalizeIlluminationGray(
811811
imageproc::BinaryImage
812812
OutputGenerator::estimateBinarizationMask(
813813
TaskStatus const& status, GrayImage const& gray_source,
814-
DebugImages* const dbg) const
814+
DebugImages* const dbg, float const coef) const
815815
{
816816
QSize const downscaled_size(gray_source.size().scaled(1600, 1600, Qt::KeepAspectRatio));
817817
GrayImage downscaled(scaleToGray(gray_source, downscaled_size));
818+
819+
if (!downscaled.isNull())
820+
{
821+
if ((coef < 0.0f) || (coef > 0.0f))
822+
{
823+
int icoef = (int) (coef * 256.0f + 0.5f);
824+
unsigned int const w = downscaled.width();
825+
unsigned int const h = downscaled.height();
826+
uint8_t* downscaled_line = downscaled.data();
827+
int const downscaled_stride = downscaled.stride();
828+
uint8_t pix_replace[256];
829+
830+
for (unsigned int j = 0; j < 256; j++)
831+
{
832+
unsigned int val = j;
833+
val++;
834+
val *= val;
835+
val += 255;
836+
val >>= 8;
837+
val--;
838+
val = icoef * val + (256 - icoef) * j;
839+
val += 128;
840+
val >>= 8;
841+
pix_replace[j] = (uint8_t) val;
842+
}
843+
844+
for (unsigned int y = 0; y < h; y++)
845+
{
846+
for (unsigned int x = 0; x < w; x++)
847+
{
848+
uint8_t val = downscaled_line[x];
849+
downscaled_line[x] = pix_replace[val];
850+
}
851+
downscaled_line += downscaled_stride;
852+
}
853+
}
854+
}
818855

819856
status.throwIfCancelled();
820857

src/stages/output/OutputGenerator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class OutputGenerator
143143

144144
imageproc::BinaryImage estimateBinarizationMask(
145145
TaskStatus const& status, imageproc::GrayImage const& gray_source,
146-
DebugImages* dbg) const;
146+
DebugImages* dbg, float coef = 0.0f) const;
147147

148148
void BinaryImageXOR(
149149
imageproc::BinaryImage& bw_mask, imageproc::BinaryImage& bw_content, imageproc::BWColor const color) const;

src/stages/output/ui/OutputOptionsWidget.ui

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -946,55 +946,39 @@
946946
</item>
947947
<item>
948948
<widget class="QWidget" name="mixedOptions" native="true">
949-
<layout class="QHBoxLayout" name="horizontalLayoutMixed1">
950-
<property name="leftMargin">
951-
<number>0</number>
952-
</property>
953-
<property name="topMargin">
954-
<number>0</number>
955-
</property>
956-
<property name="rightMargin">
957-
<number>0</number>
958-
</property>
959-
<property name="bottomMargin">
960-
<number>0</number>
961-
</property>
962-
<item>
963-
<spacer name="horizontalSpacerMixed2">
964-
<property name="orientation">
965-
<enum>Qt::Horizontal</enum>
966-
</property>
967-
<property name="sizeHint" stdset="0">
968-
<size>
969-
<width>13</width>
970-
<height>17</height>
971-
</size>
949+
<layout class="QGridLayout" name="autoPictureOptions">
950+
<item row="0" column="0">
951+
<widget class="QLabel" name="autoPictureCoefLabel">
952+
<property name="text">
953+
<string>autozones:</string>
972954
</property>
973-
</spacer>
955+
</widget>
974956
</item>
975-
<item>
976-
<layout class="QVBoxLayout" name="verticalLayoutMixed">
977-
<item>
978-
<widget class="QCheckBox" name="autoPictureOffCB">
979-
<property name="text">
980-
<string>Off autozones</string>
981-
</property>
982-
</widget>
983-
</item>
984-
</layout>
957+
<item row="0" column="1">
958+
<widget class="QDoubleSpinBox" name="autoPictureCoef">
959+
<property name="toolTip">
960+
<string>Value is -1.0 .. 1.0.</string>
961+
</property>
962+
<property name="minimum">
963+
<double>-1.0</double>
964+
</property>
965+
<property name="maximum">
966+
<double>1.0</double>
967+
</property>
968+
<property name="singleStep">
969+
<double>0.05</double>
970+
</property>
971+
</widget>
985972
</item>
986-
<item>
987-
<spacer name="horizontalSpacerMixed3">
988-
<property name="orientation">
989-
<enum>Qt::Horizontal</enum>
973+
<item row="0" column="2">
974+
<widget class="QCheckBox" name="autoPictureOffCB">
975+
<property name="text">
976+
<string>Off</string>
990977
</property>
991-
<property name="sizeHint" stdset="0">
992-
<size>
993-
<width>13</width>
994-
<height>17</height>
995-
</size>
978+
<property name="toolTip">
979+
<string>Off autozones.</string>
996980
</property>
997-
</spacer>
981+
</widget>
998982
</item>
999983
</layout>
1000984
</widget>

src/translations/scantailor-experimental_bg.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,6 +1371,7 @@ To determine it, run batch processing at &quot;Select Content&quot; or &quot;Pag
13711371
<message>
13721372
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="400"/>
13731373
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="416"/>
1374+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="960"/>
13741375
<source>Value is -1.0 .. 1.0.</source>
13751376
<translation type="unfinished"></translation>
13761377
</message>
@@ -1556,8 +1557,18 @@ To determine it, run batch processing at &quot;Select Content&quot; or &quot;Pag
15561557
<translation>По-дебело</translation>
15571558
</message>
15581559
<message>
1559-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="970"/>
1560-
<source>Off autozones</source>
1560+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="953"/>
1561+
<source>autozones:</source>
1562+
<translation type="unfinished"></translation>
1563+
</message>
1564+
<message>
1565+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="976"/>
1566+
<source>Off</source>
1567+
<translation type="unfinished"></translation>
1568+
</message>
1569+
<message>
1570+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="979"/>
1571+
<source>Off autozones.</source>
15611572
<translation type="unfinished"></translation>
15621573
</message>
15631574
</context>

src/translations/scantailor-experimental_cs.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,8 +1222,9 @@ Pro určení velikosti stránek spusťte dávkové zpracování u &quot;Vybrat O
12221222
<translation type="unfinished"></translation>
12231223
</message>
12241224
<message>
1225-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="292"/>
1226-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="364"/>
1225+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="400"/>
1226+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="416"/>
1227+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="960"/>
12271228
<source>Value is -1.0 .. 1.0..</source>
12281229
<translation type="unfinished"></translation>
12291230
</message>
@@ -1415,8 +1416,18 @@ Pro určení velikosti stránek spusťte dávkové zpracování u &quot;Vybrat O
14151416
<translation>Tlustší</translation>
14161417
</message>
14171418
<message>
1418-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="970"/>
1419-
<source>Off autozones</source>
1419+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="953"/>
1420+
<source>autozones:</source>
1421+
<translation type="unfinished"></translation>
1422+
</message>
1423+
<message>
1424+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="976"/>
1425+
<source>Off</source>
1426+
<translation type="unfinished"></translation>
1427+
</message>
1428+
<message>
1429+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="979"/>
1430+
<source>Off autozones.</source>
14201431
<translation type="unfinished"></translation>
14211432
</message>
14221433
<message>

src/translations/scantailor-experimental_de.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,8 +1296,18 @@ Um die endgültige Größe der Seiten festzulegen, starten Sie die Stapelverarbe
12961296
<translation>schwächer</translation>
12971297
</message>
12981298
<message>
1299-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="970"/>
1300-
<source>Off autozones</source>
1299+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="953"/>
1300+
<source>autozones:</source>
1301+
<translation type="unfinished"></translation>
1302+
</message>
1303+
<message>
1304+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="976"/>
1305+
<source>Off</source>
1306+
<translation type="unfinished"></translation>
1307+
</message>
1308+
<message>
1309+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="979"/>
1310+
<source>Off autozones.</source>
13011311
<translation type="unfinished"></translation>
13021312
</message>
13031313
<message>

src/translations/scantailor-experimental_es.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,8 +1458,18 @@ Para determinarlo, ejecute el proceso de &quot;Seleccionar Contendio&quot; o &qu
14581458
<translation>Mas grueso</translation>
14591459
</message>
14601460
<message>
1461-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="970"/>
1462-
<source>Off autozones</source>
1461+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="953"/>
1462+
<source>autozones:</source>
1463+
<translation type="unfinished"></translation>
1464+
</message>
1465+
<message>
1466+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="976"/>
1467+
<source>Off</source>
1468+
<translation type="unfinished"></translation>
1469+
</message>
1470+
<message>
1471+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="979"/>
1472+
<source>Off autozones.</source>
14631473
<translation type="unfinished"></translation>
14641474
</message>
14651475
</context>

src/translations/scantailor-experimental_fr.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,8 +1267,18 @@ Pour la déterminer, lancez le processus de traitement à l&apos;étape &quot;S
12671267
<translation>Éclaircir</translation>
12681268
</message>
12691269
<message>
1270-
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="970"/>
1271-
<source>Off autozones</source>
1270+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="953"/>
1271+
<source>autozones:</source>
1272+
<translation type="unfinished"></translation>
1273+
</message>
1274+
<message>
1275+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="976"/>
1276+
<source>Off</source>
1277+
<translation type="unfinished"></translation>
1278+
</message>
1279+
<message>
1280+
<location filename="../stages/output/ui/OutputOptionsWidget.ui" line="979"/>
1281+
<source>Off autozones.</source>
12721282
<translation type="unfinished"></translation>
12731283
</message>
12741284
<message>

0 commit comments

Comments
 (0)