tesseract  3.05.02
tesseract::ImageThresholder Class Reference

#include <thresholder.h>

Public Member Functions

 ImageThresholder ()
 
virtual ~ImageThresholder ()
 
virtual void Clear ()
 Destroy the Pix if there is one, freeing memory. More...
 
bool IsEmpty () const
 Return true if no image has been set. More...
 
void SetImage (const unsigned char *imagedata, int width, int height, int bytes_per_pixel, int bytes_per_line)
 
void SetRectangle (int left, int top, int width, int height)
 
virtual void GetImageSizes (int *left, int *top, int *width, int *height, int *imagewidth, int *imageheight)
 
bool IsColor () const
 Return true if the source image is color. More...
 
bool IsBinary () const
 Returns true if the source image is binary. More...
 
int GetScaleFactor () const
 
void SetSourceYResolution (int ppi)
 
int GetSourceYResolution () const
 
int GetScaledYResolution () const
 
void SetEstimatedResolution (int ppi)
 
int GetScaledEstimatedResolution () const
 
void SetImage (const Pix *pix)
 
virtual void ThresholdToPix (PageSegMode pageseg_mode, Pix **pix)
 
virtual Pix * GetPixRectThresholds ()
 
Pix * GetPixRect ()
 
virtual Pix * GetPixRectGrey ()
 

Protected Member Functions

virtual void Init ()
 Common initialization shared between SetImage methods. More...
 
bool IsFullImage () const
 Return true if we are processing the full image. More...
 
void OtsuThresholdRectToPix (Pix *src_pix, Pix **out_pix) const
 
void ThresholdRectToPix (Pix *src_pix, int num_channels, const int *thresholds, const int *hi_values, Pix **pix) const
 

Protected Attributes

Pix * pix_
 
int image_width_
 
int image_height_
 
int pix_channels_
 
int pix_wpl_
 
int scale_
 
int yres_
 
int estimated_res_
 
int rect_left_
 
int rect_top_
 
int rect_width_
 
int rect_height_
 

Detailed Description

Base class for all tesseract image thresholding classes. Specific classes can add new thresholding methods by overriding ThresholdToPix. Each instance deals with a single image, but the design is intended to be useful for multiple calls to SetRectangle and ThresholdTo* if desired.

Definition at line 36 of file thresholder.h.

Constructor & Destructor Documentation

◆ ImageThresholder()

tesseract::ImageThresholder::ImageThresholder ( )

Definition at line 32 of file thresholder.cpp.

◆ ~ImageThresholder()

tesseract::ImageThresholder::~ImageThresholder ( )
virtual

Definition at line 40 of file thresholder.cpp.

40  {
41  Clear();
42 }
virtual void Clear()
Destroy the Pix if there is one, freeing memory.
Definition: thresholder.cpp:45

Member Function Documentation

◆ Clear()

void tesseract::ImageThresholder::Clear ( )
virtual

Destroy the Pix if there is one, freeing memory.

Definition at line 45 of file thresholder.cpp.

45  {
46  pixDestroy(&pix_);
47 }

◆ GetImageSizes()

void tesseract::ImageThresholder::GetImageSizes ( int *  left,
int *  top,
int *  width,
int *  height,
int *  imagewidth,
int *  imageheight 
)
virtual

Get enough parameters to be able to rebuild bounding boxes in the original image (not just within the rectangle). Left and top are enough with top-down coordinates, but the height of the rectangle and the image are needed for bottom-up.

Definition at line 132 of file thresholder.cpp.

134  {
135  *left = rect_left_;
136  *top = rect_top_;
137  *width = rect_width_;
138  *height = rect_height_;
139  *imagewidth = image_width_;
140  *imageheight = image_height_;
141 }

◆ GetPixRect()

Pix * tesseract::ImageThresholder::GetPixRect ( )

Get a clone/copy of the source image rectangle. The returned Pix must be pixDestroyed. This function will be used in the future by the page layout analysis, and the layout analysis that uses it will only be available with Leptonica, so there is no raw equivalent.

