Olena-patches
Threads by month
- ----- 2025 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 9625 discussions

28 Mar '11
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Olena, a generic and efficient image processing platform".
The branch unstable/scribo has been updated
discards e58bc06a49ee5020da72efbce8b515a2b9aeb36a (commit)
discards 41cec18a096db274554b38e52684f07fc2ff17cf (commit)
discards 921edcc8bda188c053965f067c4c425f35d6736a (commit)
discards 234857f163935061703e9a266f1d4819853784c2 (commit)
discards f74b26eef10f1d8c8d44c0ae6c5a4863e280cc3c (commit)
discards 7dcdc997eeb813df22ac5a1838f09ee98f776357 (commit)
discards 6c07eb07cb2b526fcc5f6f1e3e9129a909059907 (commit)
discards 3c5ade3ef4ade56a212f140ccfaf964f6c045c26 (commit)
discards 2021de27002717089153ea8bb6e1eb117e329cb8 (commit)
discards b4dcface8e9554a81fd84675f18b2abd6c51cb9e (commit)
discards db7457153f9ac3811483be20a4d8981e31443785 (commit)
discards 4e7a87b8c9aa19b264a9eaae5fd4eacd7ff7b947 (commit)
discards 76d581414104c04a8954b083b24cf9caf58154e7 (commit)
discards 1e74eb51d3243487f13ea104079737c53ac0361b (commit)
discards 2d12896ac7a0e42de83bed33c3dde02bbae4b6e5 (commit)
discards 6adf703bc7b05f9ff00719b7cbbc845a234d3f9d (commit)
discards b71d6973bdcfda3c47cc9a4211339555a6cf0a27 (commit)
discards 2f870e06bc47707e86500bfb905e013545d81ee0 (commit)
discards 4b5b9f8ea9ff23a59ee7bdca6297a57b5b16bdc1 (commit)
discards 3f14376ad38b8967e5af7d63ddac93989f58ac39 (commit)
discards 8ee4c1acd45d4bd6c1a8805fe41de65c1153ba17 (commit)
discards 8aaa787401d5d6681ab824550216d5abee24c324 (commit)
discards 3038605191b650a8a86d10ffb986d165bca13f31 (commit)
discards eae112f79b28e0e6f217b6cfe130a4a1dc1ca0c4 (commit)
discards 294c4219261707af15a0d5593ddefd6f86851c44 (commit)
discards 80b10b678600c73da186ebe4662652096c98673b (commit)
discards 1a5cc61c52a905239876107d1ac2143a62e23968 (commit)
discards 500be97a841a57b0cf6f580d6573a6ef1f941803 (commit)
discards 3f06d28a852c01e7f49ec0320a2cdf254ad11ec4 (commit)
discards 07b076ce0ba19ac3741350db76a881252cab9313 (commit)
discards d045991c53396fcbf462e8824b9bd68657c3824b (commit)
discards 9721b83ee36739262562acd9a53019351e476044 (commit)
discards 2cd9b0158f329056d6baf732c8c94da4a58f9477 (commit)
discards 00e84b1ea30ed7f4d9adb3e46576f0da37d4701b (commit)
discards 7a467ce53641d6df7084ad28c230b59e741b3158 (commit)
discards c4bfbf3039ad1bc22e9d6a84898e1aa30204b165 (commit)
discards 88a5659a616bb9a61144ce29447da7c78afd1d16 (commit)
discards 55dec68d501bf9aea0237bc734f8e34a2c2b8659 (commit)
discards 525a77d49f93c4d8af8f0f98311a59fa91ad37f5 (commit)
discards be7296a994a74454aed04e9ac5697b1ebf7f1239 (commit)
discards 3e799ae9a6155fe25743f551e029b8f407ba5f87 (commit)
discards c6aef9e87ecd21dc02545f3ff234dfa37c49ef0e (commit)
discards 71e09952f8956d7969923783e4d11785ed69ac70 (commit)
discards f4cad33327251f4d0d7c9f03ba309b0472671685 (commit)
discards 38639f48cf630d9773a72825adf3e1c2bd33d699 (commit)
discards 08507d9f6ee6460473604cd94e1cc094ca4dcb6f (commit)
discards 300d0d76ad8aba7dbf1f793b8bfbbc32b80016a8 (commit)
discards b37a853c16b36dc73376fbc32562772a0a1778eb (commit)
discards 5127a7b422860a30f96a86f71f5bb1e6961894fa (commit)
discards b1fe7b822ef9667e06e4a61465cca47a19c728d8 (commit)
discards 67e03b2fa427dbcea04133c7c62ed6b9e3b40770 (commit)
discards 37420bc1bc21b94431344d5ed978f6b537333816 (commit)
discards 9fc92d2022701f48b1471d7899df48eefe5c3281 (commit)
discards 36bdfe6bd32b4e4fc6f5e4ca6443de39ea7ed1d5 (commit)
discards 09b76a65da9f752c14797fe845b5d9f3c2e9e193 (commit)
discards 9ce4470df6ec50f7c5776cc78c9ef8b804579b27 (commit)
discards cff396c972728565d654eab1ff4258ef18fa51c6 (commit)
discards b9a628915f1d9728cacca0049eccb7272427164d (commit)
discards 7bdf8a260b084ca369db30a705dd5c3e8a1ecec3 (commit)
discards 26501abd4604deb0a0670c6b8bf3a212145477b3 (commit)
discards c027c16fdbc3ffe8b1623764a56bd9cfad77a8bc (commit)
discards e05c9c33f0bf1a7a3b2499f872f2a4167ceba41f (commit)
discards a192077679cb7736a2dc6f096bac377b0f4453ba (commit)
discards 209645b7fdd312ecf6b9f6e37281e6b1122792b5 (commit)
discards 1cd8d75d23d5d2a54b1847d7ea6bae714b39b37f (commit)
discards 47af3d9cb24e89d843ca9648f55db11b575b4bc7 (commit)
discards d5019dd2432f7e82eb2ac079a3ab14576b8badb8 (commit)
discards c96edd6fb6f8e3ab339b1b565941007a5da9a4c7 (commit)
discards 79b3aaa9765b6a9f86d71ddf55d3556d4f922cfd (commit)
discards 11325f7f2dd2278993de4dd4a11e9a136617a398 (commit)
discards c4bfdc8ca94fc3283920876a447bf21b1efaf9bb (commit)
via 65ec591cc15b84468c066dd6708e041b1d3949d1 (commit)
via b1edf757ef7afe1323adbac78593d907da3bbb3f (commit)
via 59c675bf89f6f708eee6988113338f7b5899807c (commit)
via 848f99d169cba718ea39658a3a08527e272144a3 (commit)
via 9b60b90c5214d017209f9082558ed25388988863 (commit)
via 638a3075e02ea776e2d6e74a2a3d9b8a05d76fde (commit)
via 4ad3ae8d2a86ab4192be7392871242e2c9535ce4 (commit)
via 31809b6103dcbba82474e951274676b00f315d2f (commit)
via 30e9e38e5935bd2305b67bf2c306dafb5fecb047 (commit)
via 546e98d51ff890f14e1cb3c367541e9c03725350 (commit)
via 485bbf87ecdf4c53bf672cd47e722c7d75703d75 (commit)
via 20b750a8628dd43cde273109c57023335c47536d (commit)
via 3de602aa446941f8a3ad5d03b5bb2cc031a3bdec (commit)
via 91a93e84e31d7571340188f2f1dacdcdb0d6c210 (commit)
via abbc1e66aded6326799ed132230fa60bf60b23dd (commit)
via 1027aef615d0b8cb373aecc25ca8bab812a3ab03 (commit)
via 794a820803ee4bc55872cb49e38a385b6b38b783 (commit)
via 5c363a16c9ce736c50e6dcd0e3e7feebd79be7a1 (commit)
via b01bf1512d4986dbcc51bfb43f54d7a8b562d38e (commit)
via ed1425b584398be6b36be551e7b4258dfd1758a6 (commit)
via d31fffd6aad495e8b44b86d3ea667b6d4efa7469 (commit)
via 1e9c3e590c82f271e8b0cc8c8b85863d36e91474 (commit)
via 65d90390602dde5d14dd25f5ee088b4ac47f47c5 (commit)
via ea8ad625701a38fe7980cabc7fd6e8764307b7f4 (commit)
via ecf417bbb05bb040a637a71b6d5c5d82164d2ca6 (commit)
via 282de701ea7eefc86919581fe6c004ab7cc36584 (commit)
via 1d1a977dda81f80570255a3aefa1a8919b9198f1 (commit)
via 5db5a7215cc5b5adf1cc2e10b287f854a04a32e2 (commit)
via fe898e73cba128d138abb5ae4c8c4aa411c48e77 (commit)
via 5b25a55343dd45bc65225697e49fc7af9b35d077 (commit)
via 0135714d0d79984802f2f19aa2e93321efeb8802 (commit)
via 20da74d6ce217ba0c7300f024c3b174487cb0cd3 (commit)
via 881caef92eaa1ad16aa9ae80b26b07fc5a04f191 (commit)
via 5c06e0488ea613362d8781d163f87207e83ec58f (commit)
via 6de9b0968f12e6bd0c786ad3aeca239f9895efaa (commit)
via f92f9d4f33997593565b9bfab782f268786676d4 (commit)
via 05a6c098580a1fe9e6ab073a75c48230695473d0 (commit)
via 2de39a7ec2fe9a11b20a7771336c70b1556658fd (commit)
via 9d82627b1064251d231f796bcd217fa7cdc49c31 (commit)
via 95bf4497be229dd5ced2b8e05c04c0372e436509 (commit)
via b4f0eefeec21412d670a4c478f5876388e448f9b (commit)
via 7c9d3b1c92cc6ba0e952d65f32ed518bb34341cd (commit)
via 6b548c5cb710f06612c533b57b39c658a038eb12 (commit)
via d12d660ab6cc7611ddd9d3ee29915d5947f7e7e9 (commit)
via ca041c01ea50c8fd14779fa5b77586be1ad779be (commit)
via ba41452a338d6c4fc8b0963626dfd0a5799b8b76 (commit)
via 6fdc4cc496628083dc48e46a6733f35f5a99649a (commit)
via 7f4a36790a46eaf04c7b7421b492a6ffe9f9f48e (commit)
via e2702750f92e4fe0716aa030b90fd96aa63df100 (commit)
via 134e242fedada16527bd7af8cf5bc9e5f66032f1 (commit)
via 6985484e9a1b721e6da5bb78ee2222d936d1767a (commit)
via 8c287df29ff3049d749db0c0867a4b85f63a5dfb (commit)
via fd62480ce9e6a16bb1dc3585ba100d6a9ea6deb1 (commit)
via cc8c9ed06e4070b7c0aca23b6d8530fe1f5a9ea0 (commit)
via c65020df4f9a43ae7aa49e5d6f7467217be9046d (commit)
via 4756e175a1c2614f91be3cf36e129341e375ac43 (commit)
via f67cec4c13aa85adffb59cddbf7e0e45925cb5ae (commit)
via 2a17f6d9312831e4c9094f40622b90dca8a230ed (commit)
via 77429c34a1a3aa4901710880d612e7ad3949228b (commit)
via 8f266e9124f39e2d5592ca4dfc914d784ea3f579 (commit)
via 5dbed1ab586fba85cff78903469e6a4015bbb509 (commit)
via 959710dac03a9bcd569d14a2d53a6ca149214196 (commit)
via d3a06bf8f609f7c90871f6bc09b6a37d97ebd972 (commit)
via 004d118aeb91bd85b36a2379bb7546e37a785189 (commit)
via 12c45b02b83d3d06505b7f5f8f56c1f2c5b32d41 (commit)
via e5c41a61332676c03a8bf6771ddddddaa23a2654 (commit)
via f54c0a6c44a5dee7a2bdec4480d98cdeb52d7f57 (commit)
via e01df8b1b88b2757f236e2f8b745d164c7ff2cc3 (commit)
via e026707a6679a82e6d183d925a9fef8ad045208a (commit)
via bc82f1691d64d78fb60795be37553d84257995ef (commit)
via 9e5a4bf678f40e84f65f2fd2c2383b5b8869ae5b (commit)
This update added new revisions after undoing existing revisions. That is
to say, the old revision is not a strict subset of the new revision. This
situation occurs when you --force push a change and generate a repository
containing something like this:
* -- * -- B -- O -- O -- O (e58bc06a49ee5020da72efbce8b515a2b9aeb36a)
\
N -- N -- N (65ec591cc15b84468c066dd6708e041b1d3949d1)
When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
65ec591 demo/viewer/xml_widget.cc: Fix a warning.
b1edf75 demo/viewer/runner.cc: Improve progress notification.
59c675b Fix compilation issues on MAC.
848f99d scribo/primitive/link/internal/dmax_functor_base.hh: Make the dmax ratio safer.
9b60b90 scribo/text/merging: Add a precondition. Fix merging policy.
638a307 scribo/primitive/link/internal/link_functor_base.hh: Stop neighbor lookup when a separator is found.
4ad3ae8 Regen generated files.
31809b6 Fix namespace ambiguities.
30e9e38 src/Makefile.am: define HAVE_QT for content_in_doc.
546e98d Add missing anchor argument.
485bbf8 Regen generated files.
20b750a mln/labeling/colorize.hh: Add a missing inline.
3de602a Add more from_to overloards.
91a93e8 build-aux/build_unit_test.sh: Define HAVE_* for unit-tests.
abbc1e6 Regen generated files.
1027aef tests/toolchain/nepomuk/Makefile.am: Add MAGICKXX flags.
794a820 scribo/core/def/lbl_type.hh: Use int_u<n> as label type.
5c363a1 Set unit tests dependencies.
b01bf15 New debug tools.
ed1425b New non-text components extraction routine.
d31fffd Introduce result image output.
1e9c3e5 Save image edge coordinates in XML output.
65d9039 scribo/filter/object_links_aligned.hh: New.
ea8ad62 scribo/primitive/extract/separators_nonvisible.hh: Cleanup and improve debug support.
ecf417b Various small fixes.
282de70 Introduce a new component linking method.
1d1a977 Spread anchor value to more methods in link functors.
5db5a72 Introduce a logger class.
fe898e7 Introduce a logger class.
5b25a55 Introduce new anchors.
0135714 Rename document serializer base class.
20da74d Store more information in scribo::document.
881caef Rename line_info::components() to line_info::component_ids.
5c06e04 Some changes in debug routines.
6de9b09 Add HAVE_QT guards.
f92f9d4 Small fixes in viewer.
05a6c09 scribo/io/xml/internal/extended_page_xml_visitor.hh: Save separators data.
2de39a7 scribo/io/xml/internal/full_xml_visitor.hh: Do not copy image data.
9d82627 Make OCR step optional in viewer.
95bf449 scribo/toolchain/internal/content_in_doc_functor.hh: Make OCR step optional.
b4f0eef Compress image data in XML output.
7c9d3b1 Small fixes in Scribo.
6b548c5 Regen mk files.
d12d660 scribo/primitive/extract/non_text.hh: Remove debug.
ca041c0 Add new debug tools.
ba41452 scribo/text/extract_lines.hh: Update code.
6fdc4cc Make use of mln::fun::v2v::rgb_to_luma.
7f4a367 mln/labeling/fill_holes.hh: Improve speed.
e270275 mln/fun/v2v/rgb_to_luma.hh: New function for grayscale conversion.
134e242 scribo/io/xml/load.hh: New XML loader.
6985484 Make XML output more flexible.
8c287df Set component type during component extraction.
fd62480 configure.ac: scribo/src/primitive/remove.
cc8c9ed Add new tools in Scribo.
c65020d Small fixes in Scribo.
4756e17 Improve and cleanup whitespace separator detection.
f67cec4 Add new conversion routines from string to tag.
2a17f6d Various changes in scribo core structures.
77429c3 Rename files in Scribo.
8f266e9 mln/util/array.hh: Add last() method.
5dbed1a Add an optional base index for debug::iota.
959710d configure.ac: configure scribo/tests/convert.
d3a06bf Add Base64 conversion routines.
004d118 =Add support for whitespace separators visualization.
12c45b0 Deactivate erroneous assertion in regional_maxima.hh.
-----------------------------------------------------------------------
Summary of changes:
hooks/post-receive
--
Olena, a generic and efficient image processing platform
1
0

