Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
a7660331a
tesseract
提交
e7c01a6f
T
tesseract
项目概览
a7660331a
/
tesseract
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
tesseract
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
e7c01a6f
编写于
5月 10, 2021
作者:
E
Egor Pugin
提交者:
GitHub
5月 10, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3418 from amitdo/thresholder
Add more binarization options
上级
176d0927
21e76c7a
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
97 addition
and
12 deletion
+97
-12
include/tesseract/publictypes.h
include/tesseract/publictypes.h
+11
-0
src/api/baseapi.cpp
src/api/baseapi.cpp
+33
-12
src/ccmain/tesseractclass.cpp
src/ccmain/tesseractclass.cpp
+5
-0
src/ccmain/tesseractclass.h
src/ccmain/tesseractclass.h
+3
-0
src/ccmain/thresholder.cpp
src/ccmain/thresholder.cpp
+40
-0
src/ccmain/thresholder.h
src/ccmain/thresholder.h
+3
-0
src/ccstruct/image.h
src/ccstruct/image.h
+2
-0
未找到文件。
include/tesseract/publictypes.h
浏览文件 @
e7c01a6f
...
...
@@ -278,6 +278,17 @@ enum OcrEngineMode {
OEM_COUNT
// Number of OEMs
};
/**
* Except when Otsu is chosen
* Leptonica is used for thresholding
*/
enum
class
ThreshMethod
{
Otsu
,
// Legacy Tesseract's Otsu thresholding
AdaptiveOtsu
,
TiledSauvola
,
Count
,
// Number of Thresholding methods
};
}
// namespace tesseract.
#endif // TESSERACT_CCSTRUCT_PUBLICTYPES_H_
src/api/baseapi.cpp
浏览文件 @
e7c01a6f
...
...
@@ -2108,20 +2108,41 @@ bool TessBaseAPI::Threshold(Pix **pix) {
thresholder_
->
SetSourceYResolution
(
kMinCredibleResolution
);
}
auto
pageseg_mode
=
static_cast
<
PageSegMode
>
(
static_cast
<
int
>
(
tesseract_
->
tessedit_pageseg_mode
));
Image
im
(
*
pix
);
if
(
!
thresholder_
->
ThresholdToPix
(
pageseg_mode
,
&
im
))
{
return
false
;
}
*
pix
=
im
;
Image
pix_binary
(
*
pix
);
Image
pix_grey
;
Image
pix_thresholds
;
auto
thresholding_method
=
static_cast
<
ThreshMethod
>
(
static_cast
<
int
>
(
tesseract_
->
thresholding_method
));
if
(
thresholding_method
==
ThreshMethod
::
Otsu
)
{
if
(
!
thresholder_
->
ThresholdToPix
(
pageseg_mode
,
&
pix_binary
))
{
return
false
;
}
*
pix
=
pix_binary
;
if
(
!
thresholder_
->
IsBinary
())
{
tesseract_
->
set_pix_thresholds
(
thresholder_
->
GetPixRectThresholds
());
tesseract_
->
set_pix_grey
(
thresholder_
->
GetPixRectGrey
());
}
else
{
tesseract_
->
set_pix_thresholds
(
nullptr
);
tesseract_
->
set_pix_grey
(
nullptr
);
}
}
else
{
auto
[
ok
,
pix_grey
,
pix_binary
,
pix_thresholds
]
=
thresholder_
->
Threshold
(
thresholding_method
);
if
(
!
ok
)
{
return
false
;
}
*
pix
=
pix_binary
;
tesseract_
->
set_pix_thresholds
(
pix_thresholds
);
tesseract_
->
set_pix_grey
(
pix_grey
);
}
thresholder_
->
GetImageSizes
(
&
rect_left_
,
&
rect_top_
,
&
rect_width_
,
&
rect_height_
,
&
image_width_
,
&
image_height_
);
if
(
!
thresholder_
->
IsBinary
())
{
tesseract_
->
set_pix_thresholds
(
thresholder_
->
GetPixRectThresholds
());
tesseract_
->
set_pix_grey
(
thresholder_
->
GetPixRectGrey
());
}
else
{
tesseract_
->
set_pix_thresholds
(
nullptr
);
tesseract_
->
set_pix_grey
(
nullptr
);
}
// Set the internal resolution that is used for layout parameters from the
// estimated resolution, rather than the image resolution, which may be
// fabricated, but we will use the image resolution, if there is one, to
...
...
src/ccmain/tesseractclass.cpp
浏览文件 @
e7c01a6f
...
...
@@ -74,6 +74,11 @@ Tesseract::Tesseract()
"11=sparse_text, 12=sparse_text+osd, 13=raw_line"
" (Values from PageSegMode enum in tesseract/publictypes.h)"
,
this
->
params
())
,
INT_MEMBER
(
thresholding_method
,
static_cast
<
int
>
(
tesseract
::
ThreshMethod
::
Otsu
),
"Thresholding "
"method: 0 = Otsu, 1 = Adaptive Otsu, 2 = Sauvola"
,
this
->
params
())
,
INT_INIT_MEMBER
(
tessedit_ocr_engine_mode
,
tesseract
::
OEM_DEFAULT
,
"Which OCR engine(s) to run (Tesseract, LSTM, both)."
" Defaults to loading and running the most accurate"
...
...
src/ccmain/tesseractclass.h
浏览文件 @
e7c01a6f
...
...
@@ -762,6 +762,9 @@ public:
"Page seg mode: 0=osd only, 1=auto+osd, 2=auto, 3=col, 4=block,"
" 5=line, 6=word, 7=char"
" (Values from PageSegMode enum in tesseract/publictypes.h)"
);
INT_VAR_H
(
thresholding_method
,
static_cast
<
int
>
(
tesseract
::
ThreshMethod
::
Otsu
),
"Thresholding "
"method: 0 = Otsu, 1 = Adaptive Otsu, 2 = Sauvola"
);
INT_VAR_H
(
tessedit_ocr_engine_mode
,
tesseract
::
OEM_DEFAULT
,
"Which OCR engine(s) to run (Tesseract, LSTM, both). Defaults"
" to loading and running the most accurate available."
);
...
...
src/ccmain/thresholder.cpp
浏览文件 @
e7c01a6f
...
...
@@ -20,6 +20,7 @@
#include <cstdint> // for uint32_t
#include <cstring>
#include <tuple>
#include "otsuthr.h"
#include "thresholder.h"
...
...
@@ -184,6 +185,45 @@ void ImageThresholder::SetImage(const Image pix) {
Init
();
}
std
::
tuple
<
bool
,
Image
,
Image
,
Image
>
ImageThresholder
::
Threshold
(
ThreshMethod
method
)
{
Image
pix_grey
=
nullptr
;
Image
pix_binary
=
nullptr
;
Image
pix_thresholds
=
nullptr
;
if
(
image_width_
>
INT16_MAX
||
image_height_
>
INT16_MAX
)
{
tprintf
(
"Image too large: (%d, %d)
\n
"
,
image_width_
,
image_height_
);
return
std
::
make_tuple
(
false
,
nullptr
,
nullptr
,
nullptr
);
}
if
(
pix_channels_
==
0
)
{
// We have a binary image, but it still has to be copied, as this API
// allows the caller to modify the output.
Image
original
=
GetPixRect
();
pix_binary
=
original
.
copy
();
original
.
destroy
();
return
std
::
make_tuple
(
false
,
nullptr
,
pix_binary
,
nullptr
);
}
pix_grey
=
GetPixRectGrey
();
if
(
method
==
ThreshMethod
::
Otsu
||
method
>=
ThreshMethod
::
Count
)
{
method
=
ThreshMethod
::
AdaptiveOtsu
;
}
int
r
;
if
(
method
==
ThreshMethod
::
AdaptiveOtsu
)
{
r
=
pixOtsuAdaptiveThreshold
(
pix_grey
,
300
,
300
,
0
,
0
,
0.1
,
pix_thresholds
.
a
(),
pix_binary
.
a
());
}
else
if
(
method
==
ThreshMethod
::
TiledSauvola
)
{
r
=
pixSauvolaBinarizeTiled
(
pix_grey
,
25
,
0.40
,
300
,
300
,
pix_thresholds
.
a
(),
pix_binary
.
a
());
}
bool
ok
=
r
==
0
?
true
:
false
;
return
std
::
make_tuple
(
ok
,
pix_grey
,
pix_binary
,
pix_thresholds
);
}
// Threshold the source image as efficiently as possible to the output Pix.
// Creates a Pix and sets pix to point to the resulting pointer.
// Caller must use pixDestroy to free the created Pix.
...
...
src/ccmain/thresholder.h
浏览文件 @
e7c01a6f
...
...
@@ -121,6 +121,9 @@ public:
/// Returns false on error.
virtual
bool
ThresholdToPix
(
PageSegMode
pageseg_mode
,
Image
*
pix
);
virtual
std
::
tuple
<
bool
,
Image
,
Image
,
Image
>
Threshold
(
ThreshMethod
method
);
// Gets a pix that contains an 8 bit threshold value at each pixel. The
// returned pix may be an integer reduction of the binary image such that
// the scale factor may be inferred from the ratio of the sizes, even down
...
...
src/ccstruct/image.h
浏览文件 @
e7c01a6f
...
...
@@ -34,6 +34,8 @@ public:
operator
Pix
*
()
const
{
return
pix_
;
}
explicit
operator
Pix
**
()
{
return
&
pix_
;
}
Pix
*
operator
->
()
const
{
return
pix_
;
}
Pix
**
a
()
{
return
&
pix_
;
}
// api
Image
clone
()
const
;
// increases refcount
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录