Definition at line 228 of file thresholder.cpp.

228  {
229  if (IsFullImage()) {
230  // Just clone the whole thing.
231  return pixClone(pix_);
232  } else {
233  // Crop to the given rectangle.
234  Box* box = boxCreate(rect_left_, rect_top_, rect_width_, rect_height_);
235  Pix* cropped = pixClipRectangle(pix_, box, NULL);
236  boxDestroy(&box);
237  return cropped;
238  }
239 }
bool IsFullImage() const
Return true if we are processing the full image.
Definition: thresholder.h:152

◆ GetPixRectGrey()

Pix * tesseract::ImageThresholder::GetPixRectGrey ( )
virtual

Definition at line 245 of file thresholder.cpp.

245  {
246  Pix* pix = GetPixRect(); // May have to be reduced to grey.
247  int depth = pixGetDepth(pix);
248  if (depth != 8) {
249  Pix* result = depth < 8 ? pixConvertTo8(pix, false)
250  : pixConvertRGBToLuminance(pix);
251  pixDestroy(&pix);
252  return result;
253  }
254  return pix;
255 }

◆ GetPixRectThresholds()

Pix * tesseract::ImageThresholder::GetPixRectThresholds ( )
virtual

Definition at line 201 of file thresholder.cpp.

201  {
202  if (IsBinary()) return NULL;
203  Pix* pix_grey = GetPixRectGrey();
204  int width = pixGetWidth(pix_grey);
205  int height = pixGetHeight(pix_grey);
206  int* thresholds;
207  int* hi_values;
208  OtsuThreshold(pix_grey, 0, 0, width, height, &thresholds, &hi_values);
209  pixDestroy(&pix_grey);
210  Pix* pix_thresholds = pixCreate(width, height, 8);
211  int threshold = thresholds[0] > 0 ? thresholds[0] : 128;
212  pixSetAllArbitrary(pix_thresholds, threshold);
213  delete [] thresholds;
214  delete [] hi_values;
215  return pix_thresholds;
216 }
int OtsuThreshold(Pix *src_pix, int left, int top, int width, int height, int **thresholds, int **hi_values)
Definition: otsuthr.cpp:39
virtual Pix * GetPixRectGrey()
bool IsBinary() const
Returns true if the source image is binary.
Definition: thresholder.h:75

◆ GetScaledEstimatedResolution()

int tesseract::ImageThresholder::GetScaledEstimatedResolution ( ) const
inline

Definition at line 106 of file thresholder.h.

106  {
107  return scale_ * estimated_res_;
108  }

◆ GetScaledYResolution()

int tesseract::ImageThresholder::GetScaledYResolution ( ) const
inline

Definition at line 93 of file thresholder.h.

93  {
94  return scale_ * yres_;
95  }

◆ GetScaleFactor()

int tesseract::ImageThresholder::GetScaleFactor ( ) const
inline

Definition at line 79 of file thresholder.h.

79  {
80  return scale_;
81  }

◆ GetSourceYResolution()

int tesseract::ImageThresholder::GetSourceYResolution ( ) const
inline

Definition at line 90 of file thresholder.h.

90  {
91  return yres_;
92  }

◆ Init()

void tesseract::ImageThresholder::Init ( )
protectedvirtual

Common initialization shared between SetImage methods.

Definition at line 219 of file thresholder.cpp.

219  {
221 }
void SetRectangle(int left, int top, int width, int height)

◆ IsBinary()

bool tesseract::ImageThresholder::IsBinary ( ) const
inline

Returns true if the source image is binary.

Definition at line 75 of file thresholder.h.

75  {
76  return pix_channels_ == 0;
77  }

◆ IsColor()

bool tesseract::ImageThresholder::IsColor ( ) const
inline

Return true if the source image is color.

Definition at line 70 of file thresholder.h.

70  {
71  return pix_channels_ >= 3;
72  }

◆ IsEmpty()

bool tesseract::ImageThresholder::IsEmpty ( ) const

