| /////////////////////////////////////////////////////////////////////// |
| // File: thresholder.h |
| // Description: Base API for thresolding images in tesseract. |
| // Author: Ray Smith |
| // Created: Mon May 12 11:00:15 PDT 2008 |
| // |
| // (C) Copyright 2008, 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 TESSERACT_CCMAIN_THRESHOLDER_H__ |
| #define TESSERACT_CCMAIN_THRESHOLDER_H__ |
| |
| class IMAGE; |
| struct Pix; |
| |
| namespace tesseract { |
| |
| // Base class for all tesseract image thresholding classes. |
| // Specific classes can add new thresholding methods by |
| // overriding ThresholdToIMAGE and/or 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. |
| class ImageThresholder { |
| public: |
| ImageThresholder(); |
| virtual ~ImageThresholder(); |
| |
| // Destroy the Pix if there is one, freeing memory. |
| virtual void Clear(); |
| |
| // Return true if no image has been set. |
| bool IsEmpty() const; |
| |
| // SetImage makes a copy of only the metadata, not the underlying |
| // image buffer. It promises to treat the source as read-only in either case, |
| // but in return assumes that the Pix or image buffer remain valid |
| // throughout the life of the ImageThresholder. |
| // 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. |
| void SetImage(const unsigned char* imagedata, int width, int height, |
| int bytes_per_pixel, int bytes_per_line); |
| |
| // Store the coordinates of the rectangle to process for later use. |
| // Doesn't actually do any thresholding. |
| void SetRectangle(int left, int top, int width, int height); |
| |
| // 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. |
| virtual void GetImageSizes(int* left, int* top, int* width, int* height, |
| int* imagewidth, int* imageheight); |
| |
| // Return true if HAVE_LIBLEPT and this thresholder implements the Pix |
| // interface. |
| virtual bool HasThresholdToPix() const; |
| |
| // Return true if the source image is color. |
| bool IsColor() const { |
| return image_bytespp_ >= 3; |
| } |
| |
| // Threshold the source image as efficiently as possible to the output |
| // tesseract IMAGE class. |
| virtual void ThresholdToIMAGE(IMAGE* image); |
| |
| #ifdef HAVE_LIBLEPT |
| // Pix vs raw, which to use? |
| // Implementations should provide the ability to source and target Pix |
| // where possible. A future version of Tesseract may choose to use Pix |
| // as its internal representation and discard IMAGE altogether. |
| // Because of that, an implementation that sources and targets Pix may end up |
| // with less copies than an implementation that does not. |
| // NOTE: Opposite to SetImage for raw images, SetImage for Pix clones its |
| // input, so the source pix may be pixDestroyed immediately after. |
| void SetImage(const Pix* pix); |
| |
| // 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. |
| virtual void ThresholdToPix(Pix** pix); |
| |
| // 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. |
| Pix* GetPixRect(); |
| #endif |
| |
| protected: |
| // ---------------------------------------------------------------------- |
| // Utility functions that may be useful components for other thresholders. |
| |
| // Common initialization shared between SetImage methods. |
| virtual void Init(); |
| |
| // Return true if we are processing the full image. |
| bool IsFullImage() const { |
| return rect_left_ == 0 && rect_top_ == 0 && |
| rect_width_ == image_width_ && rect_height_ == image_height_; |
| } |
| |
| // Otsu threshold the rectangle, taking everything except the image buffer |
| // pointer from the class, to the output IMAGE. |
| void OtsuThresholdRectToIMAGE(const unsigned char* imagedata, |
| int bytes_per_pixel, int bytes_per_line, |
| IMAGE* image) const; |
| |
| // Threshold the rectangle, taking everything except the image buffer pointer |
| // from the class, using thresholds/hi_values to the output IMAGE. |
| void ThresholdRectToIMAGE(const unsigned char* imagedata, |
| int bytes_per_pixel, int bytes_per_line, |
| const int* thresholds, const int* hi_values, |
| IMAGE* image) const; |
| |
| // Cut out the requested rectangle of the source raw binary image to the |
| // output IMAGE. |
| void CopyBinaryRectRawToIMAGE(IMAGE* image) const; |
| |
| #ifdef HAVE_LIBLEPT |
| // Otsu threshold the rectangle, taking everything except the image buffer |
| // pointer from the class, to the output Pix. |
| void OtsuThresholdRectToPix(const unsigned char* imagedata, |
| int bytes_per_pixel, int bytes_per_line, |
| Pix** pix) const; |
| |
| // Threshold the rectangle, taking everything except the image buffer pointer |
| // from the class, using thresholds/hi_values to the output IMAGE. |
| void ThresholdRectToPix(const unsigned char* imagedata, |
| int bytes_per_pixel, int bytes_per_line, |
| const int* thresholds, const int* hi_values, |
| Pix** pix) const; |
| |
| // Copy the raw image rectangle, taking all data from the class, to the Pix. |
| void RawRectToPix(Pix** pix) const; |
| |
| // Cut out the requested rectangle of the binary image to the output IMAGE. |
| void CopyBinaryRectPixToIMAGE(IMAGE* image) const; |
| #endif |
| |
| protected: |
| #ifdef HAVE_LIBLEPT |
| // Clone or other copy of the source Pix. |
| // The pix will always be PixDestroy()ed on destruction of the class. |
| Pix* pix_; |
| #endif |
| // Exactly one of pix_ and image_data_ is not NULL. |
| const unsigned char* image_data_; // Raw source image. |
| |
| int image_width_; // Width of source image/pix. |
| int image_height_; // Height of source image/pix. |
| int image_bytespp_; // Bytes per pixel of source image/pix. |
| int image_bytespl_; // Bytes per line of source image/pix. |
| // Limits of image rectangle to be processed. |
| int rect_left_; |
| int rect_top_; |
| int rect_width_; |
| int rect_height_; |
| }; |
| |
| } // namespace tesseract. |
| |
| #endif // TESSERACT_CCMAIN_THRESHOLDER_H__ |
| |