mirror of
https://github.com/tesseract-ocr/tesseract.git
synced 2024-11-30 23:49:05 +08:00
124 lines
4.9 KiB
C++
124 lines
4.9 KiB
C++
///////////////////////////////////////////////////////////////////////
|
|
// File: associate.h
|
|
// Description: Structs, classes, typedefs useful for the segmentation
|
|
// search. Functions for scoring segmentation paths according
|
|
// to their character widths, gap widths and seam cuts.
|
|
// Author: Daria Antonova
|
|
// Created: Mon Mar 8 11:26:43 PDT 2010
|
|
//
|
|
// (C) Copyright 2010, Google Inc.
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef ASSOCIATE_H
|
|
#define ASSOCIATE_H
|
|
|
|
#include "blobs.h"
|
|
#include "elst.h"
|
|
#include "ratngs.h"
|
|
#include "seam.h"
|
|
#include "split.h"
|
|
|
|
class WERD_RES;
|
|
|
|
namespace tesseract {
|
|
|
|
// Statisitcs about character widths, gaps and seams.
|
|
struct AssociateStats {
|
|
AssociateStats() { Clear(); }
|
|
|
|
void Clear() {
|
|
shape_cost = 0.0f;
|
|
bad_shape = false;
|
|
full_wh_ratio = 0.0f;
|
|
full_wh_ratio_total = 0.0f;
|
|
full_wh_ratio_var = 0.0f;
|
|
bad_fixed_pitch_right_gap = false;
|
|
bad_fixed_pitch_wh_ratio = false;
|
|
gap_sum = 0;
|
|
}
|
|
|
|
void Print() { tprintf("AssociateStats: s(%g %d)\n", shape_cost, bad_shape); }
|
|
|
|
float shape_cost; // cost of blob shape
|
|
bool bad_shape; // true if the shape of the blob is unacceptable
|
|
float full_wh_ratio; // width-to-hight ratio + gap on the right
|
|
float full_wh_ratio_total; // sum of width-to-hight ratios
|
|
// on the path terminating at this blob
|
|
float full_wh_ratio_var; // variance of full_wh_ratios on the path
|
|
bool bad_fixed_pitch_right_gap; // true if there is no gap before
|
|
// the blob on the right
|
|
bool bad_fixed_pitch_wh_ratio; // true if the blobs has width-to-hight
|
|
// ratio > kMaxFixedPitchCharAspectRatio
|
|
int gap_sum; // sum of gaps within the blob
|
|
};
|
|
|
|
// Utility functions for scoring segmentation paths according to their
|
|
// character widths, gap widths, seam characteristics.
|
|
class AssociateUtils {
|
|
public:
|
|
static const float kMaxFixedPitchCharAspectRatio;
|
|
static const float kMinGap;
|
|
|
|
// Returns outline length of the given blob is computed as:
|
|
// rating_cert_scale * rating / certainty
|
|
// Since from Wordrec::SegSearch() in segsearch.cpp
|
|
// rating_cert_scale = -1.0 * getDict().certainty_scale / rating_scale
|
|
// And from Classify::ConvertMatchesToChoices() in adaptmatch.cpp
|
|
// Rating = Certainty = next.rating
|
|
// Rating *= rating_scale * Results->BlobLength
|
|
// Certainty *= -(getDict().certainty_scale)
|
|
static inline float ComputeOutlineLength(float rating_cert_scale,
|
|
const BLOB_CHOICE &b) {
|
|
return rating_cert_scale * b.rating() / b.certainty();
|
|
}
|
|
static inline float ComputeRating(float rating_cert_scale,
|
|
float cert, int width) {
|
|
return static_cast<float>(width) * cert / rating_cert_scale;
|
|
}
|
|
|
|
// Computes character widths, gaps and seams stats given the
|
|
// AssociateStats of the path so far, col, row of the blob that
|
|
// is being added to the path, and WERD_RES containing information
|
|
// about character widths, gaps and seams.
|
|
// Fills associate_cost with the combined shape, gap and seam cost
|
|
// of adding a unichar from (col, row) to the path (note that since
|
|
// this function could be used to compute the prioritization for
|
|
// pain points, (col, row) entry might not be classified yet; thus
|
|
// information in the (col, row) entry of the ratings matrix is not used).
|
|
//
|
|
// Note: the function assumes that word_res, stats and
|
|
// associate_cost pointers are not NULL.
|
|
static void ComputeStats(int col, int row,
|
|
const AssociateStats *parent_stats,
|
|
int parent_path_length,
|
|
bool fixed_pitch,
|
|
float max_char_wh_ratio,
|
|
WERD_RES *word_res,
|
|
bool debug,
|
|
AssociateStats *stats);
|
|
|
|
// Returns the width cost for fixed-pitch text.
|
|
static float FixedPitchWidthCost(float norm_width, float right_gap,
|
|
bool end_pos, float max_char_wh_ratio);
|
|
|
|
// Returns the gap cost for fixed-pitch text (penalizes vertically
|
|
// overlapping components).
|
|
static inline float FixedPitchGapCost(float norm_gap, bool end_pos) {
|
|
return (norm_gap < 0.05 && !end_pos) ? 5.0f : 0.0f;
|
|
}
|
|
};
|
|
|
|
} // namespace tesseract
|
|
|
|
#endif
|