28 Mar '11
---
scribo/sandbox/z/FineReader9-schema-v1.xml | 447 ++++++++++++++++++++++++++++
1 files changed, 447 insertions(+), 0 deletions(-)
create mode 100644 scribo/sandbox/z/FineReader9-schema-v1.xml
diff --git a/scribo/sandbox/z/FineReader9-schema-v1.xml b/scribo/sandbox/z/FineReader9-schema-v1.xml
new file mode 100644
index 0000000..6c8beb2
--- /dev/null
+++ b/scribo/sandbox/z/FineReader9-schema-v1.xml
@@ -0,0 +1,447 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.abbyy.com/FineReader_xml/FineReader9-schema-v1.xml"
+ xmlns:tns="http://www.abbyy.com/FineReader_xml/FineReader9-schema-v1.xml"
+ elementFormDefault="qualified">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Schema for representing OCR results exported from FineReader 9.0 SDK. Copyright 2001-2007 ABBYY, Inc.
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:element name="document">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="documentData" minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Global document data
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="fontStyles" minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Font formatting styles collection
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="fontStyle" minOccurs="0" maxOccurs="unbounded" type="tns:FontStyleType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Font formatting style
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="paragraphStyles" minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Paragraph formatting styles collection
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="paragraphStyle" minOccurs="0" maxOccurs="unbounded" type="tns:ParagraphStyleType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Paragraph formatting style
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="sections" minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Document sections collection
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="section" minOccurs="0" maxOccurs="unbounded" type="tns:SectionType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Section
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="page" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Recognized page
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="block" minOccurs="0" maxOccurs="unbounded" type="tns:BlockType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Recognized block
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="width" type="xs:integer" use="required"/>
+ <xs:attribute name="height" type="xs:integer" use="required"/>
+ <xs:attribute name="resolution" type="xs:integer" use="required"/>
+ <xs:attribute name="originalCoords" type="xs:boolean" use="optional" default="false">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">If true, all coordinates are relative to original image before opening, otherwise they are relative to the opened (deskewed) image</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="version" type="xs:string" use="required"/>
+ <xs:attribute name="producer" type="xs:string" use="required"/>
+ <xs:attribute name="pagesCount" type="xs:integer" use="optional" default="1"/>
+ <xs:attribute name="mainLanguage" type="xs:string" use="optional"/>
+ <xs:attribute name="languages" type="xs:string" use="optional"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name ="ParagraphStyleType">
+ <xs:attribute name="id" type="xs:integer" use="required" />
+ <xs:attribute name="name" type="xs:string" use="required" />
+ <xs:attribute name="mainFontStyleId" type="xs:integer" use="required" />
+ <xs:attribute name="role" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="text"/>
+ <xs:enumeration value="tableText"/>
+ <xs:enumeration value="heading"/>
+ <xs:enumeration value="tableHeading"/>
+ <xs:enumeration value="pictureCaption"/>
+ <xs:enumeration value="tableCaption"/>
+ <xs:enumeration value="footnote" />
+ <xs:enumeration value="endnote" />
+ <xs:enumeration value="rt" />
+ <xs:enumeration value="garb" />
+ <xs:enumeration value="other" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="roleLevel" type="xs:integer" use="optional" default="-1" />
+ <xs:attribute name="align" type="tns:ParagraphAlignment" use="required" />
+ <xs:attribute name="width" type="xs:integer" use="optional" default="-1" />
+ <xs:attribute name="before" type="xs:integer" use="optional" default="-1" />
+ <xs:attribute name="after" type="xs:integer" use="optional" default="-1" />
+ <xs:attribute name="lineSpacing" type="xs:integer" use="optional" default="0" />
+ <xs:attribute name="startIndent" type="xs:integer" use="required"/>
+ </xs:complexType>
+
+ <xs:complexType name="FontStyleType">
+ <xs:attribute name="id" type="xs:integer" use="required" />
+ <xs:attribute name="name" type="xs:string" use="required" />
+ <xs:attribute name="italic" type="xs:boolean" use="optional" default="false" />
+ <xs:attribute name="bold" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="smallcaps" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="scaling" type="xs:integer" use="optional" default="1000" />
+ <xs:attribute name="spacing" type="xs:integer" use="optional" default="0" />
+ <xs:attribute name="ff" type="xs:string" use="required"/>
+ <xs:attribute name="fs" type="xs:integer" use="required"/>
+</xs:complexType>
+
+ <xs:complexType name="SectionType">
+ <xs:sequence>
+ <xs:element name="stream" minOccurs="0" maxOccurs="unbounded" type="tns:TextStreamType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Text Stream is the sequence of paragraphs and/or blocks
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="TextStreamType">
+ <xs:sequence>
+ <xs:element name="parId" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Id of paragraph or block
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:attribute name="id" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="role" use="optional" default="text">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="undef" />
+ <xs:enumeration value="garb" />
+ <xs:enumeration value="text" />
+ <xs:enumeration value="footnote" />
+ <xs:enumeration value="endnote" />
+ <xs:enumeration value="incut" />
+ <xs:enumeration value="rt" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="rtId" type="xs:integer" use="optional" default="0" />
+ <xs:attribute name="prevPar" type="xs:string" use="optional" default="" />
+ <xs:attribute name="nextPar" type="xs:string" use="optional" default="" />
+ </xs:complexType>
+
+ <xs:complexType name="BlockType">
+ <xs:sequence>
+ <xs:element name="region" minOccurs="1" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Block region, the set of rectangles
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="rect" minOccurs="1" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="l" type="xs:integer" use="required"/>
+ <xs:attribute name="t" type="xs:integer" use="required"/>
+ <xs:attribute name="r" type="xs:integer" use="required"/>
+ <xs:attribute name="b" type="xs:integer" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="text" minOccurs="0" maxOccurs="1" type="tns:TextType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Recognized block text, presents if blockType attribute is Text</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="row" minOccurs="0" maxOccurs="unbounded" type="tns:TableRowType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">The set of table rows, presents if blockType attribute is Table</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="blockType" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Text"/>
+ <xs:enumeration value="Table"/>
+ <xs:enumeration value="Picture"/>
+ <xs:enumeration value="Barcode"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="blockName" type="xs:string" use="optional"/>
+ <xs:attribute name="isHidden" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="l" type="xs:integer" use="required"/>
+ <xs:attribute name="t" type="xs:integer" use="required"/>
+ <xs:attribute name="r" type="xs:integer" use="required"/>
+ <xs:attribute name="b" type="xs:integer" use="required"/>
+ </xs:complexType>
+
+
+
+ <xs:complexType name="TextType">
+ <xs:sequence>
+ <xs:element name="par" minOccurs="0" maxOccurs="unbounded" type="tns:ParagraphType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Text paragraph</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="orientation" use="optional" default="Normal">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Normal"/>
+ <xs:enumeration value="RotatedClockwise"/>
+ <xs:enumeration value="RotatedUpsidedown"/>
+ <xs:enumeration value="RotatedCounterclockwise"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="backgroundColor" type="xs:integer" use="optional" default="16777215"/>
+ <xs:attribute name="mirrored" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="inverted" type="xs:boolean" use="optional" default="false"/>
+ </xs:complexType>
+
+
+ <xs:complexType name="TableRowType">
+ <xs:sequence>
+ <xs:element name="cell" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Table cell</xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="text" minOccurs="0" maxOccurs="unbounded" type="tns:TextType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Cell text</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="colSpan" type="xs:integer" use="optional" default="1"/>
+ <xs:attribute name="rowSpan" type="xs:integer" use="optional" default="1"/>
+ <xs:attribute name="align" use="optional" default="Top">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Top"/>
+ <xs:enumeration value="Center"/>
+ <xs:enumeration value="Bottom"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="picture" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="leftBorder" use="optional" type="tns:TableCellBorderType" default="Black"/>
+ <xs:attribute name="topBorder" use="optional" type="tns:TableCellBorderType" default="Black"/>
+ <xs:attribute name="rightBorder" use="optional" type="tns:TableCellBorderType" default="Black"/>
+ <xs:attribute name="bottomBorder" use="optional" type="tns:TableCellBorderType" default="Black"/>
+ <xs:attribute name="width" type="xs:integer" use="required"/>
+ <xs:attribute name="height" type="xs:integer" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+
+ <xs:complexType name="ParagraphType">
+ <xs:sequence>
+ <xs:element name="line" minOccurs="0" maxOccurs="unbounded" type="tns:LineType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Text paragraph line</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="dropCapCharsCount" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="dropCap-l" type="xs:integer" use="optional"/>
+ <xs:attribute name="dropCap-t" type="xs:integer" use="optional"/>
+ <xs:attribute name="dropCap-r" type="xs:integer" use="optional"/>
+ <xs:attribute name="dropCap-b" type="xs:integer" use="optional"/>
+ <xs:attribute name="align" type="tns:ParagraphAlignment" use="optional" default="Left" />
+ <xs:attribute name="leftIndent" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="rightIndent" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="startIndent" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="lineSpacing" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="id" type="xs:string" use="optional" />
+ <xs:attribute name="style" type="xs:integer" use="optional" />
+ </xs:complexType>
+
+<xs:simpleType name="ParagraphAlignment">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Left"/>
+ <xs:enumeration value="Center"/>
+ <xs:enumeration value="Right"/>
+ <xs:enumeration value="Justified"/>
+ </xs:restriction>
+</xs:simpleType>
+
+ <xs:complexType name="LineType">
+ <xs:sequence>
+ <xs:element name="formatting" minOccurs="0" maxOccurs="unbounded" type="tns:FormattingType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Group of characters with uniform formatting</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="baseline" type="xs:integer" use="required"/>
+ <xs:attribute name="l" type="xs:integer" use="required"/>
+ <xs:attribute name="t" type="xs:integer" use="required"/>
+ <xs:attribute name="r" type="xs:integer" use="required"/>
+ <xs:attribute name="b" type="xs:integer" use="required"/>
+ </xs:complexType>
+
+ <xs:complexType name="FormattingType" mixed="true">
+ <xs:sequence>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Attributes of characters are alternated with word's recognition variants. The variants of recognition of the word are written before the word</xs:documentation>
+ </xs:annotation>
+ <xs:element name="charParams" type="tns:CharParamsType">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Attributes of single character</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="wordRecVariants">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Variants of recognition of the next word</xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="wordRecVariant" minOccurs="0" maxOccurs="unbounded" type="tns:WordRecognitionVariant"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="lang" type="xs:string" use="required"/>
+ <xs:attribute name="ff" type="xs:string" use="optional"/>
+ <xs:attribute name="fs" type="xs:float" use="optional"/>
+ <xs:attribute name="bold" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="italic" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="subscript" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="superscript" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="smallcaps" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="underline" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="strikeout" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="color" type="xs:integer" use="optional" default="0"/>
+ <xs:attribute name="scaling" type="xs:integer" use="optional" default="1000"/>
+ <xs:attribute name="spacing" type="xs:integer" use="optional" default="0"/>
+ </xs:complexType>
+
+ <xs:complexType name="WordRecognitionVariant">
+ <xs:sequence>
+ <xs:element name="variantText" minOccurs="1" maxOccurs="1">
+ <xs:complexType mixed="true">
+ <xs:sequence>
+ <xs:element name="charParams" minOccurs="0" maxOccurs="unbounded" type="tns:CharParamsType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="wordFromDictionary" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordNormal" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordNumeric" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordIdentifier" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordPenalty" type="xs:integer" use="optional"/>
+ <xs:attribute name="meanStrokeWidth" type="xs:integer" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="CharRecognitionVariant" mixed="true">
+ <xs:attribute name="charConfidence" type="xs:integer" use="optional"/>
+ <xs:attribute name="serifProbability" type="xs:integer" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="CharParamsType" mixed="true">
+ <xs:sequence>
+ <xs:element name="charRecVariants" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="charRecVariant" minOccurs="0" maxOccurs="unbounded" type="tns:CharRecognitionVariant"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="l" type="xs:integer" use="required"/>
+ <xs:attribute name="t" type="xs:integer" use="required"/>
+ <xs:attribute name="r" type="xs:integer" use="required"/>
+ <xs:attribute name="b" type="xs:integer" use="required"/>
+ <xs:attribute name="suspicious" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="proofed" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="wordStart" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordFromDictionary" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordNormal" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordNumeric" type="xs:boolean" use="optional"/>
+ <xs:attribute name="wordIdentifier" type="xs:boolean" use="optional"/>
+ <xs:attribute name="charConfidence" type="xs:integer" use="optional"/>
+ <xs:attribute name="serifProbability" type="xs:integer" use="optional"/>
+ <xs:attribute name="wordPenalty" type="xs:integer" use="optional"/>
+ <xs:attribute name="meanStrokeWidth" type="xs:integer" use="optional"/>
+ <xs:attribute name="characterHeight" type="xs:integer" use="optional"/>
+ <xs:attribute name="hasUncertainHeight" type="xs:boolean" use="optional"/>
+ <xs:attribute name="baseLine" type="xs:integer" use="optional"/>
+ </xs:complexType>
+
+ <xs:simpleType name="TableCellBorderType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Absent"/>
+ <xs:enumeration value="Unknown"/>
+ <xs:enumeration value="White"/>
+ <xs:enumeration value="Black"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+
+</xs:schema>
--
1.5.6.5
1
0

last-svn-commit-681-g7840dad sandbox/z/white_spaces/white_spaces.cc: Fix compilation.
by Guillaume Lazzara 28 Mar '11
by Guillaume Lazzara 28 Mar '11
28 Mar '11
---
scribo/sandbox/z/white_spaces/white_spaces.cc | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/scribo/sandbox/z/white_spaces/white_spaces.cc b/scribo/sandbox/z/white_spaces/white_spaces.cc
index d832d58..54ef436 100644
--- a/scribo/sandbox/z/white_spaces/white_spaces.cc
+++ b/scribo/sandbox/z/white_spaces/white_spaces.cc
@@ -470,7 +470,8 @@ int main(int argc, char *argv[])
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_right = primitive::link::impl::compute_fastest(functor, anchor::Top);
+// top_right = primitive::link::impl::compute_fastest(functor, anchor::Top);
+ top_right = primitive::link::compute(functor, anchor::Top);
t.stop();
--
1.5.6.5
1
0

last-svn-commit-682-ga0d5c6a Improve output of white space algorithm.
by Guillaume Lazzara 28 Mar '11
by Guillaume Lazzara 28 Mar '11
28 Mar '11
---
scribo/sandbox/z/white_spaces/white_spaces.cc | 45 ++++++++++++++++----
.../scribo/primitive/group/from_double_link_any.hh | 20 +++++----
2 files changed, 48 insertions(+), 17 deletions(-)
diff --git a/scribo/sandbox/z/white_spaces/white_spaces.cc b/scribo/sandbox/z/white_spaces/white_spaces.cc
index 54ef436..d32a631 100644
--- a/scribo/sandbox/z/white_spaces/white_spaces.cc
+++ b/scribo/sandbox/z/white_spaces/white_spaces.cc
@@ -59,8 +59,6 @@
#include <scribo/primitive/group/from_double_link_any.hh>
-#include <scribo/primitive/group/from_single_link.hh>
-
#include <scribo/filter/object_links_top_aligned.hh>
#include <scribo/filter/object_groups_small.hh>
#include <scribo/filter/object_links_bottom_aligned.hh>
@@ -411,6 +409,17 @@ int main(int argc, char *argv[])
gt.start();
+
+ // Remove horizontal lines.
+ t.restart();
+
+ image2d<bool> hlines = primitive::extract::lines_h_pattern(input, 50, 3);
+ input = primitive::remove::separators(input, hlines);
+
+ t_ = t;
+ std::cout << "Horizontal lines removed - " << t_ << std::endl;
+
+
// Closing structural - Connect characters.
t.restart();
@@ -832,12 +841,32 @@ int main(int argc, char *argv[])
io::pbm::save(output, "separators_hom.pbm");
io::pbm::save(separators, "separators_filtered.pbm");
}
- }
- t_ = t;
- std::cout << "Separator image - " << t_ << std::endl;
+ t.restart();
+ value::int_u16 ncomps;
+ component_set<L> comps = primitive::extract::components(output, c8(), ncomps);
+ image2d<value::rgb8> both;
+
+ both = data::convert(value::rgb8(), input);
+
+ // Needed since the rotated image origin is (0,0). Rotation does
+ // not preserve rotated coordinates.
+ dpoint2d dp(input.domain().pcenter() - input_clo.domain().pcenter());
+
+ for_all_comps(c, comps)
+ {
+ box2d b = geom::rotate(comps(c).bbox(), -90, input_clo.domain().pcenter());
+ mln::draw::line(both,
+ b.pmin() + dp,
+ b.pmax() + dp,
+ literal::green);
+ }
+ t_ = t;
+ std::cout << "Output image - " << t_ << std::endl;
+ gt.stop();
+ t_ = gt;
+ std::cout << "Total time: " << t_ << std::endl;
- gt.stop();
- t_ = gt;
- std::cout << "Total time: " << t_ << std::endl;
+ io::ppm::save(both, argv[5]);
+ }
}
diff --git a/scribo/scribo/primitive/group/from_double_link_any.hh b/scribo/scribo/primitive/group/from_double_link_any.hh
index b3bd82a..300ecd6 100644
--- a/scribo/scribo/primitive/group/from_double_link_any.hh
+++ b/scribo/scribo/primitive/group/from_double_link_any.hh
@@ -98,16 +98,18 @@ namespace scribo
else
parent(pi) = pli;
}
-
- pi = internal::find_root(parent, i);
- unsigned pri = internal::find_root(parent, right_link(i));
-
- if (pi != pri)
+ else
{
- if (pri < pi)
- parent(pri) = pi;
- else
- parent(pi) = pri;
+ pi = internal::find_root(parent, i);
+ unsigned pri = internal::find_root(parent, right_link(i));
+
+ if (pi != pri)
+ {
+ if (pri < pi)
+ parent(pri) = pi;
+ else
+ parent(pi) = pri;
+ }
}
}
--
1.5.6.5
1
0
---
scribo/scribo/primitive/extract/lines_h_pattern.hh | 2 +-
scribo/scribo/primitive/extract/lines_v_pattern.hh | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/scribo/scribo/primitive/extract/lines_h_pattern.hh b/scribo/scribo/primitive/extract/lines_h_pattern.hh
index 6a1f7f0..28be492 100644
--- a/scribo/scribo/primitive/extract/lines_h_pattern.hh
+++ b/scribo/scribo/primitive/extract/lines_h_pattern.hh
@@ -106,7 +106,7 @@ namespace scribo
mln_concrete(I) output = lines_pattern(input, length, 1, win);
- unsigned new_length = length / 2 + delta;
+ unsigned new_length = length + delta;
new_length += 1 - (new_length % 2); // Guaranty that new_length is odd.
mln_concrete(I)
diff --git a/scribo/scribo/primitive/extract/lines_v_pattern.hh b/scribo/scribo/primitive/extract/lines_v_pattern.hh
index 8a103ac..ada70eb 100644
--- a/scribo/scribo/primitive/extract/lines_v_pattern.hh
+++ b/scribo/scribo/primitive/extract/lines_v_pattern.hh
@@ -88,7 +88,7 @@ namespace scribo
mln_concrete(I) output = lines_pattern(input, length, 0, win);
- unsigned new_length = length / 2 + delta;
+ unsigned new_length = length + delta;
new_length += 1 - (new_length % 2); // Guaranty that new_length is odd.
mln_concrete(I)
--
1.5.6.5
1
0
---
scribo/scribo/toolchain/text_in_picture.hh | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/scribo/scribo/toolchain/text_in_picture.hh b/scribo/scribo/toolchain/text_in_picture.hh
index 9746645..19af9e3 100644
--- a/scribo/scribo/toolchain/text_in_picture.hh
+++ b/scribo/scribo/toolchain/text_in_picture.hh
@@ -135,7 +135,7 @@ namespace scribo
sauvola_min_w = 51u;
// Group Filtering
- bbox_h_ratio = 1.60f;
+ bbox_h_ratio = 1.75f;
bbox_overlap = 0.80f;
small_groups = 3;
v_thickness = 8;
--
1.5.6.5
1
0