Return true if no image has been set.

Definition at line 50 of file thresholder.cpp.

50  {
51  return pix_ == NULL;
52 }

◆ IsFullImage()

bool tesseract::ImageThresholder::IsFullImage ( ) const
inlineprotected

Return true if we are processing the full image.

Definition at line 152 of file thresholder.h.

◆ OtsuThresholdRectToPix()

void tesseract::ImageThresholder::OtsuThresholdRectToPix ( Pix *  src_pix,
Pix **  out_pix 
) const
protected

Definition at line 258 of file thresholder.cpp.

259  {
260  PERF_COUNT_START("OtsuThresholdRectToPix")
261  int* thresholds;
262  int* hi_values;
263 
264  int num_channels = OtsuThreshold(src_pix, rect_left_, rect_top_, rect_width_,
265  rect_height_, &thresholds, &hi_values);
266  // only use opencl if compiled w/ OpenCL and selected device is opencl
267 #ifdef USE_OPENCL
268  OpenclDevice od;
269  if ((num_channels == 4 || num_channels == 1) &&
270  od.selectedDeviceIsOpenCL() && rect_top_ == 0 && rect_left_ == 0 ) {
271  od.ThresholdRectToPixOCL((unsigned char*)pixGetData(src_pix), num_channels,
272  pixGetWpl(src_pix) * 4, thresholds, hi_values,
273  out_pix /*pix_OCL*/, rect_height_, rect_width_,
275  } else {
276 #endif
277  ThresholdRectToPix(src_pix, num_channels, thresholds, hi_values, out_pix);
278 #ifdef USE_OPENCL
279  }
280 #endif
281  delete [] thresholds;
282  delete [] hi_values;
283 
285 }
void ThresholdRectToPix(Pix *src_pix, int num_channels, const int *thresholds, const int *hi_values, Pix **pix) const
int OtsuThreshold(Pix *src_pix, int left, int top, int width, int height, int **thresholds, int **hi_values)
Definition: otsuthr.cpp:39
#define PERF_COUNT_START(FUNCT_NAME)
#define PERF_COUNT_END

◆ SetEstimatedResolution()

void tesseract::ImageThresholder::SetEstimatedResolution ( int  ppi)
inline

Definition at line 101 of file thresholder.h.

101  {
102  estimated_res_ = ppi;
103  }

◆ SetImage() [1/2]

void tesseract::ImageThresholder::SetImage ( const unsigned char *  imagedata,
int  width,
int  height,
int  bytes_per_pixel,
int  bytes_per_line 
)

SetImage makes a copy of all the image data, so it may be deleted immediately after this call. Greyscale of 8 and color of 24 or 32 bits per pixel may be given. Palette color images will not work properly and must be converted to 24 bit. Binary images of 1 bit per pixel may also be given but they must be byte packed with the MSB of the first byte being the first pixel, and a one pixel is WHITE. For binary images set bytes_per_pixel=0.

Definition at line 62 of file thresholder.cpp.

64  {
65  int bpp = bytes_per_pixel * 8;
66  if (bpp == 0) bpp = 1;
67  Pix* pix = pixCreate(width, height, bpp == 24 ? 32 : bpp);
68  l_uint32* data = pixGetData(pix);
69  int wpl = pixGetWpl(pix);
70  switch (bpp) {
71  case 1:
72  for (int y = 0; y < height; ++y, data += wpl, imagedata += bytes_per_line) {
73  for (int x = 0; x < width; ++x) {
74  if (imagedata[x / 8] & (0x80 >> (x % 8)))
75  CLEAR_DATA_BIT(data, x);
76  else
77  SET_DATA_BIT(data, x);
78  }
79  }
80  break;
81 
82  case 8:
83  // Greyscale just copies the bytes in the right order.
84  for (int y = 0; y < height; ++y, data += wpl, imagedata += bytes_per_line) {
85  for (int x = 0; x < width; ++x)
86  SET_DATA_BYTE(data, x, imagedata[x]);
87  }
88  break;
89 
90  case 24:
91  // Put the colors in the correct places in the line buffer.
92  for (int y = 0; y < height; ++y, imagedata += bytes_per_line) {
93  for (int x = 0; x < width; ++x, ++data) {
94  SET_DATA_BYTE(data, COLOR_RED, imagedata[3 * x]);
95  SET_DATA_BYTE(data, COLOR_GREEN, imagedata[3 * x + 1]);
96  SET_DATA_BYTE(data, COLOR_BLUE, imagedata[3 * x + 2]);
97  }
98  }
99  break;
100 
101  case 32:
102  // Maintain byte order consistency across different endianness.
103  for (int y = 0; y < height; ++y, imagedata += bytes_per_line, data += wpl) {
104  for (int x = 0; x < width; ++x) {
105  data[x] = (imagedata[x * 4] << 24) | (imagedata[x * 4 + 1] << 16) |
106  (imagedata[x * 4 + 2] << 8) | imagedata[x * 4 + 3];
107  }
108  }
109  break;
110 
111  default:
112  tprintf("Cannot convert RAW image to Pix with bpp = %d\n", bpp);
113  }
114  pixSetYRes(pix, 300);
115  SetImage(pix);
116  pixDestroy(&pix);
117 }
#define tprintf(...)
Definition: tprintf.h:31
void SetImage(const unsigned char *imagedata, int width, int height, int bytes_per_pixel, int bytes_per_line)
Definition: thresholder.cpp:62

◆ SetImage() [2/2]

void tesseract::ImageThresholder::SetImage ( const Pix *  pix)

Pix vs raw, which to use? Pix is the preferred input for efficiency, since raw buffers are copied. SetImage for Pix clones its input, so the source pix may be pixDestroyed immediately after, but may not go away until after the Thresholder has finished with it.

Definition at line 148 of file thresholder.cpp.

148  {
149  if (pix_ != NULL)
150  pixDestroy(&pix_);
151  Pix* src = const_cast<Pix*>(pix);
152  int depth;
153  pixGetDimensions(src, &image_width_, &image_height_, &depth);
154  // Convert the image as necessary so it is one of binary, plain RGB, or
155  // 8 bit with no colormap. Guarantee that we always end up with our own copy,
156  // not just a clone of the input.
157  if (pixGetColormap(src)) {
158  Pix* tmp = pixRemoveColormap(src, REMOVE_CMAP_BASED_ON_SRC);
159  depth = pixGetDepth(tmp);
160  if (depth > 1 && depth < 8) {
161  pix_ = pixConvertTo8(tmp, false);
162  pixDestroy(&tmp);
163  } else {
164  pix_ = tmp;
165  }
166  } else if (depth > 1 && depth < 8) {
167  pix_ = pixConvertTo8(src, false);
168  } else {
169  pix_ = pixCopy(NULL, src);
170  }
171  depth = pixGetDepth(pix_);
172  pix_channels_ = depth / 8;
173  pix_wpl_ = pixGetWpl(pix_);
174  scale_ = 1;
175  estimated_res_ = yres_ = pixGetYRes(pix_);
176  Init();
177 }
virtual void Init()
Common initialization shared between SetImage methods.

◆ SetRectangle()

void tesseract::ImageThresholder::SetRectangle ( int  left,
int  top,
int  width,
int  height 
)

Store the coordinates of the rectangle to process for later use. Doesn't actually do any thresholding.

Definition at line 121 of file thresholder.cpp.

121  {
122  rect_left_ = left;
123  rect_top_ = top;
124  rect_width_ = width;
125  rect_height_ = height;
126 }

◆ SetSourceYResolution()

void tesseract::ImageThresholder::SetSourceYResolution ( int  ppi)
inline

Definition at line 86 of file thresholder.h.

86  {
87  yres_ = ppi;
88  estimated_res_ = ppi;
89  }

◆ ThresholdRectToPix()

void tesseract::ImageThresholder::ThresholdRectToPix ( Pix *  src_pix,
int  num_channels,
const int *  thresholds,
const int *  hi_values,
Pix **  pix 
) const
protected

Threshold the rectangle, taking everything except the src_pix from the class, using thresholds/hi_values to the output pix. NOTE that num_channels is the size of the thresholds and hi_values

Definition at line 291 of file thresholder.cpp.

295  {
296  PERF_COUNT_START("ThresholdRectToPix")
297  *pix = pixCreate(rect_width_, rect_height_, 1);
298  uinT32* pixdata = pixGetData(*pix);
299  int wpl = pixGetWpl(*pix);
300  int src_wpl = pixGetWpl(src_pix);
301  uinT32* srcdata = pixGetData(src_pix);
302  for (int y = 0; y < rect_height_; ++y) {
303  const uinT32* linedata = srcdata + (y + rect_top_) * src_wpl;
304  uinT32* pixline = pixdata + y * wpl;
305  for (int x = 0; x < rect_width_; ++x) {
306  bool white_result = true;
307  for (int ch = 0; ch < num_channels; ++ch) {
308  int pixel = GET_DATA_BYTE(const_cast<void*>(
309  reinterpret_cast<const void *>(linedata)),
310  (x + rect_left_) * num_channels + ch);
311  if (hi_values[ch] >= 0 &&
312  (pixel > thresholds[ch]) == (hi_values[ch] == 0)) {
313  white_result = false;
314  break;
315  }
316  }
317  if (white_result)
318  CLEAR_DATA_BIT(pixline, x);
319  else
320  SET_DATA_BIT(pixline, x);
321  }
322  }
323 
325 }
#define PERF_COUNT_START(FUNCT_NAME)
unsigned int uinT32
Definition: host.h:36
#define PERF_COUNT_END

◆ ThresholdToPix()

void tesseract::ImageThresholder::ThresholdToPix ( PageSegMode  pageseg_mode,
Pix **  pix 
)
virtual

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.

Definition at line 182 of file thresholder.cpp.

182  {
183  if (pix_channels_ == 0) {
184  // We have a binary image, but it still has to be copied, as this API
185  // allows the caller to modify the output.
186  Pix* original = GetPixRect();
187  *pix = pixCopy(NULL, original);
188  pixDestroy(&original);
189  } else {
191  }
192 }
void OtsuThresholdRectToPix(Pix *src_pix, Pix **out_pix) const

Member Data Documentation

◆ estimated_res_

int tesseract::ImageThresholder::estimated_res_
protected

Definition at line 180 of file thresholder.h.

◆ image_height_

int tesseract::ImageThresholder::image_height_
protected

Definition at line 174 of file thresholder.h.

◆ image_width_

int tesseract::ImageThresholder::image_width_
protected

Definition at line 173 of file thresholder.h.

◆ pix_

Pix* tesseract::ImageThresholder::pix_
protected

Clone or other copy of the source Pix. The pix will always be PixDestroy()ed on destruction of the class.

Definition at line 171 of file thresholder.h.

◆ pix_channels_

int tesseract::ImageThresholder::pix_channels_
protected

Definition at line 175 of file thresholder.h.

◆ pix_wpl_

int tesseract::ImageThresholder::pix_wpl_
protected

Definition at line 176 of file thresholder.h.

◆ rect_height_

int tesseract::ImageThresholder::rect_height_
protected

Definition at line 184 of file thresholder.h.

◆ rect_left_

int tesseract::ImageThresholder::rect_left_
protected

Definition at line 181 of file thresholder.h.

◆ rect_top_

int tesseract::ImageThresholder::rect_top_
protected

Definition at line 182 of file thresholder.h.

◆ rect_width_

int tesseract::ImageThresholder::rect_width_
protected

Definition at line 183 of file thresholder.h.

◆ scale_

int tesseract::ImageThresholder::scale_
protected

Definition at line 178 of file thresholder.h.

◆ yres_

int tesseract::ImageThresholder::yres_
protected

Definition at line 179 of file thresholder.h.


The documentation for this class was generated from the following files: