|
tesseract
3.03
|
#include <normalis.h>
Public Member Functions | |
| DENORM () | |
| DENORM (const DENORM &) | |
| DENORM & | operator= (const DENORM &) |
| ~DENORM () | |
| void | SetupNormalization (const BLOCK *block, const FCOORD *rotation, const DENORM *predecessor, float x_origin, float y_origin, float x_scale, float y_scale, float final_xshift, float final_yshift) |
| void | SetupNonLinear (const DENORM *predecessor, const TBOX &box, float target_width, float target_height, float final_xshift, float final_yshift, const GenericVector< GenericVector< int > > &x_coords, const GenericVector< GenericVector< int > > &y_coords) |
| void | LocalNormTransform (const TPOINT &pt, TPOINT *transformed) const |
| void | LocalNormTransform (const FCOORD &pt, FCOORD *transformed) const |
| void | NormTransform (const DENORM *first_norm, const TPOINT &pt, TPOINT *transformed) const |
| void | NormTransform (const DENORM *first_norm, const FCOORD &pt, FCOORD *transformed) const |
| void | LocalDenormTransform (const TPOINT &pt, TPOINT *original) const |
| void | LocalDenormTransform (const FCOORD &pt, FCOORD *original) const |
| void | DenormTransform (const DENORM *last_denorm, const TPOINT &pt, TPOINT *original) const |
| void | DenormTransform (const DENORM *last_denorm, const FCOORD &pt, FCOORD *original) const |
| void | LocalNormBlob (TBLOB *blob) const |
| void | XHeightRange (int unichar_id, const UNICHARSET &unicharset, const TBOX &bbox, float *min_xht, float *max_xht, float *yshift) const |
| void | Print () const |
| Pix * | pix () const |
| void | set_pix (Pix *pix) |
| bool | inverse () const |
| void | set_inverse (bool value) |
| const DENORM * | RootDenorm () const |
| const DENORM * | predecessor () const |
| float | x_scale () const |
| float | y_scale () const |
| const BLOCK * | block () const |
| void | set_block (const BLOCK *block) |
Definition at line 52 of file normalis.h.
| DENORM::DENORM | ( | ) |
Definition at line 37 of file normalis.cpp.
{
Init();
}
| DENORM::DENORM | ( | const DENORM & | src | ) |
Definition at line 41 of file normalis.cpp.
{
rotation_ = NULL;
*this = src;
}
| DENORM::~DENORM | ( | ) |
Definition at line 66 of file normalis.cpp.
{
Clear();
}
| const BLOCK* DENORM::block | ( | ) | const [inline] |
Definition at line 275 of file normalis.h.
{
return block_;
}
| void DENORM::DenormTransform | ( | const DENORM * | last_denorm, |
| const TPOINT & | pt, | ||
| TPOINT * | original | ||
| ) | const |
Definition at line 389 of file normalis.cpp.
{
FCOORD src_pt(pt.x, pt.y);
FCOORD float_result;
DenormTransform(last_denorm, src_pt, &float_result);
original->x = IntCastRounded(float_result.x());
original->y = IntCastRounded(float_result.y());
}
| void DENORM::DenormTransform | ( | const DENORM * | last_denorm, |
| const FCOORD & | pt, | ||
| FCOORD * | original | ||
| ) | const |
Definition at line 397 of file normalis.cpp.
{
LocalDenormTransform(pt, original);
if (last_denorm != this) {
if (predecessor_ != NULL) {
predecessor_->DenormTransform(last_denorm, *original, original);
} else if (block_ != NULL) {
original->rotate(block_->re_rotation());
}
}
}
| bool DENORM::inverse | ( | ) | const [inline] |
Definition at line 254 of file normalis.h.
{
return inverse_;
}
| void DENORM::LocalDenormTransform | ( | const TPOINT & | pt, |
| TPOINT * | original | ||
| ) | const |
Definition at line 359 of file normalis.cpp.
{
FCOORD src_pt(pt.x, pt.y);
FCOORD float_result;
LocalDenormTransform(src_pt, &float_result);
original->x = IntCastRounded(float_result.x());
original->y = IntCastRounded(float_result.y());
}
| void DENORM::LocalDenormTransform | ( | const FCOORD & | pt, |
| FCOORD * | original | ||
| ) | const |
Definition at line 366 of file normalis.cpp.
{
FCOORD rotated(pt.x() - final_xshift_, pt.y() - final_yshift_);
if (x_map_ != NULL && y_map_ != NULL) {
int x = x_map_->binary_search(rotated.x());
original->set_x(x + x_origin_);
int y = y_map_->binary_search(rotated.y());
original->set_y(y + y_origin_);
} else {
if (rotation_ != NULL) {
FCOORD inverse_rotation(rotation_->x(), -rotation_->y());
rotated.rotate(inverse_rotation);
}
original->set_x(rotated.x() / x_scale_ + x_origin_);
float y_scale = y_scale_;
original->set_y(rotated.y() / y_scale + y_origin_);
}
}
| void DENORM::LocalNormBlob | ( | TBLOB * | blob | ) | const |
Definition at line 411 of file normalis.cpp.
{
TBOX blob_box = blob->bounding_box();
ICOORD translation(-IntCastRounded(x_origin_), -IntCastRounded(y_origin_));
blob->Move(translation);
if (y_scale_ != 1.0f)
blob->Scale(y_scale_);
if (rotation_ != NULL)
blob->Rotate(*rotation_);
translation.set_x(IntCastRounded(final_xshift_));
translation.set_y(IntCastRounded(final_yshift_));
blob->Move(translation);
}
| void DENORM::LocalNormTransform | ( | const TPOINT & | pt, |
| TPOINT * | transformed | ||
| ) | const |
Definition at line 305 of file normalis.cpp.
{
FCOORD src_pt(pt.x, pt.y);
FCOORD float_result;
LocalNormTransform(src_pt, &float_result);
transformed->x = IntCastRounded(float_result.x());
transformed->y = IntCastRounded(float_result.y());
}
| void DENORM::LocalNormTransform | ( | const FCOORD & | pt, |
| FCOORD * | transformed | ||
| ) | const |
Definition at line 312 of file normalis.cpp.
{
FCOORD translated(pt.x() - x_origin_, pt.y() - y_origin_);
if (x_map_ != NULL && y_map_ != NULL) {
int x = ClipToRange(IntCastRounded(translated.x()), 0, x_map_->size()-1);
translated.set_x((*x_map_)[x]);
int y = ClipToRange(IntCastRounded(translated.y()), 0, y_map_->size()-1);
translated.set_y((*y_map_)[y]);
} else {
translated.set_x(translated.x() * x_scale_);
translated.set_y(translated.y() * y_scale_);
if (rotation_ != NULL)
translated.rotate(*rotation_);
}
transformed->set_x(translated.x() + final_xshift_);
transformed->set_y(translated.y() + final_yshift_);
}
| void DENORM::NormTransform | ( | const DENORM * | first_norm, |
| const TPOINT & | pt, | ||
| TPOINT * | transformed | ||
| ) | const |
Definition at line 334 of file normalis.cpp.
{
FCOORD src_pt(pt.x, pt.y);
FCOORD float_result;
NormTransform(first_norm, src_pt, &float_result);
transformed->x = IntCastRounded(float_result.x());
transformed->y = IntCastRounded(float_result.y());
}
| void DENORM::NormTransform | ( | const DENORM * | first_norm, |
| const FCOORD & | pt, | ||
| FCOORD * | transformed | ||
| ) | const |
Definition at line 342 of file normalis.cpp.
{
FCOORD src_pt(pt);
if (first_norm != this) {
if (predecessor_ != NULL) {
predecessor_->NormTransform(first_norm, pt, &src_pt);
} else if (block_ != NULL) {
FCOORD fwd_rotation(block_->re_rotation().x(),
-block_->re_rotation().y());
src_pt.rotate(fwd_rotation);
}
}
LocalNormTransform(src_pt, transformed);
}
Definition at line 47 of file normalis.cpp.
{
Clear();
inverse_ = src.inverse_;
predecessor_ = src.predecessor_;
pix_ = src.pix_;
block_ = src.block_;
if (src.rotation_ == NULL)
rotation_ = NULL;
else
rotation_ = new FCOORD(*src.rotation_);
x_origin_ = src.x_origin_;
y_origin_ = src.y_origin_;
x_scale_ = src.x_scale_;
y_scale_ = src.y_scale_;
final_xshift_ = src.final_xshift_;
final_yshift_ = src.final_yshift_;
return *this;
}
| Pix* DENORM::pix | ( | ) | const [inline] |
Definition at line 248 of file normalis.h.
{
return pix_;
}
| const DENORM* DENORM::predecessor | ( | ) | const [inline] |
Definition at line 265 of file normalis.h.
{
return predecessor_;
}
| void DENORM::Print | ( | ) | const |
Definition at line 505 of file normalis.cpp.
{
if (pix_ != NULL) {
tprintf("Pix dimensions %d x %d x %d\n",
pixGetWidth(pix_), pixGetHeight(pix_), pixGetDepth(pix_));
}
if (inverse_)
tprintf("Inverse\n");
if (block_ && block_->re_rotation().x() != 1.0f) {
tprintf("Block rotation %g, %g\n",
block_->re_rotation().x(), block_->re_rotation().y());
}
tprintf("Input Origin = (%g, %g)\n", x_origin_, y_origin_);
if (x_map_ != NULL && y_map_ != NULL) {
tprintf("x map:\n");
for (int x = 0; x < x_map_->size(); ++x) {
tprintf("%g ", (*x_map_)[x]);
}
tprintf("\ny map:\n");
for (int y = 0; y < y_map_->size(); ++y) {
tprintf("%g ", (*y_map_)[y]);
}
tprintf("\n");
} else {
tprintf("Scale = (%g, %g)\n", x_scale_, y_scale_);
if (rotation_ != NULL)
tprintf("Rotation = (%g, %g)\n", rotation_->x(), rotation_->y());
}
tprintf("Final Origin = (%g, %g)\n", final_xshift_, final_xshift_);
if (predecessor_ != NULL) {
tprintf("Predecessor:\n");
predecessor_->Print();
}
}
| const DENORM* DENORM::RootDenorm | ( | ) | const [inline] |
Definition at line 260 of file normalis.h.
{
if (predecessor_ != NULL)
return predecessor_->RootDenorm();
return this;
}
| void DENORM::set_block | ( | const BLOCK * | block | ) | [inline] |
Definition at line 278 of file normalis.h.
{
block_ = block;
}
| void DENORM::set_inverse | ( | bool | value | ) | [inline] |
Definition at line 257 of file normalis.h.
{
inverse_ = value;
}
| void DENORM::set_pix | ( | Pix * | pix | ) | [inline] |
Definition at line 251 of file normalis.h.
{
pix_ = pix;
}
| void DENORM::SetupNonLinear | ( | const DENORM * | predecessor, |
| const TBOX & | box, | ||
| float | target_width, | ||
| float | target_height, | ||
| float | final_xshift, | ||
| float | final_yshift, | ||
| const GenericVector< GenericVector< int > > & | x_coords, | ||
| const GenericVector< GenericVector< int > > & | y_coords | ||
| ) |
Definition at line 267 of file normalis.cpp.
{
Clear();
predecessor_ = predecessor;
// x_map_ and y_map_ store a mapping from input x and y coordinate to output
// x and y coordinate, based on scaling to the supplied target_width and
// target_height.
x_map_ = new GenericVector<float>;
y_map_ = new GenericVector<float>;
// Set a 2-d image array to the run lengths at each pixel.
int width = box.width();
int height = box.height();
GENERIC_2D_ARRAY<int> minruns(width, height, 0);
ComputeRunlengthImage(box, x_coords, y_coords, &minruns);
// Edge density is the sum of the inverses of the run lengths. Compute
// edge density projection profiles.
ComputeEdgeDensityProfiles(box, minruns, x_map_, y_map_);
// Convert the edge density profiles to the coordinates by multiplying by
// the desired size and accumulating.
(*x_map_)[width] = target_width;
for (int x = width - 1; x >= 0; --x) {
(*x_map_)[x] = (*x_map_)[x + 1] - (*x_map_)[x] * target_width;
}
(*y_map_)[height] = target_height;
for (int y = height - 1; y >= 0; --y) {
(*y_map_)[y] = (*y_map_)[y + 1] - (*y_map_)[y] * target_height;
}
x_origin_ = box.left();
y_origin_ = box.bottom();
final_xshift_ = final_xshift;
final_yshift_ = final_yshift;
}
| void DENORM::SetupNormalization | ( | const BLOCK * | block, |
| const FCOORD * | rotation, | ||
| const DENORM * | predecessor, | ||
| float | x_origin, | ||
| float | y_origin, | ||
| float | x_scale, | ||
| float | y_scale, | ||
| float | final_xshift, | ||
| float | final_yshift | ||
| ) |
Definition at line 95 of file normalis.cpp.
{
Clear();
block_ = block;
if (rotation == NULL)
rotation_ = NULL;
else
rotation_ = new FCOORD(*rotation);
predecessor_ = predecessor;
x_origin_ = x_origin;
y_origin_ = y_origin;
x_scale_ = x_scale;
y_scale_ = y_scale;
final_xshift_ = final_xshift;
final_yshift_ = final_yshift;
}
| float DENORM::x_scale | ( | ) | const [inline] |
Definition at line 269 of file normalis.h.
{
return x_scale_;
}
| void DENORM::XHeightRange | ( | int | unichar_id, |
| const UNICHARSET & | unicharset, | ||
| const TBOX & | bbox, | ||
| float * | min_xht, | ||
| float * | max_xht, | ||
| float * | yshift | ||
| ) | const |
Definition at line 428 of file normalis.cpp.
{
// Default return -- accept anything.
*yshift = 0.0f;
*min_xht = 0.0f;
*max_xht = MAX_FLOAT32;
if (!unicharset.top_bottom_useful())
return;
// Clip the top and bottom to the limit of normalized feature space.
int top = ClipToRange<int>(bbox.top(), 0, kBlnCellHeight - 1);
int bottom = ClipToRange<int>(bbox.bottom(), 0, kBlnCellHeight - 1);
// A tolerance of yscale corresponds to 1 pixel in the image.
double tolerance = y_scale();
// If the script doesn't have upper and lower-case characters, widen the
// tolerance to allow sloppy baseline/x-height estimates.
if (!unicharset.script_has_upper_lower())
tolerance = y_scale() * kSloppyTolerance;
int min_bottom, max_bottom, min_top, max_top;
unicharset.get_top_bottom(unichar_id, &min_bottom, &max_bottom,
&min_top, &max_top);
// Calculate the scale factor we'll use to get to image y-pixels
double midx = (bbox.left() + bbox.right()) / 2;
double ydiff = (bbox.top() - bbox.bottom()) + 2;
FCOORD mid_bot(midx, bbox.bottom()), tmid_bot;
FCOORD mid_high(midx, bbox.bottom() + ydiff), tmid_high;
DenormTransform(NULL, mid_bot, &tmid_bot);
DenormTransform(NULL, mid_high, &tmid_high);
// bln_y_measure * yscale = image_y_measure
double yscale = tmid_high.pt_to_pt_dist(tmid_bot) / ydiff;
// Calculate y-shift
int bln_yshift = 0, bottom_shift = 0, top_shift = 0;
if (bottom < min_bottom - tolerance) {
bottom_shift = bottom - min_bottom;
} else if (bottom > max_bottom + tolerance) {
bottom_shift = bottom - max_bottom;
}
if (top < min_top - tolerance) {
top_shift = top - min_top;
} else if (top > max_top + tolerance) {
top_shift = top - max_top;
}
if ((top_shift >= 0 && bottom_shift > 0) ||
(top_shift < 0 && bottom_shift < 0)) {
bln_yshift = (top_shift + bottom_shift) / 2;
}
*yshift = bln_yshift * yscale;
// To help very high cap/xheight ratio fonts accept the correct x-height,
// and to allow the large caps in small caps to accept the xheight of the
// small caps, add kBlnBaselineOffset to chars with a maximum max, and have
// a top already at a significantly high position.
if (max_top == kBlnCellHeight - 1 &&
top > kBlnCellHeight - kBlnBaselineOffset / 2)
max_top += kBlnBaselineOffset;
top -= bln_yshift;
int height = top - kBlnBaselineOffset - bottom_shift;
double min_height = min_top - kBlnBaselineOffset - tolerance;
double max_height = max_top - kBlnBaselineOffset + tolerance;
// We shouldn't try calculations if the characters are very short (for example
// for punctuation).
if (min_height > kBlnXHeight / 8 && height > 0) {
float result = height * kBlnXHeight * yscale / min_height;
*max_xht = result + kFinalPixelTolerance;
result = height * kBlnXHeight * yscale / max_height;
*min_xht = result - kFinalPixelTolerance;
}
}
| float DENORM::y_scale | ( | ) | const [inline] |
Definition at line 272 of file normalis.h.
{
return y_scale_;
}