last-svn-commit-685-g0af6845 Change Sauvola's window size for reverted image and filter width ratio.
by Guillaume Lazzara 28 Mar '11
by Guillaume Lazzara 28 Mar '11
28 Mar '11
---
scribo/scribo/toolchain/text_in_picture.hh | 11 +++++++++--
scribo/src/text_in_picture_neg.cc | 3 +++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/scribo/scribo/toolchain/text_in_picture.hh b/scribo/scribo/toolchain/text_in_picture.hh
index 19af9e3..18d3a8e 100644
--- a/scribo/scribo/toolchain/text_in_picture.hh
+++ b/scribo/scribo/toolchain/text_in_picture.hh
@@ -103,6 +103,7 @@ namespace scribo
component_set<mln_ch_value(I, value::label_16)>
text_in_picture(const Image<I>& input_rgb_orig,
bool bg_removal, bool multi_scale_bin,
+ unsigned win = 0,
unsigned max_dim_size = 0, unsigned lambda = 0,
const char *debug_outdir = 0);
@@ -136,7 +137,7 @@ namespace scribo
// Group Filtering
bbox_h_ratio = 1.75f;
- bbox_overlap = 0.80f;
+ bbox_overlap = 0.60f;
small_groups = 3;
v_thickness = 8;
regroup_dmax = 30;
@@ -167,6 +168,7 @@ namespace scribo
component_set<mln_ch_value(I, value::label_16)>
text_in_picture(const Image<I>& input_rgb_orig_,
bool bg_removal, bool multi_scale_bin,
+ unsigned win = 0,
unsigned max_dim_size = 0, unsigned lambda = 0,
const char *debug_outdir = 0)
{
@@ -246,7 +248,10 @@ namespace scribo
// Binarize foreground to use it in the processing chain.
timer_.restart();
mln_ch_value(I,bool) input;
- unsigned w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
+
+ unsigned w = win;
+ if (!w)
+ w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
if (! w % 2)
++w;
w = std::min(w, conf.sauvola_min_w);
@@ -347,6 +352,8 @@ namespace scribo
hratio_filtered_links = filter::object_links_bbox_h_ratio(merged_links,
conf.bbox_h_ratio);
+ hratio_filtered_links =
+ filter::object_links_bbox_w_ratio(hratio_filtered_links, 3);
diff --git a/scribo/src/text_in_picture_neg.cc b/scribo/src/text_in_picture_neg.cc
index 7d6694a..8b80b43 100644
--- a/scribo/src/text_in_picture_neg.cc
+++ b/scribo/src/text_in_picture_neg.cc
@@ -82,6 +82,7 @@
#include <scribo/filter/object_groups_with_holes.hh>
#include <scribo/filter/object_links_bbox_h_ratio.hh>
+#include <scribo/filter/object_links_bbox_w_ratio.hh>
#include <scribo/filter/object_links_bbox_overlap.hh>
#include <scribo/filter/common/objects_photo.hh>
@@ -166,6 +167,7 @@ int main(int argc, char* argv[])
typedef image2d<value::label_16> L;
component_set<L>
comps = toolchain::text_in_picture(input_rgb, bg_removal, multi_scale_bin,
+ 0,
max_dim_size, lambda, out_base_dir);
@@ -174,6 +176,7 @@ int main(int argc, char* argv[])
comps_neg = toolchain::text_in_picture(world::rgb::invert(input_rgb),
bg_removal,
multi_scale_bin,
+ 15,
max_dim_size, lambda, out_base_dir);
--
1.5.6.5
1
0

28 Mar '11
* scribo/toolchain/text_in_doc_preprocess.hh,
* scribo/toolchain/text_in_picture.hh: Do not negate Sauvola's
output anymore.
---
scribo/scribo/toolchain/text_in_picture.hh | 37 ++++++++++++++++++----------
1 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/scribo/scribo/toolchain/text_in_picture.hh b/scribo/scribo/toolchain/text_in_picture.hh
index 18d3a8e..f5fa5ba 100644
--- a/scribo/scribo/toolchain/text_in_picture.hh
+++ b/scribo/scribo/toolchain/text_in_picture.hh
@@ -249,21 +249,32 @@ namespace scribo
timer_.restart();
mln_ch_value(I,bool) input;
- unsigned w = win;
- if (!w)
- w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
- if (! w % 2)
- ++w;
- w = std::min(w, conf.sauvola_min_w);
- if (multi_scale_bin)
- {
- std::cout << "** Using sauvola_ms with w_1 = " << w << std::endl;
- input = scribo::binarization::sauvola_ms(intensity_ima, w, conf.sauvola_s);
- }
+
+
+ unsigned w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
+ if (win)
+ input = scribo::binarization::sauvola_ms_split(input_rgb, w,
+ conf.sauvola_s, 1);
else
{
- std::cout << "** Using sauvola with w_1 = " << w << std::endl;
- input = scribo::binarization::sauvola(intensity_ima, w);
+
+ unsigned w = win;
+ if (!w)
+ w = std::min(intensity_ima.nrows() / 3, intensity_ima.ncols() / 3);
+ if (! w % 2)
+ ++w;
+ w = std::min(w, conf.sauvola_min_w);
+
+ if (multi_scale_bin)
+ {
+ std::cout << "** Using sauvola_ms with w_1 = " << w << std::endl;
+ input = scribo::binarization::sauvola_ms(intensity_ima, w, conf.sauvola_s);
+ }
+ else
+ {
+ std::cout << "** Using sauvola with w_1 = " << w << std::endl;
+ input = scribo::binarization::sauvola(intensity_ima, w);
+ }
}
if (debug)
--
1.5.6.5
1
0
---
.../primitive/group/from_single_link_robust.hh} | 25 +-
.../scribo/primitive/internal/find_root_robust.hh} | 23 +-
.../{white_spaces.cc => svg.white_spaces.cc} | 577 +++++++++++--------
scribo/sandbox/z/white_spaces/white_spaces | Bin 0 -> 352469 bytes
.../{white_spaces.cc => white_spaces.cc.bak} | 532 +++++++------------
...es.cc => white_spaces.cc.bak.left_right_merged} | 544 +++++++-----------
6 files changed, 756 insertions(+), 945 deletions(-)
copy scribo/{scribo/primitive/group/from_single_link.hh => sandbox/z/scribo/primitive/group/from_single_link_robust.hh} (79%)
copy scribo/{scribo/primitive/internal/find_root.hh => sandbox/z/scribo/primitive/internal/find_root_robust.hh} (74%)
copy scribo/sandbox/z/white_spaces/{white_spaces.cc => svg.white_spaces.cc} (57%)
create mode 100755 scribo/sandbox/z/white_spaces/white_spaces
copy scribo/sandbox/z/white_spaces/{white_spaces.cc => white_spaces.cc.bak} (57%)
copy scribo/sandbox/z/white_spaces/{white_spaces.cc => white_spaces.cc.bak.left_right_merged} (58%)
diff --git a/scribo/scribo/primitive/group/from_single_link.hh b/scribo/sandbox/z/scribo/primitive/group/from_single_link_robust.hh
similarity index 79%
copy from scribo/scribo/primitive/group/from_single_link.hh
copy to scribo/sandbox/z/scribo/primitive/group/from_single_link_robust.hh
index 05efdc7..b8186bb 100644
--- a/scribo/scribo/primitive/group/from_single_link.hh
+++ b/scribo/sandbox/z/scribo/primitive/group/from_single_link_robust.hh
@@ -23,8 +23,8 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_HH
-# define SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_HH
+#ifndef SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_ROBUST_HH
+# define SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_ROBUST_HH
/// \file
///
@@ -38,7 +38,7 @@
# include <mln/util/array.hh>
-# include <scribo/primitive/internal/find_root.hh>
+# include <scribo/primitive/internal/find_root_robust.hh>
# include <scribo/core/object_groups.hh>
# include <scribo/core/object_links.hh>
@@ -67,7 +67,7 @@ namespace scribo
*/
template <typename L>
object_groups<L>
- from_single_link(const object_links<L>& links);
+ from_single_link_robust(const object_links<L>& links);
# ifndef MLN_INCLUDE_ONLY
@@ -75,12 +75,13 @@ namespace scribo
template <typename L>
inline
object_groups<L>
- from_single_link(const object_links<L>& links)
+ from_single_link_robust(const object_links<L>& links)
{
- trace::entering("scribo::primitive::group::from_single_link");
+ trace::entering("scribo::primitive::group::from_single_link_robust");
mln_precondition(links.is_valid());
+ util::array<bool> deja_vu(links.nelements(), false);
object_groups<L> parent(links);
parent.init_(links);
@@ -88,15 +89,9 @@ namespace scribo
if (!links.components()(i).is_valid())
parent(i) = 0;
else
- ::scribo::primitive::internal::find_root(parent, i);
+ primitive::internal::find_root_robust(parent, i, deja_vu);
-
- // FIXME: useful?
- // Make sure the root is propagated.
- for_all_groups(g, parent)
- internal::find_root(parent, g);
-
- trace::exiting("scribo::primitive::group::from_single_link");
+ trace::exiting("scribo::primitive::group::from_single_link_robust");
return parent;
}
@@ -108,4 +103,4 @@ namespace scribo
} // end of namespace scribo
-#endif // ! SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_HH
+#endif // ! SCRIBO_PRIMITIVE_GROUP_FROM_SINGLE_LINK_ROBUST_HH
diff --git a/scribo/scribo/primitive/internal/find_root.hh b/scribo/sandbox/z/scribo/primitive/internal/find_root_robust.hh
similarity index 74%
copy from scribo/scribo/primitive/internal/find_root.hh
copy to scribo/sandbox/z/scribo/primitive/internal/find_root_robust.hh
index aafa4ee..6ea1d1e 100644
--- a/scribo/scribo/primitive/internal/find_root.hh
+++ b/scribo/sandbox/z/scribo/primitive/internal/find_root_robust.hh
@@ -1,5 +1,4 @@
-// Copyright (C) 2009, 2010 EPITA Research and Development Laboratory
-// (LRDE)
+// Copyright (C) 2010 EPITA Research and Development Laboratory (LRDE)
//
// This file is part of Olena.
//
@@ -24,8 +23,8 @@
// exception does not however invalidate any other reasons why the
// executable file might be covered by the GNU General Public License.
-#ifndef SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_HH
-# define SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_HH
+#ifndef SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_ROBUST_HH
+# define SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_ROBUST_HH
/// \file
///
@@ -47,19 +46,25 @@ namespace scribo
/// Find root in a parent array arrays.
template <typename L>
unsigned
- find_root(object_groups<L>& parent, unsigned x);
+ find_root_robust(object_groups<L>& parent, unsigned x,
+ util::array<bool>& deja_vu);
+
# ifndef MLN_INCLUDE_ONLY
template <typename L>
inline
unsigned
- find_root(object_groups<L>& parent, unsigned x)
+ find_root_robust(object_groups<L>& parent, unsigned x,
+ util::array<bool>& deja_vu)
{
- if (parent(x) == x)
+ deja_vu(x) = true;
+ if (deja_vu(x))
+ return parent(x);
+ else if (parent(x) == x)
return x;
else
- return parent(x) = find_root(parent, parent(x));
+ return parent(x) = find_root_robust(parent, parent(x), deja_vu);
}
# endif // ! MLN_INCLUDE_ONLY
@@ -71,4 +76,4 @@ namespace scribo
} // end of namespace scribo
-#endif // ! SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_HH
+#endif // ! SCRIBO_PRIMITIVE_INTERNAL_FIND_ROOT_ROBUST_HH
diff --git a/scribo/sandbox/z/white_spaces/white_spaces.cc b/scribo/sandbox/z/white_spaces/svg.white_spaces.cc
similarity index 57%
copy from scribo/sandbox/z/white_spaces/white_spaces.cc
copy to scribo/sandbox/z/white_spaces/svg.white_spaces.cc
index d832d58..ebb44e5 100644
--- a/scribo/sandbox/z/white_spaces/white_spaces.cc
+++ b/scribo/sandbox/z/white_spaces/svg.white_spaces.cc
@@ -11,7 +11,6 @@
#include <mln/labeling/colorize.hh>
#include <mln/labeling/relabel.hh>
-#include <mln/labeling/blobs.hh>
#include <mln/morpho/closing/structural.hh>
#include <mln/morpho/closing/area.hh>
@@ -72,11 +71,6 @@ namespace mln
using namespace scribo;
-
- // Enable debug.
- bool _debug_;
-
-
template <typename L>
void filter_bad_groups(object_groups<L>& top_groups,
object_groups<L>& bot_groups)
@@ -186,11 +180,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
mln_site(L)
start_point_(unsigned current_object, anchor::Type anchor)
@@ -221,10 +210,14 @@ namespace mln
dist = math::abs(p[this->direction_] - b.pmin()[this->direction_]);
+// int ldist = std::max(this->components_(current_object).bbox().width() / 2,
+// this->components_(this->labeled_image_(p)).bbox().width() / 2);
+
int ldist = this->components_(current_object).bbox().width();
// Components are really close, so the angle is more permissive.
if (dist < 3 * ldist)
+// if (dist < (ldist + 0.7 * ldist))
{
return
filter::internal::component_aligned_rad(this->components_,
@@ -251,13 +244,40 @@ namespace mln
{
super_::validate_link_(current_object, start_point, p, anchor);
- if (_debug_)
+ mln_site(L)
+ p1 = mln::my_anchors(this->components_, current_object, anchor),
+ p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
+ anchor);
+ draw::line(debug_, p1, p2, literal::green);
+
+
+ float
+ angle = filter::internal::alignment_angle(this->components_,
+ current_object,
+ this->labeled_image_(p),
+ anchor);
+ angle = (angle * 180.0f) / math::pi;
+ angle = angle * 20.0f + 1.0f;
+ draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
+ }
+
+ void invalidate_link_(unsigned current_object,
+ const P& start_point,
+ const P& p,
+ anchor::Type anchor)
+ {
+ super_::invalidate_link_(current_object, start_point, p, anchor);
+
+ if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
{
mln_site(L)
p1 = mln::my_anchors(this->components_, current_object, anchor),
p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
anchor);
- draw::line(debug_, p1, p2, literal::green);
+ if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
+ {
+ draw::line(debug_, p1, p2, literal::red);
+ }
float
@@ -271,39 +291,6 @@ namespace mln
}
}
- void invalidate_link_(unsigned current_object,
- const P& start_point,
- const P& p,
- anchor::Type anchor)
- {
- super_::invalidate_link_(current_object, start_point, p, anchor);
-
- if (_debug_)
- {
- if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
- {
- mln_site(L)
- p1 = mln::my_anchors(this->components_, current_object, anchor),
- p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
- anchor);
- if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
- {
- draw::line(debug_, p1, p2, literal::red);
- }
-
-
- float
- angle = filter::internal::alignment_angle(this->components_,
- current_object,
- this->labeled_image_(p),
- anchor);
- angle = (angle * 180.0f) / math::pi;
- angle = angle * 20.0f + 1.0f;
- draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
- }
- }
- }
-
float min_alpha_rad;
float max_alpha_rad;
@@ -341,11 +328,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
};
@@ -375,12 +357,6 @@ namespace mln
--p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- --p;
- }
-
-
};
}
@@ -397,45 +373,41 @@ int main(int argc, char *argv[])
return 1;
};
- _debug_ = (argc == 7);
+ bool debug = (argc == 7);
- util::timer t;
- util::timer gt;
-
- // Load (OK)
- t.start();
image2d<bool> input;
mln::io::pbm::load(input, argv[1]);
- float t_ = t;
- std::cout << "Image loaded - " << t_ << std::endl;
- gt.start();
+ util::timer t;
- // Closing structural - Connect characters.
- t.restart();
+ t.start();
+ input = scribo::preprocessing::rotate_90(input);
+ float t_ = t;
+ std::cout << "rotate_90 - " << t_ << std::endl;
- win::hline2d vl(17);
- image2d<bool> input_clo = morpho::closing::structural(input, vl);
-// input_clo = scribo::preprocessing::rotate_90(input_clo, true);
+ t.start();
+ image2d<bool> hsep
+ = scribo::primitive::extract::lines_h_pattern(input, 200, 3);
+ if (debug)
+ io::pbm::save(hsep, "hsep.pbm");
+ input = scribo::primitive::remove::separators(input, hsep);
t_ = t;
- std::cout << "closing_structural - " << t_ << std::endl;
+ std::cout << "Remove separators - " << t_ << std::endl;
- if (_debug_)
- {
- // Restore input orientation.
- input = scribo::preprocessing::rotate_90(input, false);
+ if (debug)
+ io::pbm::save(input, "input_sep_removed.pbm");
- io::pbm::save(input_clo, "input_clo.pbm");
- }
- // Rotate (OK)
t.restart();
- input_clo = scribo::preprocessing::rotate_90(input_clo, false);
+ win::vline2d vl(17);
+ image2d<bool> input_clo = morpho::closing::structural(input, vl);
t_ = t;
- std::cout << "rotate_90 - " << t_ << std::endl;
+ std::cout << "closing_structural - " << t_ << std::endl;
+ if (debug)
+ io::pbm::save(input_clo, "input_clo.pbm");
/// Finding components.
@@ -450,13 +422,22 @@ int main(int argc, char *argv[])
t_ = t;
std::cout << "extract::components - " << t_ << std::endl;
- if (_debug_)
+ if (debug)
io::pgm::save(data::convert(value::int_u8(), components.labeled_image()),
"lbl.pgm");
unsigned min_angle = atoi(argv[2]), max_angle = atoi(argv[3]);
+// t.restart();
+// object_links<L>
+// top_right = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Top);
+
+// object_links<L>
+// bot_right = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Bottom);
+// t_ = t;
+// std::cout << "links - " << t_ << std::endl;
+
unsigned dmax = 5;
t.restart();
@@ -470,17 +451,11 @@ int main(int argc, char *argv[])
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_right = primitive::link::impl::compute_fastest(functor, anchor::Top);
+ top_right = primitive::link::compute(functor, anchor::Top);
t.stop();
-
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_top.ppm");
- io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
- }
-
+ io::ppm::save(functor.debug_, "right_top.ppm");
+ io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
t.resume();
// Left
@@ -488,20 +463,14 @@ int main(int argc, char *argv[])
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
top_left = primitive::link::compute(lfunctor, anchor::Top);
-
t.stop();
+ io::ppm::save(lfunctor.debug_, "left_top.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
- if (_debug_)
- {
- io::ppm::save(lfunctor.debug_, "left_top.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
-
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
-
- io::ppm::save(output, "left_right_top.ppm");
- }
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
+ io::ppm::save(output, "left_right_top.ppm");
t.resume();
}
@@ -513,13 +482,8 @@ int main(int argc, char *argv[])
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
bot_right = primitive::link::compute(functor, anchor::Bottom);
t.stop();
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_bot.ppm");
- io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
- }
-
+ io::ppm::save(functor.debug_, "right_bot.ppm");
+ io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
t.resume();
// Left
@@ -527,23 +491,137 @@ int main(int argc, char *argv[])
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
bot_left = primitive::link::compute(lfunctor, anchor::Bottom);
t.stop();
+ io::ppm::save(lfunctor.debug_, "left_bot.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
+ t.resume();
- if (_debug_)
- {
- io::ppm::save(lfunctor.debug_, "left_bot.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
- }
-
- if (_debug_)
- {
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
+ t.stop();
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
- io::ppm::save(output, "left_right_bot.ppm");
- }
+ io::ppm::save(output, "left_right_bot.ppm");
+ t.resume();
}
+// std::cout << top_right << std::endl;
+// std::cout << "--------" << std::endl;
+// std::cout << bot_right << std::endl;
+// std::cout << "--------" << std::endl;
+// std::cout << top_left << std::endl;
+// std::cout << "--------" << std::endl;
+// std::cout << bot_left << std::endl;
+// std::cout << "--------" << std::endl;
+// std::cout << "--------" << std::endl;
+// std::cout << "--------" << std::endl;
+
+
+// std::cout << primitive::group::from_double_link_any(components, top_left, top_right) << std::endl;
+// std::cout << "--------" << std::endl;
+
+
+// // Merge links results.
+// // object_groups<L> top_groups(top_right), bot_groups(bot_right);
+// {
+// for_all_groups(i, top_left)
+// {
+// if (top_right(top_left(i)) == top_left(i)
+// && top_left(i) != i
+// && top_right(i) != top_left(i))
+// top_right(top_left(i)) = i;
+
+// if (bot_right(bot_left(i)) == bot_left(i)
+// && bot_left(i) != i
+// && bot_right(i) != bot_left(i))
+// bot_right(bot_left(i)) = i;
+// }
+
+// std::cout << top_right << std::endl;
+// std::cout << "--------" << std::endl;
+
+
+
+// std::cout << bot_right << std::endl;
+// std::cout << "--------" << std::endl;
+
+// top_groups.init_(top_right);
+// bot_groups.init_(bot_right);
+
+// // Grouping.
+// for_all_groups(i, top_groups)
+// {
+// if (!top_right.components()(i).is_valid())
+// top_groups(i) = 0;
+// else
+// primitive::internal::find_root(top_groups, i);
+
+// if (!bot_right.components()(i).is_valid())
+// bot_groups(i) = 0;
+// else
+// primitive::internal::find_root(bot_groups, i);
+// }
+
+// // Grouping groups.
+// object_groups<L>
+// top_group_relabel(top_right),
+// bot_group_relabel(bot_right);
+// for (unsigned n = 0; n < top_group_relabel.nelements(); ++n)
+// {
+// top_group_relabel(n) = n;
+// bot_group_relabel(n) = n;
+// }
+
+// for_all_links(l, top_right)
+// {
+// if (top_left(l) != l
+// && top_right(l) != top_left(l))
+// {
+// // If there is no links, connect directly. Otherwise, prefer
+// // connecting to the component with the lower pmin row.
+// if ((top_right(top_left(l)) == top_left(l)))
+// // ||
+// // (std::abs(components(bot_left(l)).bbox().pmin().row() - components(bot_right(bot_left(l))).bbox().pmin().row()) > std::abs(components(bot_left(l)).bbox().pmin().row() - components(l).bbox().pmin().row())))
+// top_group_relabel(top_groups(top_left(l))) = top_groups(l);
+// //else
+// // The right link is already the best link possible.
+
+// }
+
+// if (bot_left(l) != l
+// && bot_right(l) != bot_left(l))
+// {
+// // If there is no links, connect directly. Otherwise, prefer
+// // connecting to the component which is the most aligned.
+// if ((bot_right(bot_left(l)) == bot_left(l)))
+// // ||
+// // (std::abs(components(bot_left(l)).bbox().pmax().row() - components(bot_right(bot_left(l))).bbox().pmax().row()) > std::abs(components(bot_left(l)).bbox().pmax().row() - components(l).bbox().pmax().row())))
+// bot_group_relabel(bot_groups(bot_left(l))) = bot_groups(l);
+// //else
+// // The right link is already the best link possible.
+
+// }
+
+// }
+
+// for_all_groups(i, top_groups)
+// {
+// primitive::internal::find_root(top_group_relabel, i);
+// primitive::internal::find_root(bot_group_relabel, i);
+// }
+
+// // Relabeling groups according to previous grouping.
+// for_all_groups(i, top_groups)
+// {
+// if (top_group_relabel(top_groups(i)) != top_groups(i))
+// top_groups(i) = top_group_relabel(top_groups(i));
+
+// if (bot_group_relabel(bot_groups(i)) != bot_groups(i))
+// bot_groups(i) = bot_group_relabel(bot_groups(i));
+// }
+
+// }
+
+
t_ = t;
std::cout << "links - " << t_ << std::endl;
@@ -558,6 +636,10 @@ int main(int argc, char *argv[])
t_ = t;
std::cout << "group - " << t_ << std::endl;
+// std::cout << top_groups << std::endl;
+// std::cout << "------------" << std::endl;
+// std::cout << bot_groups << std::endl;
+// std::cout << "------------" << std::endl;
unsigned min_card = atoi(argv[4]);
@@ -578,39 +660,36 @@ int main(int argc, char *argv[])
- if (_debug_)
- {
-
- image2d<value::rgb8>
- wo_filtering = data::convert(value::rgb8(), input);
+ image2d<value::rgb8>
+ wo_filtering = data::convert(value::rgb8(), input);
- for_all_comp_data(d, btop_accu)
+ for_all_comp_data(d, btop_accu)
+ {
+ if (btop_accu(d).is_valid())
{
- if (btop_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- btop_accu(d).to_result().pmin(),
- point2d(btop_accu(d).to_result().pmin().row(),
- btop_accu(d).to_result().pmax().col()),
- literal::green);
+ mln::draw::line(wo_filtering,
+ btop_accu(d).to_result().pmin(),
+ point2d(btop_accu(d).to_result().pmin().row(),
+ btop_accu(d).to_result().pmax().col()),
+ literal::green);
- }
}
+ }
- for_all_comp_data(d, bbot_accu)
+ for_all_comp_data(d, bbot_accu)
+ {
+ if (bbot_accu(d).is_valid())
{
- if (bbot_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- point2d(bbot_accu(d).to_result().pmax().row(),
- bbot_accu(d).to_result().pmin().col()),
- bbot_accu(d).to_result().pmax(),
- literal::green);
- }
-
+ mln::draw::line(wo_filtering,
+ point2d(bbot_accu(d).to_result().pmax().row(),
+ bbot_accu(d).to_result().pmin().col()),
+ bbot_accu(d).to_result().pmax(),
+ literal::green);
}
- io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
}
+ io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
t.restart();
@@ -621,6 +700,13 @@ int main(int argc, char *argv[])
+// t.restart();
+// filter_bad_groups(top_groups, bot_groups);
+// t_ = t;
+// std::cout << "bad groups - " << t_ << std::endl;
+
+
+
t.restart();
util::array<accu::shape::bbox<point2d> >
top_accu(top_groups.nelements()),
@@ -642,16 +728,12 @@ int main(int argc, char *argv[])
- t.restart();
- image2d<bool> separators;
- initialize(separators, input_clo);
- data::fill(separators, false);
- t_ = t;
- std::cout << "Initialize separators image - " << t_ << std::endl;
- image2d<value::rgb8> both;
+ image2d<bool> separators;// = duplicate(input_clo);
+ initialize(separators, input);
+ data::fill(separators, false);
- if (_debug_)
+ image2d<value::rgb8>
both = data::convert(value::rgb8(), input);
@@ -663,12 +745,11 @@ int main(int argc, char *argv[])
{
if (top_accu(d).is_valid())
{
- if (_debug_)
- mln::draw::line(both,
- top_accu(d).to_result().pmin(),
- point2d(top_accu(d).to_result().pmin().row(),
- top_accu(d).to_result().pmax().col()),
- literal::green);
+ mln::draw::line(both,
+ top_accu(d).to_result().pmin(),
+ point2d(top_accu(d).to_result().pmin().row(),
+ top_accu(d).to_result().pmax().col()),
+ literal::green);
mln::draw::line(separators,
top_accu(d).to_result().pmin(),
@@ -677,7 +758,7 @@ int main(int argc, char *argv[])
true);
}
else
- if (_debug_ && btop_accu(d).is_valid())
+ if (btop_accu(d).is_valid())
mln::draw::line(both,
btop_accu(d).to_result().pmin(),
point2d(btop_accu(d).to_result().pmin().row(),
@@ -689,13 +770,11 @@ int main(int argc, char *argv[])
{
if (bot_accu(d).is_valid())
{
- if (_debug_)
- mln::draw::line(both,
- point2d(bot_accu(d).to_result().pmax().row(),
- bot_accu(d).to_result().pmin().col()),
- bot_accu(d).to_result().pmax(),
- literal::green);
-
+ mln::draw::line(both,
+ point2d(bot_accu(d).to_result().pmax().row(),
+ bot_accu(d).to_result().pmin().col()),
+ bot_accu(d).to_result().pmax(),
+ literal::green);
mln::draw::line(separators,
point2d(bot_accu(d).to_result().pmax().row(),
bot_accu(d).to_result().pmin().col()),
@@ -703,7 +782,7 @@ int main(int argc, char *argv[])
true);
}
else
- if (_debug_ && bbot_accu(d).is_valid())
+ if (bbot_accu(d).is_valid())
mln::draw::line(both,
point2d(bbot_accu(d).to_result().pmax().row(),
bbot_accu(d).to_result().pmin().col()),
@@ -716,88 +795,119 @@ int main(int argc, char *argv[])
std::cout << "Drawing output image - " << t_ << std::endl;
- if (_debug_)
- {
- io::ppm::save(both, argv[5]);
- io::pbm::save(separators, "separators.pbm");
- }
+ io::ppm::save(both, argv[5]);
+ io::pbm::save(separators, "separators.pbm");
+
+// // Hit or miss
+// {
+// t.restart();
+// unsigned length = 100;
+
+// window2d win;
+// dpoint2d
+// dp1(-11, 0),
+// dp2( 11, 0);
+// win.insert(dp1);
+// win.insert(dp2);
+
+// // Adjusting extension.
+// extension::adjust_fill(separators, length / 2, 0);
+
+// accu::count_value<bool> accu(true);
+// typedef image2d<unsigned> I;
+
+// I tmp = accu::transform_line(accu, separators, length, 1);
+
+// image2d<bool> output;
+// initialize(output, separators);
+
+// mln_piter_(I) p(separators.domain());
+// // mln_qiter(window2d) q(win, p);
+// bool is_foreground;
+// for_all(p)
+// {
+
+// if (tmp(p) > unsigned(0.95f * length) + 1)
+// {
+// output(p) = false;
+// continue;
+// }
+
+// is_foreground = true;
+
+// unsigned
+// top_count = tmp(p + dp1),
+// bot_count = tmp(p + dp2);
+
+// if (top_count >= unsigned(length * 0.7f) + 1
+// && bot_count >= unsigned(length * 0.7f) + 1)
+// is_foreground = false;
+
+// output(p) = is_foreground;
+
+// }
+
+// io::pbm::save(output, "separators_hom.pbm");
+// }
+
+// std::cout << "Separator image - " << t_ << std::endl;
// Hit or miss
{
- if (_debug_)
- {
- image2d<bool> input_with_seps = duplicate(input_clo);
- data::paste(separators | pw::value(separators), input_with_seps);
+ image2d<bool> input_with_seps = duplicate(input_clo);
+ data::paste(separators | pw::value(separators), input_with_seps);
+ if (debug)
io::pbm::save(input_with_seps, "input_with_seps.pbm");
- }
t.restart();
- unsigned length = 25;
+ unsigned length = 100;
dpoint2d
dp1(-21, 0),
dp2( 21, 0);
// Adjusting extension.
- t.restart();
- extension::adjust_fill(input_clo, length / 2, 0);
+ extension::adjust_fill(separators, length / 2, 0);
accu::count_value<bool> accu(true);
typedef image2d<unsigned> I;
- I tmp = accu::transform_line(accu, input_clo, length, 1);
- t_ = t;
- std::cout << "* accu::transform_line - " << t_ << std::endl;
+ I tmp = accu::transform_line(accu, input_with_seps, length, 1);
- if (_debug_)
+ if (debug)
io::pgm::save(data::convert(value::int_u8(), tmp), "tmp.pgm");
+ image2d<bool> output;
+ initialize(output, separators);
+ data::fill(output, false);
- t.restart();
value::int_u8 nlabels;
image2d<value::int_u8>
- sep_lbl = labeling::value(separators, true, c8(), nlabels);
- t_ = t;
- std::cout << "* labeling seps - " << t_ << std::endl;
+ sep_lbl = labeling::blobs(separators, c8(), nlabels);
+ mln_piter_(I) p(separators.domain());
- t.restart();
-// util::array<unsigned> lcard(unsigned(nlabels) + 1, 0);
-// util::array<unsigned> lfalse(unsigned(nlabels) + 1, 0);
+ util::array<unsigned> lcard(unsigned(nlabels) + 1, 0);
+ util::array<unsigned> lfalse(unsigned(nlabels) + 1, 0);
util::array<bool> relbl(unsigned(nlabels) + 1, true);
relbl(0) = false;
-
-// unsigned
-// tmp_next_line_dp1 = tmp.delta_index(dp1),
-// tmp_next_line_dp2 = tmp.delta_index(dp2);
-
-// const mln_value(I)* val_sep = &separators(separators.domain().pmin());
-// const value::int_u8* val_lbl = &sep_lbl(sep_lbl.domain().pmin());
-
-// bool go_next = false;
- unsigned invalid_ratio = unsigned(length * 0.30f);
-
-// for (unsigned row = 0; i < nrows; ++row)
-// {
-// for (unsigned col = 0; col < ncols; ++col)
-// {
-
-// }
-
-// val_sep += ;
-// val_lbl += ;
-// }
-
- mln_piter_(I) p(separators.domain());
for_all(p)
if (separators(p))
{
unsigned lbl = sep_lbl(p);
-// ++lcard(lbl);
+ ++lcard(lbl);
+
+// Useless since we already work on selected lines (separators image).
+//
+// if (tmp(p) > unsigned(0.95f * length) + 1)
+// {
+// output(p) = false;
+// continue;
+// }
unsigned
top_count = tmp(p + dp1),
@@ -805,38 +915,19 @@ int main(int argc, char *argv[])
// This site is wrapped between two lines of text so we don't
// want it.
- if (top_count >= invalid_ratio + 1
- && bot_count >= invalid_ratio + 1)
- {
- relbl(lbl) = false;
-// go_next = true;
- }
-// ++lfalse(lbl);
+ if (top_count >= unsigned(length * 0.30f) + 1
+ && bot_count >= unsigned(length * 0.30f) + 1)
+ ++lfalse(lbl);
}
-// for_all_comps(i, relbl)
-// relbl(i) = (lfalse(i) / (float) lcard(i)) < 0.02f;
- t_ = t;
- std::cout << "* reading data - " << t_ << std::endl;
+ for_all_comps(i, relbl)
+ relbl(i) = (lfalse(i) / (float) lcard(i)) < 0.02f;
- t.restart();
labeling::relabel_inplace(sep_lbl, nlabels, relbl);
- t_ = t;
- std::cout << "* relabel_inplace - " << t_ << std::endl;
-
- image2d<bool> output = data::convert(bool(), sep_lbl);
+ data::paste(sep_lbl | (pw::value(sep_lbl) != pw::cst(0)), output);
- if (_debug_)
- {
- io::pbm::save(output, "separators_hom.pbm");
- io::pbm::save(separators, "separators_filtered.pbm");
- }
+ io::pbm::save(output, "separators_hom.pbm");
}
- t_ = t;
std::cout << "Separator image - " << t_ << std::endl;
-
- gt.stop();
- t_ = gt;
- std::cout << "Total time: " << t_ << std::endl;
}
diff --git a/scribo/sandbox/z/white_spaces/white_spaces b/scribo/sandbox/z/white_spaces/white_spaces
new file mode 100755
index 0000000000000000000000000000000000000000..8f0732ee368e0ae331d8868c395d9b6e927a23b8
GIT binary patch
literal 352469
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%0AOk5rU%7HD;-O$KKRUB3OdBAi
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
literal 0
HcmV?d00001
diff --git a/scribo/sandbox/z/white_spaces/white_spaces.cc b/scribo/sandbox/z/white_spaces/white_spaces.cc.bak
similarity index 57%
copy from scribo/sandbox/z/white_spaces/white_spaces.cc
copy to scribo/sandbox/z/white_spaces/white_spaces.cc.bak
index d832d58..1f491ca 100644
--- a/scribo/sandbox/z/white_spaces/white_spaces.cc
+++ b/scribo/sandbox/z/white_spaces/white_spaces.cc.bak
@@ -10,8 +10,6 @@
#include <mln/labeling/colorize.hh>
-#include <mln/labeling/relabel.hh>
-#include <mln/labeling/blobs.hh>
#include <mln/morpho/closing/structural.hh>
#include <mln/morpho/closing/area.hh>
@@ -43,24 +41,17 @@
#include <mln/norm/l1.hh>
#include <scribo/core/object_groups.hh>
-#include <scribo/core/component_set.hh>
#include <scribo/primitive/extract/components.hh>
#include <scribo/primitive/extract/lines_h_pattern.hh>
#include <scribo/primitive/remove/separators.hh>
-
+#include <scribo/primitive/group/from_single_link.hh>
#include <scribo/preprocessing/denoise_fg.hh>
#include <scribo/preprocessing/rotate_90.hh>
-#include <scribo/primitive/link/internal/dmax_default.hh>
-
#include <scribo/primitive/link/with_single_right_link_dmax_ratio.hh>
#include <scribo/primitive/link/with_single_right_link_dmax_ratio_aligned.hh>
-#include <scribo/primitive/group/from_double_link_any.hh>
-
-#include <scribo/primitive/group/from_single_link.hh>
-
#include <scribo/filter/object_links_top_aligned.hh>
#include <scribo/filter/object_groups_small.hh>
#include <scribo/filter/object_links_bottom_aligned.hh>
@@ -72,11 +63,6 @@ namespace mln
using namespace scribo;
-
- // Enable debug.
- bool _debug_;
-
-
template <typename L>
void filter_bad_groups(object_groups<L>& top_groups,
object_groups<L>& bot_groups)
@@ -120,27 +106,26 @@ namespace mln
unsigned current_object,
anchor::Type anchor)
{
- mln_site(L) sp;// = comps(current_object).bbox().pcenter();
+ mln_site(L) sp = comps(current_object).bbox().pcenter();
+
+ unsigned h = comps(current_object).bbox().pmax().row()
+ - comps(current_object).bbox().pmin().row();
- unsigned h = comps(current_object).bbox().height();
switch (anchor)
{
default:
return sp;
-
// Bounding box top center
- case anchor::Top: // FIXME: rename as TopLeft
- sp.col() = comps(current_object).bbox().pmin().col();
+ case anchor::Top:
sp.row() = comps(current_object).bbox().pmin().row()
+ math::min(2u, (h + 1) / 2 - 1);
break;
// Bounding box bottom center
- case anchor::Bottom: // FIXME: rename as BottomLeft
- sp.col() = comps(current_object).bbox().pmax().col();
+ case anchor::Bottom:
sp.row() = comps(current_object).bbox().pmax().row()
- math::min(2u, (h + 1) / 2 - 1);
break;
@@ -155,10 +140,10 @@ namespace mln
template <typename L, typename E>
class single_dmax_ratio_aligned_functor_base
- : public link_single_dmax_ratio_base<L, dmax_default, E>
+ : public link_single_dmax_ratio_base<L, E>
{
// typedef single_right_dmax_ratio_aligned_functor<L> self_t;
- typedef link_single_dmax_ratio_base<L, dmax_default, E> super_;
+ typedef link_single_dmax_ratio_base<L, E> super_;
public:
typedef mln_site(L) P;
@@ -170,13 +155,16 @@ namespace mln
float min_angle,
float max_angle,
anchor::Type anchor_)
- : super_(components,
- anchor::Horizontal,
- dmax_default(dmax)),
- anchor(anchor_),
+ : super_(components, dmax, anchor::Horizontal), anchor(anchor_),
debug_(data::convert(value::rgb8(), input)),
debug_angle_(data::convert(value::rgb8(), input))
{
+ std::cout << "min_angle = " << min_angle
+ << " - max_angle = " << max_angle
+ << std::endl;
+ std::cout << "min_angle_rad = " << min_alpha_rad
+ << " - max_angle_rad = " << max_alpha_rad
+ << std::endl;
min_alpha_rad = (min_angle / 180.0f) * math::pi;
max_alpha_rad = (max_angle / 180.0f) * math::pi;
}
@@ -186,11 +174,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
mln_site(L)
start_point_(unsigned current_object, anchor::Type anchor)
@@ -221,10 +204,14 @@ namespace mln
dist = math::abs(p[this->direction_] - b.pmin()[this->direction_]);
+// int ldist = std::max(this->components_(current_object).bbox().width() / 2,
+// this->components_(this->labeled_image_(p)).bbox().width() / 2);
+
int ldist = this->components_(current_object).bbox().width();
// Components are really close, so the angle is more permissive.
if (dist < 3 * ldist)
+// if (dist < (ldist + 0.7 * ldist))
{
return
filter::internal::component_aligned_rad(this->components_,
@@ -251,13 +238,40 @@ namespace mln
{
super_::validate_link_(current_object, start_point, p, anchor);
- if (_debug_)
+ mln_site(L)
+ p1 = mln::my_anchors(this->components_, current_object, anchor),
+ p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
+ anchor);
+ draw::line(debug_, p1, p2, literal::green);
+
+
+ float
+ angle = filter::internal::alignment_angle(this->components_,
+ current_object,
+ this->labeled_image_(p),
+ anchor);
+ angle = (angle * 180.0f) / math::pi;
+ angle = angle * 20.0f + 1.0f;
+ draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
+ }
+
+ void invalidate_link_(unsigned current_object,
+ const P& start_point,
+ const P& p,
+ anchor::Type anchor)
+ {
+ super_::invalidate_link_(current_object, start_point, p, anchor);
+
+ if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
{
mln_site(L)
p1 = mln::my_anchors(this->components_, current_object, anchor),
p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
anchor);
- draw::line(debug_, p1, p2, literal::green);
+ if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
+ {
+ draw::line(debug_, p1, p2, literal::red);
+ }
float
@@ -271,39 +285,6 @@ namespace mln
}
}
- void invalidate_link_(unsigned current_object,
- const P& start_point,
- const P& p,
- anchor::Type anchor)
- {
- super_::invalidate_link_(current_object, start_point, p, anchor);
-
- if (_debug_)
- {
- if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
- {
- mln_site(L)
- p1 = mln::my_anchors(this->components_, current_object, anchor),
- p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
- anchor);
- if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
- {
- draw::line(debug_, p1, p2, literal::red);
- }
-
-
- float
- angle = filter::internal::alignment_angle(this->components_,
- current_object,
- this->labeled_image_(p),
- anchor);
- angle = (angle * 180.0f) / math::pi;
- angle = angle * 20.0f + 1.0f;
- draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
- }
- }
- }
-
float min_alpha_rad;
float max_alpha_rad;
@@ -341,11 +322,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
};
@@ -375,12 +351,6 @@ namespace mln
--p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- --p;
- }
-
-
};
}
@@ -391,51 +361,35 @@ int main(int argc, char *argv[])
using namespace scribo;
using namespace mln;
- if (argc != 6 && argc != 7)
- {
- std::cout << "Usage: " << argv[0] << " <in.pbm> <min_angle = 3> <max_angle = 5> <min_card = 3> <out.ppm> <debug_enabled>" << std::endl;
- return 1;
- };
+ bool debug = (argc == 7);
- _debug_ = (argc == 7);
+ image2d<bool> input;
+ mln::io::pbm::load(input, argv[1]);
util::timer t;
- util::timer gt;
- // Load (OK)
t.start();
- image2d<bool> input;
- mln::io::pbm::load(input, argv[1]);
+ input = scribo::preprocessing::rotate_90(input);
float t_ = t;
- std::cout << "Image loaded - " << t_ << std::endl;
-
- gt.start();
-
- // Closing structural - Connect characters.
- t.restart();
-
- win::hline2d vl(17);
- image2d<bool> input_clo = morpho::closing::structural(input, vl);
+ std::cout << "rotate_90 - " << t_ << std::endl;
-// input_clo = scribo::preprocessing::rotate_90(input_clo, true);
+ t.start();
+ image2d<bool> hsep
+ = scribo::primitive::extract::lines_h_pattern(input, 200, 9);
+ input = scribo::primitive::remove::separators(input, hsep);
t_ = t;
- std::cout << "closing_structural - " << t_ << std::endl;
-
- if (_debug_)
- {
- // Restore input orientation.
- input = scribo::preprocessing::rotate_90(input, false);
+ std::cout << "rotate_90 - " << t_ << std::endl;
- io::pbm::save(input_clo, "input_clo.pbm");
- }
- // Rotate (OK)
t.restart();
- input_clo = scribo::preprocessing::rotate_90(input_clo, false);
+ win::vline2d vl(17);
+ image2d<bool> input_clo = morpho::closing::structural(input, vl);
t_ = t;
- std::cout << "rotate_90 - " << t_ << std::endl;
+ std::cout << "closing_structural - " << t_ << std::endl;
+ if (debug)
+ io::pbm::save(input_clo, "input_clo.pbm");
/// Finding components.
@@ -450,114 +404,109 @@ int main(int argc, char *argv[])
t_ = t;
std::cout << "extract::components - " << t_ << std::endl;
- if (_debug_)
- io::pgm::save(data::convert(value::int_u8(), components.labeled_image()),
- "lbl.pgm");
+ unsigned min_angle = atoi(argv[2]), max_angle = atoi(argv[3]);
+// t.restart();
+// object_links<L>
+// top_links = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Top);
- unsigned min_angle = atoi(argv[2]), max_angle = atoi(argv[3]);
+// object_links<L>
+// bot_links = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Bottom);
+// t_ = t;
+// std::cout << "links - " << t_ << std::endl;
unsigned dmax = 5;
t.restart();
- object_links<L> top_right, bot_right;
+ object_links<L> top_links, bot_links;
- object_links<L> top_left, bot_left;
+ object_links<L> ltop_links, lbot_links, rtop_links, rbot_links;
- // Top
{
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_right = primitive::link::impl::compute_fastest(functor, anchor::Top);
-
- t.stop();
-
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_top.ppm");
- io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
- }
-
- t.resume();
+ top_links = primitive::link::compute(functor, anchor::Top);
+ io::ppm::save(functor.debug_, "right_top.ppm");
+ io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
// Left
mln::single_left_dmax_ratio_aligned_functor<L>
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_left = primitive::link::compute(lfunctor, anchor::Top);
-
+ ltop_links = primitive::link::compute(lfunctor, anchor::Top);
+ io::ppm::save(lfunctor.debug_, "left_top.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
- t.stop();
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
- if (_debug_)
- {
- io::ppm::save(lfunctor.debug_, "left_top.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
-
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
-
- io::ppm::save(output, "left_right_top.ppm");
- }
-
- t.resume();
+ io::ppm::save(output, "left_right_top.ppm");
}
- // Bottom
{
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
- bot_right = primitive::link::compute(functor, anchor::Bottom);
- t.stop();
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_bot.ppm");
- io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
- }
-
- t.resume();
+ bot_links = primitive::link::compute(functor, anchor::Bottom);
+ io::ppm::save(functor.debug_, "right_bot.ppm");
+ io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
// Left
mln::single_left_dmax_ratio_aligned_functor<L>
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
- bot_left = primitive::link::compute(lfunctor, anchor::Bottom);
- t.stop();
+ lbot_links = primitive::link::compute(lfunctor, anchor::Bottom);
+ io::ppm::save(lfunctor.debug_, "left_bot.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
- if (_debug_)
- {
- io::ppm::save(lfunctor.debug_, "left_bot.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
- }
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
- if (_debug_)
- {
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
-
- io::ppm::save(output, "left_right_bot.ppm");
- }
+ io::ppm::save(output, "left_right_bot.ppm");
}
+// primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Top);
+// object_links<L>
+// bot_links = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Bottom);
t_ = t;
std::cout << "links - " << t_ << std::endl;
+// t.restart();
+// // Filtering.
+// object_links<L>
+// ftop_links = filter::object_links_top_aligned(top_links, atoi(argv[2])),
+// fbot_links = filter::object_links_bottom_aligned(bot_links, atoi(argv[2]));
+// t_ = t;
+// std::cout << "links alignements - " << t_ << std::endl;
+
+ // Debug image.
+// if (debug)
+// {
+// scribo::debug::save_linked_bboxes_image(input,
+// components,
+// top_links,
+// literal::red,
+// literal::green,
+// "top.ppm",
+// anchor::TopRight);
+
+// scribo::debug::save_linked_bboxes_image(input,
+// components,
+// bot_links,
+// literal::red,
+// literal::green,
+// "bot.ppm",
+// anchor::BottomRight);
+// }
+
t.restart();
- std::cout << "group - top" << std::endl;
- object_groups<L>
- top_groups = primitive::group::from_double_link_any(top_left, top_right);
- std::cout << "group - bot" << std::endl;
- object_groups<L>
- bot_groups = primitive::group::from_double_link_any(bot_left, bot_right);
+ object_groups<L> top_groups = primitive::group::from_single_link(top_links);
+ object_groups<L> bot_groups = primitive::group::from_single_link(bot_links);
t_ = t;
- std::cout << "group - " << t_ << std::endl;
-
+ std::cout << "regroup - " << t_ << std::endl;
unsigned min_card = atoi(argv[4]);
@@ -578,39 +527,36 @@ int main(int argc, char *argv[])
- if (_debug_)
- {
-
- image2d<value::rgb8>
- wo_filtering = data::convert(value::rgb8(), input);
+ image2d<value::rgb8>
+ wo_filtering = data::convert(value::rgb8(), input);
- for_all_comp_data(d, btop_accu)
+ for_all_comp_data(d, btop_accu)
+ {
+ if (btop_accu(d).is_valid())
{
- if (btop_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- btop_accu(d).to_result().pmin(),
- point2d(btop_accu(d).to_result().pmin().row(),
- btop_accu(d).to_result().pmax().col()),
- literal::green);
+ mln::draw::line(wo_filtering,
+ btop_accu(d).to_result().pmin(),
+ point2d(btop_accu(d).to_result().pmin().row(),
+ btop_accu(d).to_result().pmax().col()),
+ literal::green);
- }
}
+ }
- for_all_comp_data(d, bbot_accu)
+ for_all_comp_data(d, bbot_accu)
+ {
+ if (bbot_accu(d).is_valid())
{
- if (bbot_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- point2d(bbot_accu(d).to_result().pmax().row(),
- bbot_accu(d).to_result().pmin().col()),
- bbot_accu(d).to_result().pmax(),
- literal::green);
- }
-
+ mln::draw::line(wo_filtering,
+ point2d(bbot_accu(d).to_result().pmax().row(),
+ bbot_accu(d).to_result().pmin().col()),
+ bbot_accu(d).to_result().pmax(),
+ literal::green);
}
- io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
}
+ io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
t.restart();
@@ -621,6 +567,13 @@ int main(int argc, char *argv[])
+// t.restart();
+// filter_bad_groups(top_groups, bot_groups);
+// t_ = t;
+// std::cout << "bad groups - " << t_ << std::endl;
+
+
+
t.restart();
util::array<accu::shape::bbox<point2d> >
top_accu(top_groups.nelements()),
@@ -642,18 +595,21 @@ int main(int argc, char *argv[])
- t.restart();
- image2d<bool> separators;
- initialize(separators, input_clo);
- data::fill(separators, false);
- t_ = t;
- std::cout << "Initialize separators image - " << t_ << std::endl;
- image2d<value::rgb8> both;
- if (_debug_)
+
+
+ image2d<value::rgb8>
both = data::convert(value::rgb8(), input);
+ image2d<value::rgb8>
+ top_l, bot_l;
+
+ if (debug)
+ {
+ top_l = duplicate(both);
+ bot_l = duplicate(both);
+ }
t.restart();
@@ -661,23 +617,23 @@ int main(int argc, char *argv[])
{
if (top_accu(d).is_valid() || btop_accu(d).is_valid())
{
- if (top_accu(d).is_valid())
- {
- if (_debug_)
- mln::draw::line(both,
+ if (debug)
+ if (top_accu(d).is_valid())
+ mln::draw::line(top_l,
top_accu(d).to_result().pmin(),
point2d(top_accu(d).to_result().pmin().row(),
top_accu(d).to_result().pmax().col()),
literal::green);
- mln::draw::line(separators,
+
+ if (top_accu(d).is_valid())
+ mln::draw::line(both,
top_accu(d).to_result().pmin(),
point2d(top_accu(d).to_result().pmin().row(),
top_accu(d).to_result().pmax().col()),
- true);
- }
+ literal::green);
else
- if (_debug_ && btop_accu(d).is_valid())
+ if (btop_accu(d).is_valid())
mln::draw::line(both,
btop_accu(d).to_result().pmin(),
point2d(btop_accu(d).to_result().pmin().row(),
@@ -687,23 +643,23 @@ int main(int argc, char *argv[])
}
if (bot_accu(d).is_valid() || bbot_accu(d).is_valid())
{
- if (bot_accu(d).is_valid())
- {
- if (_debug_)
- mln::draw::line(both,
+ if (debug)
+ if (bot_accu(d).is_valid())
+ mln::draw::line(bot_l,
point2d(bot_accu(d).to_result().pmax().row(),
bot_accu(d).to_result().pmin().col()),
bot_accu(d).to_result().pmax(),
literal::green);
- mln::draw::line(separators,
+
+ if (bot_accu(d).is_valid())
+ mln::draw::line(both,
point2d(bot_accu(d).to_result().pmax().row(),
bot_accu(d).to_result().pmin().col()),
bot_accu(d).to_result().pmax(),
- true);
- }
+ literal::green);
else
- if (_debug_ && bbot_accu(d).is_valid())
+ if (bbot_accu(d).is_valid())
mln::draw::line(both,
point2d(bbot_accu(d).to_result().pmax().row(),
bbot_accu(d).to_result().pmin().col()),
@@ -716,127 +672,11 @@ int main(int argc, char *argv[])
std::cout << "Drawing output image - " << t_ << std::endl;
- if (_debug_)
+ if (debug)
{
- io::ppm::save(both, argv[5]);
- io::pbm::save(separators, "separators.pbm");
- }
-
-
- // Hit or miss
- {
- if (_debug_)
- {
- image2d<bool> input_with_seps = duplicate(input_clo);
- data::paste(separators | pw::value(separators), input_with_seps);
-
- io::pbm::save(input_with_seps, "input_with_seps.pbm");
- }
-
- t.restart();
- unsigned length = 25;
-
- dpoint2d
- dp1(-21, 0),
- dp2( 21, 0);
-
- // Adjusting extension.
- t.restart();
- extension::adjust_fill(input_clo, length / 2, 0);
-
- accu::count_value<bool> accu(true);
- typedef image2d<unsigned> I;
-
- I tmp = accu::transform_line(accu, input_clo, length, 1);
- t_ = t;
- std::cout << "* accu::transform_line - " << t_ << std::endl;
-
- if (_debug_)
- io::pgm::save(data::convert(value::int_u8(), tmp), "tmp.pgm");
-
-
- t.restart();
- value::int_u8 nlabels;
- image2d<value::int_u8>
- sep_lbl = labeling::value(separators, true, c8(), nlabels);
- t_ = t;
- std::cout << "* labeling seps - " << t_ << std::endl;
-
-
- t.restart();
-// util::array<unsigned> lcard(unsigned(nlabels) + 1, 0);
-// util::array<unsigned> lfalse(unsigned(nlabels) + 1, 0);
-
- util::array<bool> relbl(unsigned(nlabels) + 1, true);
- relbl(0) = false;
-
-
-// unsigned
-// tmp_next_line_dp1 = tmp.delta_index(dp1),
-// tmp_next_line_dp2 = tmp.delta_index(dp2);
-
-// const mln_value(I)* val_sep = &separators(separators.domain().pmin());
-// const value::int_u8* val_lbl = &sep_lbl(sep_lbl.domain().pmin());
-
-// bool go_next = false;
- unsigned invalid_ratio = unsigned(length * 0.30f);
-
-// for (unsigned row = 0; i < nrows; ++row)
-// {
-// for (unsigned col = 0; col < ncols; ++col)
-// {
-
-// }
-
-// val_sep += ;
-// val_lbl += ;
-// }
-
- mln_piter_(I) p(separators.domain());
- for_all(p)
- if (separators(p))
- {
- unsigned lbl = sep_lbl(p);
-// ++lcard(lbl);
-
- unsigned
- top_count = tmp(p + dp1),
- bot_count = tmp(p + dp2);
-
- // This site is wrapped between two lines of text so we don't
- // want it.
- if (top_count >= invalid_ratio + 1
- && bot_count >= invalid_ratio + 1)
- {
- relbl(lbl) = false;
-// go_next = true;
- }
-// ++lfalse(lbl);
- }
-
-// for_all_comps(i, relbl)
-// relbl(i) = (lfalse(i) / (float) lcard(i)) < 0.02f;
- t_ = t;
- std::cout << "* reading data - " << t_ << std::endl;
-
- t.restart();
- labeling::relabel_inplace(sep_lbl, nlabels, relbl);
- t_ = t;
- std::cout << "* relabel_inplace - " << t_ << std::endl;
-
- image2d<bool> output = data::convert(bool(), sep_lbl);
-
- if (_debug_)
- {
- io::pbm::save(output, "separators_hom.pbm");
- io::pbm::save(separators, "separators_filtered.pbm");
- }
+ io::ppm::save(top_l, "top_l.ppm");
+ io::ppm::save(bot_l, "bot_l.ppm");
}
- t_ = t;
- std::cout << "Separator image - " << t_ << std::endl;
-
- gt.stop();
- t_ = gt;
- std::cout << "Total time: " << t_ << std::endl;
+ io::ppm::save(both, argv[5]);
}
diff --git a/scribo/sandbox/z/white_spaces/white_spaces.cc b/scribo/sandbox/z/white_spaces/white_spaces.cc.bak.left_right_merged
similarity index 58%
copy from scribo/sandbox/z/white_spaces/white_spaces.cc
copy to scribo/sandbox/z/white_spaces/white_spaces.cc.bak.left_right_merged
index d832d58..ecd44ae 100644
--- a/scribo/sandbox/z/white_spaces/white_spaces.cc
+++ b/scribo/sandbox/z/white_spaces/white_spaces.cc.bak.left_right_merged
@@ -10,8 +10,6 @@
#include <mln/labeling/colorize.hh>
-#include <mln/labeling/relabel.hh>
-#include <mln/labeling/blobs.hh>
#include <mln/morpho/closing/structural.hh>
#include <mln/morpho/closing/area.hh>
@@ -43,24 +41,17 @@
#include <mln/norm/l1.hh>
#include <scribo/core/object_groups.hh>
-#include <scribo/core/component_set.hh>
#include <scribo/primitive/extract/components.hh>
#include <scribo/primitive/extract/lines_h_pattern.hh>
#include <scribo/primitive/remove/separators.hh>
-
+#include <scribo/primitive/group/from_single_link.hh>
#include <scribo/preprocessing/denoise_fg.hh>
#include <scribo/preprocessing/rotate_90.hh>
-#include <scribo/primitive/link/internal/dmax_default.hh>
-
#include <scribo/primitive/link/with_single_right_link_dmax_ratio.hh>
#include <scribo/primitive/link/with_single_right_link_dmax_ratio_aligned.hh>
-#include <scribo/primitive/group/from_double_link_any.hh>
-
-#include <scribo/primitive/group/from_single_link.hh>
-
#include <scribo/filter/object_links_top_aligned.hh>
#include <scribo/filter/object_groups_small.hh>
#include <scribo/filter/object_links_bottom_aligned.hh>
@@ -72,11 +63,6 @@ namespace mln
using namespace scribo;
-
- // Enable debug.
- bool _debug_;
-
-
template <typename L>
void filter_bad_groups(object_groups<L>& top_groups,
object_groups<L>& bot_groups)
@@ -120,27 +106,26 @@ namespace mln
unsigned current_object,
anchor::Type anchor)
{
- mln_site(L) sp;// = comps(current_object).bbox().pcenter();
+ mln_site(L) sp = comps(current_object).bbox().pcenter();
+
+ unsigned h = comps(current_object).bbox().pmax().row()
+ - comps(current_object).bbox().pmin().row();
- unsigned h = comps(current_object).bbox().height();
switch (anchor)
{
default:
return sp;
-
// Bounding box top center
- case anchor::Top: // FIXME: rename as TopLeft
- sp.col() = comps(current_object).bbox().pmin().col();
+ case anchor::Top:
sp.row() = comps(current_object).bbox().pmin().row()
+ math::min(2u, (h + 1) / 2 - 1);
break;
// Bounding box bottom center
- case anchor::Bottom: // FIXME: rename as BottomLeft
- sp.col() = comps(current_object).bbox().pmax().col();
+ case anchor::Bottom:
sp.row() = comps(current_object).bbox().pmax().row()
- math::min(2u, (h + 1) / 2 - 1);
break;
@@ -155,10 +140,10 @@ namespace mln
template <typename L, typename E>
class single_dmax_ratio_aligned_functor_base
- : public link_single_dmax_ratio_base<L, dmax_default, E>
+ : public link_single_dmax_ratio_base<L, E>
{
// typedef single_right_dmax_ratio_aligned_functor<L> self_t;
- typedef link_single_dmax_ratio_base<L, dmax_default, E> super_;
+ typedef link_single_dmax_ratio_base<L, E> super_;
public:
typedef mln_site(L) P;
@@ -170,13 +155,16 @@ namespace mln
float min_angle,
float max_angle,
anchor::Type anchor_)
- : super_(components,
- anchor::Horizontal,
- dmax_default(dmax)),
- anchor(anchor_),
+ : super_(components, dmax, anchor::Horizontal), anchor(anchor_),
debug_(data::convert(value::rgb8(), input)),
debug_angle_(data::convert(value::rgb8(), input))
{
+ std::cout << "min_angle = " << min_angle
+ << " - max_angle = " << max_angle
+ << std::endl;
+ std::cout << "min_angle_rad = " << min_alpha_rad
+ << " - max_angle_rad = " << max_alpha_rad
+ << std::endl;
min_alpha_rad = (min_angle / 180.0f) * math::pi;
max_alpha_rad = (max_angle / 180.0f) * math::pi;
}
@@ -186,11 +174,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
mln_site(L)
start_point_(unsigned current_object, anchor::Type anchor)
@@ -221,10 +204,14 @@ namespace mln
dist = math::abs(p[this->direction_] - b.pmin()[this->direction_]);
+// int ldist = std::max(this->components_(current_object).bbox().width() / 2,
+// this->components_(this->labeled_image_(p)).bbox().width() / 2);
+
int ldist = this->components_(current_object).bbox().width();
// Components are really close, so the angle is more permissive.
if (dist < 3 * ldist)
+// if (dist < (ldist + 0.7 * ldist))
{
return
filter::internal::component_aligned_rad(this->components_,
@@ -251,13 +238,40 @@ namespace mln
{
super_::validate_link_(current_object, start_point, p, anchor);
- if (_debug_)
+ mln_site(L)
+ p1 = mln::my_anchors(this->components_, current_object, anchor),
+ p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
+ anchor);
+ draw::line(debug_, p1, p2, literal::green);
+
+
+ float
+ angle = filter::internal::alignment_angle(this->components_,
+ current_object,
+ this->labeled_image_(p),
+ anchor);
+ angle = (angle * 180.0f) / math::pi;
+ angle = angle * 20.0f + 1.0f;
+ draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
+ }
+
+ void invalidate_link_(unsigned current_object,
+ const P& start_point,
+ const P& p,
+ anchor::Type anchor)
+ {
+ super_::invalidate_link_(current_object, start_point, p, anchor);
+
+ if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
{
mln_site(L)
p1 = mln::my_anchors(this->components_, current_object, anchor),
p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
anchor);
- draw::line(debug_, p1, p2, literal::green);
+ if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
+ {
+ draw::line(debug_, p1, p2, literal::red);
+ }
float
@@ -271,39 +285,6 @@ namespace mln
}
}
- void invalidate_link_(unsigned current_object,
- const P& start_point,
- const P& p,
- anchor::Type anchor)
- {
- super_::invalidate_link_(current_object, start_point, p, anchor);
-
- if (_debug_)
- {
- if (this->labeled_image_.domain().has(p) && this->labeled_image_(p) != 0)
- {
- mln_site(L)
- p1 = mln::my_anchors(this->components_, current_object, anchor),
- p2 = mln::my_anchors(this->components_, this->labeled_image_(p),
- anchor);
- if (this->labeled_image_.domain().has(p2) && norm::l1_distance(p1.to_vec(), p2.to_vec()) < 300)
- {
- draw::line(debug_, p1, p2, literal::red);
- }
-
-
- float
- angle = filter::internal::alignment_angle(this->components_,
- current_object,
- this->labeled_image_(p),
- anchor);
- angle = (angle * 180.0f) / math::pi;
- angle = angle * 20.0f + 1.0f;
- draw::line(debug_angle_, p1, p2, value::rgb8(angle, angle, angle));
- }
- }
- }
-
float min_alpha_rad;
float max_alpha_rad;
@@ -341,11 +322,6 @@ namespace mln
++p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- ++p;
- }
-
};
@@ -375,12 +351,6 @@ namespace mln
--p.col();
}
- void compute_next_site_f_(unsigned& p)
- {
- --p;
- }
-
-
};
}
@@ -391,51 +361,35 @@ int main(int argc, char *argv[])
using namespace scribo;
using namespace mln;
- if (argc != 6 && argc != 7)
- {
- std::cout << "Usage: " << argv[0] << " <in.pbm> <min_angle = 3> <max_angle = 5> <min_card = 3> <out.ppm> <debug_enabled>" << std::endl;
- return 1;
- };
+ bool debug = (argc == 7);
- _debug_ = (argc == 7);
+ image2d<bool> input;
+ mln::io::pbm::load(input, argv[1]);
util::timer t;
- util::timer gt;
- // Load (OK)
t.start();
- image2d<bool> input;
- mln::io::pbm::load(input, argv[1]);
+ input = scribo::preprocessing::rotate_90(input);
float t_ = t;
- std::cout << "Image loaded - " << t_ << std::endl;
-
- gt.start();
-
- // Closing structural - Connect characters.
- t.restart();
-
- win::hline2d vl(17);
- image2d<bool> input_clo = morpho::closing::structural(input, vl);
+ std::cout << "rotate_90 - " << t_ << std::endl;
-// input_clo = scribo::preprocessing::rotate_90(input_clo, true);
+ t.start();
+ image2d<bool> hsep
+ = scribo::primitive::extract::lines_h_pattern(input, 200, 9);
+ input = scribo::primitive::remove::separators(input, hsep);
t_ = t;
- std::cout << "closing_structural - " << t_ << std::endl;
+ std::cout << "Remove separators - " << t_ << std::endl;
- if (_debug_)
- {
- // Restore input orientation.
- input = scribo::preprocessing::rotate_90(input, false);
-
- io::pbm::save(input_clo, "input_clo.pbm");
- }
- // Rotate (OK)
t.restart();
- input_clo = scribo::preprocessing::rotate_90(input_clo, false);
+ win::vline2d vl(17);
+ image2d<bool> input_clo = morpho::closing::structural(input, vl);
t_ = t;
- std::cout << "rotate_90 - " << t_ << std::endl;
+ std::cout << "closing_structural - " << t_ << std::endl;
+ if (debug)
+ io::pbm::save(input_clo, "input_clo.pbm");
/// Finding components.
@@ -450,19 +404,23 @@ int main(int argc, char *argv[])
t_ = t;
std::cout << "extract::components - " << t_ << std::endl;
- if (_debug_)
- io::pgm::save(data::convert(value::int_u8(), components.labeled_image()),
- "lbl.pgm");
+ unsigned min_angle = atoi(argv[2]), max_angle = atoi(argv[3]);
+// t.restart();
+// object_links<L>
+// top_links = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Top);
- unsigned min_angle = atoi(argv[2]), max_angle = atoi(argv[3]);
+// object_links<L>
+// bot_links = primitive::link::with_single_right_link_dmax_ratio_aligned(components, 2, min_angle, max_angle, anchor::Bottom);
+// t_ = t;
+// std::cout << "links - " << t_ << std::endl;
unsigned dmax = 5;
t.restart();
- object_links<L> top_right, bot_right;
+ object_links<L> top_links, bot_links;
- object_links<L> top_left, bot_left;
+ object_links<L> ltop_links, lbot_links;
// Top
@@ -470,38 +428,26 @@ int main(int argc, char *argv[])
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_right = primitive::link::impl::compute_fastest(functor, anchor::Top);
+ top_links = primitive::link::compute(functor, anchor::Top);
t.stop();
-
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_top.ppm");
- io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
- }
-
+ io::ppm::save(functor.debug_, "right_top.ppm");
+ io::ppm::save(functor.debug_angle_, "right_top_angle.ppm");
t.resume();
// Left
mln::single_left_dmax_ratio_aligned_functor<L>
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Top);
- top_left = primitive::link::compute(lfunctor, anchor::Top);
-
+ ltop_links = primitive::link::compute(lfunctor, anchor::Top);
t.stop();
+ io::ppm::save(lfunctor.debug_, "left_top.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
- if (_debug_)
- {
- io::ppm::save(lfunctor.debug_, "left_top.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_top_angle.ppm");
-
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
-
- io::ppm::save(output, "left_right_top.ppm");
- }
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
+ io::ppm::save(output, "left_right_top.ppm");
t.resume();
}
@@ -511,36 +457,85 @@ int main(int argc, char *argv[])
// Right
mln::single_right_dmax_ratio_aligned_functor<L>
functor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
- bot_right = primitive::link::compute(functor, anchor::Bottom);
+ bot_links = primitive::link::compute(functor, anchor::Bottom);
t.stop();
-
- if (_debug_)
- {
- io::ppm::save(functor.debug_, "right_bot.ppm");
- io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
- }
-
+ io::ppm::save(functor.debug_, "right_bot.ppm");
+ io::ppm::save(functor.debug_angle_, "right_bot_angle.ppm");
t.resume();
// Left
mln::single_left_dmax_ratio_aligned_functor<L>
lfunctor(input_clo, components, dmax, min_angle, max_angle, anchor::Bottom);
- bot_left = primitive::link::compute(lfunctor, anchor::Bottom);
+ lbot_links = primitive::link::compute(lfunctor, anchor::Bottom);
+ t.stop();
+ io::ppm::save(lfunctor.debug_, "left_bot.ppm");
+ io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
+ t.resume();
+
t.stop();
+ image2d<value::rgb8> output = duplicate(functor.debug_);
+ data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
- if (_debug_)
+ io::ppm::save(output, "left_right_bot.ppm");
+ t.resume();
+ }
+
+
+
+ // Merge links results.
+ object_groups<L> top_groups(top_links), bot_groups(bot_links);
+ {
+ top_groups.init_(top_links);
+ bot_groups.init_(bot_links);
+
+ for_all_groups(i, top_groups)
+ {
+ if (!top_links.components()(i).is_valid())
+ top_groups(i) = 0;
+ else
+ primitive::internal::find_root(top_groups, i);
+
+ if (!bot_links.components()(i).is_valid())
+ bot_groups(i) = 0;
+ else
+ primitive::internal::find_root(bot_groups, i);
+ }
+
+ util::array<unsigned>
+ top_group_relabel(top_groups.nelements()),
+ bot_group_relabel(bot_groups.nelements());
+ for (unsigned n = 0; n < top_group_relabel.size(); ++n)
+ {
+ top_group_relabel(n) = n;
+ bot_group_relabel(n) = n;
+ }
+
+ for_all_links(l, top_links)
{
- io::ppm::save(lfunctor.debug_, "left_bot.ppm");
- io::ppm::save(lfunctor.debug_angle_, "left_bot_angle.ppm");
+ if (ltop_links(l) != l
+ && top_links(ltop_links(l)) == ltop_links(l)
+ && top_links(l) != ltop_links(l))
+ {
+ top_group_relabel(top_groups(ltop_links(l))) = top_group_relabel(top_groups(l));
+ }
+
+ if (lbot_links(l) != l
+ && bot_links(lbot_links(l)) == lbot_links(l)
+ && bot_links(l) != lbot_links(l))
+ {
+ bot_group_relabel(bot_groups(lbot_links(l))) = bot_group_relabel(bot_groups(l));
+ }
}
- if (_debug_)
+ for_all_groups(i, top_groups)
{
- image2d<value::rgb8> output = duplicate(functor.debug_);
- data::paste((lfunctor.debug_ | (pw::value(lfunctor.debug_) != pw::cst(literal::black))) | (pw::value(lfunctor.debug_) != pw::cst(literal::white)), output);
+ if (top_group_relabel(top_groups(i)) != top_groups(i))
+ top_groups(i) = top_group_relabel(top_groups(i));
- io::ppm::save(output, "left_right_bot.ppm");
+ if (bot_group_relabel(bot_groups(i)) != bot_groups(i))
+ bot_groups(i) = bot_group_relabel(bot_groups(i));
}
+
}
@@ -548,16 +543,11 @@ int main(int argc, char *argv[])
std::cout << "links - " << t_ << std::endl;
- t.restart();
- std::cout << "group - top" << std::endl;
- object_groups<L>
- top_groups = primitive::group::from_double_link_any(top_left, top_right);
- std::cout << "group - bot" << std::endl;
- object_groups<L>
- bot_groups = primitive::group::from_double_link_any(bot_left, bot_right);
- t_ = t;
- std::cout << "group - " << t_ << std::endl;
-
+// t.restart();
+// object_groups<L> top_groups = primitive::group::from_single_link(top_links);
+// object_groups<L> bot_groups = primitive::group::from_single_link(bot_links);
+// t_ = t;
+// std::cout << "regroup - " << t_ << std::endl;
unsigned min_card = atoi(argv[4]);
@@ -578,39 +568,36 @@ int main(int argc, char *argv[])
- if (_debug_)
- {
-
- image2d<value::rgb8>
- wo_filtering = data::convert(value::rgb8(), input);
+ image2d<value::rgb8>
+ wo_filtering = data::convert(value::rgb8(), input);
- for_all_comp_data(d, btop_accu)
+ for_all_comp_data(d, btop_accu)
+ {
+ if (btop_accu(d).is_valid())
{
- if (btop_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- btop_accu(d).to_result().pmin(),
- point2d(btop_accu(d).to_result().pmin().row(),
- btop_accu(d).to_result().pmax().col()),
- literal::green);
+ mln::draw::line(wo_filtering,
+ btop_accu(d).to_result().pmin(),
+ point2d(btop_accu(d).to_result().pmin().row(),
+ btop_accu(d).to_result().pmax().col()),
+ literal::green);
- }
}
+ }
- for_all_comp_data(d, bbot_accu)
+ for_all_comp_data(d, bbot_accu)
+ {
+ if (bbot_accu(d).is_valid())
{
- if (bbot_accu(d).is_valid())
- {
- mln::draw::line(wo_filtering,
- point2d(bbot_accu(d).to_result().pmax().row(),
- bbot_accu(d).to_result().pmin().col()),
- bbot_accu(d).to_result().pmax(),
- literal::green);
- }
-
+ mln::draw::line(wo_filtering,
+ point2d(bbot_accu(d).to_result().pmax().row(),
+ bbot_accu(d).to_result().pmin().col()),
+ bbot_accu(d).to_result().pmax(),
+ literal::green);
}
- io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
}
+ io::ppm::save(wo_filtering, "wo_filtering.ppm");
+
t.restart();
@@ -621,6 +608,13 @@ int main(int argc, char *argv[])
+// t.restart();
+// filter_bad_groups(top_groups, bot_groups);
+// t_ = t;
+// std::cout << "bad groups - " << t_ << std::endl;
+
+
+
t.restart();
util::array<accu::shape::bbox<point2d> >
top_accu(top_groups.nelements()),
@@ -642,18 +636,20 @@ int main(int argc, char *argv[])
- t.restart();
- image2d<bool> separators;
- initialize(separators, input_clo);
- data::fill(separators, false);
- t_ = t;
- std::cout << "Initialize separators image - " << t_ << std::endl;
- image2d<value::rgb8> both;
- if (_debug_)
+
+ image2d<value::rgb8>
both = data::convert(value::rgb8(), input);
+ image2d<value::rgb8>
+ top_l, bot_l;
+
+ if (debug)
+ {
+ top_l = duplicate(both);
+ bot_l = duplicate(both);
+ }
t.restart();
@@ -661,23 +657,23 @@ int main(int argc, char *argv[])
{
if (top_accu(d).is_valid() || btop_accu(d).is_valid())
{
- if (top_accu(d).is_valid())
- {
- if (_debug_)
- mln::draw::line(both,
+ if (debug)
+ if (top_accu(d).is_valid())
+ mln::draw::line(top_l,
top_accu(d).to_result().pmin(),
point2d(top_accu(d).to_result().pmin().row(),
top_accu(d).to_result().pmax().col()),
literal::green);
- mln::draw::line(separators,
+
+ if (top_accu(d).is_valid())
+ mln::draw::line(both,
top_accu(d).to_result().pmin(),
point2d(top_accu(d).to_result().pmin().row(),
top_accu(d).to_result().pmax().col()),
- true);
- }
+ literal::green);
else
- if (_debug_ && btop_accu(d).is_valid())
+ if (btop_accu(d).is_valid())
mln::draw::line(both,
btop_accu(d).to_result().pmin(),
point2d(btop_accu(d).to_result().pmin().row(),
@@ -687,23 +683,23 @@ int main(int argc, char *argv[])
}
if (bot_accu(d).is_valid() || bbot_accu(d).is_valid())
{
- if (bot_accu(d).is_valid())
- {
- if (_debug_)
- mln::draw::line(both,
+ if (debug)
+ if (bot_accu(d).is_valid())
+ mln::draw::line(bot_l,
point2d(bot_accu(d).to_result().pmax().row(),
bot_accu(d).to_result().pmin().col()),
bot_accu(d).to_result().pmax(),
literal::green);
- mln::draw::line(separators,
+
+ if (bot_accu(d).is_valid())
+ mln::draw::line(both,
point2d(bot_accu(d).to_result().pmax().row(),
bot_accu(d).to_result().pmin().col()),
bot_accu(d).to_result().pmax(),
- true);
- }
+ literal::green);
else
- if (_debug_ && bbot_accu(d).is_valid())
+ if (bbot_accu(d).is_valid())
mln::draw::line(both,
point2d(bbot_accu(d).to_result().pmax().row(),
bbot_accu(d).to_result().pmin().col()),
@@ -716,127 +712,11 @@ int main(int argc, char *argv[])
std::cout << "Drawing output image - " << t_ << std::endl;
- if (_debug_)
- {
- io::ppm::save(both, argv[5]);
- io::pbm::save(separators, "separators.pbm");
- }
-
-
- // Hit or miss
+ if (debug)
{
- if (_debug_)
- {
- image2d<bool> input_with_seps = duplicate(input_clo);
- data::paste(separators | pw::value(separators), input_with_seps);
-
- io::pbm::save(input_with_seps, "input_with_seps.pbm");
- }
-
- t.restart();
- unsigned length = 25;
-
- dpoint2d
- dp1(-21, 0),
- dp2( 21, 0);
-
- // Adjusting extension.
- t.restart();
- extension::adjust_fill(input_clo, length / 2, 0);
-
- accu::count_value<bool> accu(true);
- typedef image2d<unsigned> I;
-
- I tmp = accu::transform_line(accu, input_clo, length, 1);
- t_ = t;
- std::cout << "* accu::transform_line - " << t_ << std::endl;
-
- if (_debug_)
- io::pgm::save(data::convert(value::int_u8(), tmp), "tmp.pgm");
-
-
- t.restart();
- value::int_u8 nlabels;
- image2d<value::int_u8>
- sep_lbl = labeling::value(separators, true, c8(), nlabels);
- t_ = t;
- std::cout << "* labeling seps - " << t_ << std::endl;
-
-
- t.restart();
-// util::array<unsigned> lcard(unsigned(nlabels) + 1, 0);
-// util::array<unsigned> lfalse(unsigned(nlabels) + 1, 0);
-
- util::array<bool> relbl(unsigned(nlabels) + 1, true);
- relbl(0) = false;
-
-
-// unsigned
-// tmp_next_line_dp1 = tmp.delta_index(dp1),
-// tmp_next_line_dp2 = tmp.delta_index(dp2);
-
-// const mln_value(I)* val_sep = &separators(separators.domain().pmin());
-// const value::int_u8* val_lbl = &sep_lbl(sep_lbl.domain().pmin());
-
-// bool go_next = false;
- unsigned invalid_ratio = unsigned(length * 0.30f);
-
-// for (unsigned row = 0; i < nrows; ++row)
-// {
-// for (unsigned col = 0; col < ncols; ++col)
-// {
-
-// }
-
-// val_sep += ;
-// val_lbl += ;
-// }
-
- mln_piter_(I) p(separators.domain());
- for_all(p)
- if (separators(p))
- {
- unsigned lbl = sep_lbl(p);
-// ++lcard(lbl);
-
- unsigned
- top_count = tmp(p + dp1),
- bot_count = tmp(p + dp2);
-
- // This site is wrapped between two lines of text so we don't
- // want it.
- if (top_count >= invalid_ratio + 1
- && bot_count >= invalid_ratio + 1)
- {
- relbl(lbl) = false;
-// go_next = true;
- }
-// ++lfalse(lbl);
- }
-
-// for_all_comps(i, relbl)
-// relbl(i) = (lfalse(i) / (float) lcard(i)) < 0.02f;
- t_ = t;
- std::cout << "* reading data - " << t_ << std::endl;
-
- t.restart();
- labeling::relabel_inplace(sep_lbl, nlabels, relbl);
- t_ = t;
- std::cout << "* relabel_inplace - " << t_ << std::endl;
-
- image2d<bool> output = data::convert(bool(), sep_lbl);
-
- if (_debug_)
- {
- io::pbm::save(output, "separators_hom.pbm");
- io::pbm::save(separators, "separators_filtered.pbm");
- }
+ io::ppm::save(top_l, "top_l.ppm");
+ io::ppm::save(bot_l, "bot_l.ppm");
}
- t_ = t;
- std::cout << "Separator image - " << t_ << std::endl;
-
- gt.stop();
- t_ = gt;
- std::cout << "Total time: " << t_ << std::endl;
+ io::ppm::save(both, argv[5]);
}
--
1.5.6.5
1
0
---
scribo/sandbox/z/todolist | 222 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 222 insertions(+), 0 deletions(-)
create mode 100644 scribo/sandbox/z/todolist
diff --git a/scribo/sandbox/z/todolist b/scribo/sandbox/z/todolist
new file mode 100644
index 0000000..56a6f07
--- /dev/null
+++ b/scribo/sandbox/z/todolist
@@ -0,0 +1,222 @@
+* Fix dispatch in morpho::closing_algebraic with morpho/attribute/*.
+ -> tests/morpho/closing_volume do not compile
+
+* Cleanup icp.hh
+ -> remove debug?
+
+* Improve closest point functor in icp.hh
+ -> We want it to handle the case when a given point is not in the closest
+ point image domain.
+
+* Fix pw::value(slice(ima3d, 0)) op pw::cst.
+ -> do not compile.
+
+* Fix segfault in the closest point functor in icp.hh when compiled with -O1
+ -> If no optimization flag is set during compilation, whether NDEBUG is set
+ or not, the code just works.
+
+* Add missing tests for mln/fun/*
+
+* Wrap extract/red,green,blue into a more generic routine
+ -> ex: data::fill(thru(red, ima), 0);
+
+* Implement a subgraph and a regular graph
+
+* Add win::diamond
+
+* Write a lemmings canvas with a conditional stop.
+
+* Fix gray level value types.
+
+* Fix Float value types.
+
+* Cleanup debug::draw_graph.
+
+* Rename Image::pset to Image::domain_t
+
+* Check guards in println.spe.hh and level/median.hh
+
+* Make the graph image types shorter
+ -> Do we want to add a specific image type for graph images or do we want to
+ add new typedefs?
+
+* Add debugging levels in trace.
+
+* Add operator '/'
+ -> ima / box
+
+* Avoid using pw::cst with < and > operators.
+
+* Make Olena compile with gcc 2.95
+ -> Ambiguities at compile time.
+
+* ima | pw::cst(0) instead of ima | (pw::value(ima) == 0)
+
+* Automatic conversions from array<T> to fun::array<U> with U!=T
+
+* Make labeling::compute robust if label 0 is missing.
+ -> Currently, it crashes. (cf. mail theo).
+
+* Make pw::value(ima) op literal::* work.
+
+* Check if l2l::relabel is useful.
+
+
+------------------------
+
+* Add for_all_components(i, array).
+ => Or special array type
+
+* data::fill(util::array<>, value);
+
+* Make graph image type shorter.
+
+* Function associating edges to a pair of sites from a graph image.
+ => Use it by default while constructing a p_edges.
+
+* Function associating a vertex to an edge from a label image.
+ => Use it by default while constructing a p_vertices.
+
+* Routine returning an array mapping vertices and their component representative.
+ (see demat.hh, make_relabel_fun_t)
+
+* Routine Returning the number of vertices per graph component.
+ (see demat.hh, comp_size_t)
+
+* lbl | (attribute::card > 10)
+ => would keep only the components having their attribute card greater than 10.
+ * Or just a routine: keep_inplace(lbl, nlabels, attribute::card > 10);
+
+ template <typename R>
+ struct remove_small_comps
+ : Function_l2b< remove_small_comps<R> >
+ {
+ remove_small_comps(const util::array<R>& nsitecomp)
+ : nsitecomp_(nsitecomp)
+ {
+ }
+
+ /// Return false if the components is smaller than a given size.
+ bool operator()(const label_16& l) const
+ {
+ return nsitecomp_[l] >= settings.min_comp_size;
+ }
+
+ const util::array<R>& nsitecomp_;
+ };
+
+ // Remove components which are too small
+ typedef util::array<accu_count_res_t> nsitecomp_t;
+ nsitecomp_t nsitecomp = labeling::compute(accu_count_t(), lbl, nlabels);
+ remove_small_comps<accu_count_res_t> fl2b(nsitecomp);
+ labeling::relabel_inplace(lbl, nlabels, fl2b);
+
+
+* data::fill(ima | array<box>, false);
+ => instead of:
+
+ for_all_components(i, boxes)
+ data::fill(ima | boxes[i], false);
+
+* draw::boxes
+
+* debug::filename(input_file_name, name);
+ => format the debug output file name correctly.
+ => input_file_name _ id _ name
+
+* image2d tmp = extend(ima, 1); compiles. Do we want that?
+ => may be confusing since tmp do not have the extension!
+
+
+
+--------
+
+
+* Boule N-d.
+
+* Decouper mln/core/image en sous repertoire? / Distinguer morpher sur site,
+ morpher sur valeur...?
+
+
+
+* Add dispatch to make::graph and make::region_adjacency_graph
+
+* Add an adjacency_matrix class and use it in make::*graph.
+
+* Allow graph dump.
+
+* Add specialization for image<bool>
+
+
+
+//////// FROM SCRIBO
+
+* Add for_all_components(i, array).
+ => Or special array type
+
+* data::fill(util::array<>, value);
+
+* Make graph image type shorter.
+
+* Function associating edges to a pair of sites from a graph image.
+ => Use it by default while constructing a p_edges.
+
+* Function associating a vertex to an edge from a label image.
+ => Use it by default while constructing a p_vertices.
+
+* Routine returning an array mapping vertices and their component representative.
+ (see demat.hh, make_relabel_fun_t)
+
+* Routine Returning the number of vertices per graph component.
+ (see demat.hh, comp_size_t)
+
+* lbl | (attribute::card > 10)
+ => would keep only the components having their attribute card greater than 10.
+ * Or just a routine: keep_inplace(lbl, nlabels, attribute::card > 10);
+
+ template <typename R>
+ struct remove_small_comps
+ : Function_l2b< remove_small_comps<R> >
+ {
+ remove_small_comps(const util::array<R>& nsitecomp)
+ : nsitecomp_(nsitecomp)
+ {
+ }
+
+ /// Return false if the components is smaller than a given size.
+ bool operator()(const label_16& l) const
+ {
+ return nsitecomp_[l] >= settings.min_comp_size;
+ }
+
+ const util::array<R>& nsitecomp_;
+ };
+
+ // Remove components which are too small
+ typedef util::array<accu_count_res_t> nsitecomp_t;
+ nsitecomp_t nsitecomp = labeling::compute(accu_count_t(), lbl, nlabels);
+ remove_small_comps<accu_count_res_t> fl2b(nsitecomp);
+ labeling::relabel_inplace(lbl, nlabels, fl2b);
+
+
+* data::fill(ima | array<box>, false);
+ => instead of:
+
+ for_all_components(i, boxes)
+ data::fill(ima | boxes[i], false);
+
+* draw::boxes
+
+* debug::filename(input_file_name, name);
+ => format the debug output file name correctly.
+ => input_file_name _ id _ name
+
+* image2d tmp = extend(ima, 1); compiles. Do we want that?
+ => may be confusing since tmp do not have the extension!
+
+
+
+
+
+
+
--
1.5.6.5
1
0