LINEREMOVE
typedef struct tagLINEREMOVE
{
L_UINT uStructSize;
L_UINT32 uFlags;
L_INT32 iMinLineLength;
L_INT32 iMaxLineWidth;
L_INT32 iWall;
L_INT32 iMaxWallPercent;
L_INT32 iGapLength;
L_INT32 iVariance;
L_UINT32 uRemoveFlags;
HRGN hRgn;
pBITMAPHANDLE pBitmapRegion;
L_UINT uBitmapStructSize;
} LINEREMOVE, L_FAR *LPLINEREMOVE;
The LINEREMOVE structure provides line removal information for the L_LineRemoveBitmap function.
Member |
Description |
|
uStructSize |
Size of this structure in bytes, for versioning. Use the sizeof() macro to calculate this value. |
|
uFlags |
Flags that determine the behavior of the line removal process. Flags may be combined using a bitwise OR (|). Possible values are: |
|
|
Value |
Meaning |
|
LINE_SINGLE_REGION |
For each line found by L_LineRemoveBitmap, if the LINEREMOVECALLBACK function returns SUCCESS_REMOVE, the removed line is added to an internal single region. If the callback returns SUCCESS_NOREMOVE, the line is not added to the single region. When L_LineRemoveBitmap returns, either pBitmapRegion or hRgn will reference a region that contains all the removed lines. If LINE_LEAD_REGION is also set, pBitmapRegion will be updated with a shallow copy of pBitmap that has a LEAD region that contains all the removed lines. If LINE_LEAD_REGION is not set, hRgn is updated with a Windows region that contains all the removed lines. When the region (either LEAD or Windows) is no longer needed, it must be destroyed (either pBitmapRegion->pRgnInfo or hRgn). |
|
LINE_LEAD_REGION |
When L_LineRemoveBitmap returns, pBitmapRegion is updated with a shallow copy of pBitmap that also contains a region with all the removed lines. This flag must be used in conjunction with LINE_SINGLE_REGION. To use this flag declare a variable of type BITMAPHANDLE and point pBitmapRegion to this variable. Then set uFlags to LINE_SINGLE_REGION | LINE_LEAD_REGION. This variable will be updated when L_LineRemoveBitmap returns. |
|
LINE_IMAGE_UNCHANGED |
The original image is unchanged. |
|
LINE_USE_DPI |
The unit of measure for all fields of the LINEREMOVE structure is thousandths of an inch. Use the images DPI to convert to pixels. This allows the processing of many images with different DPI. If this flag is not set, the unit of measure for all fields of the LINEREMOVE structure is pixels. |
|
LINE_CALLBACK_REGION |
LINEREMOVECALLBACK receives a Windows region that contains the current line to be removed. Setting this flag lets the user create his or her own composite of removed lines by combining the regions received by the callback function, if the callback function returns SUCCESS_REMOVE. The regions can be combined using a logical OR operator. Combining all regions received when the callback function returns SUCCESS_REMOVE results in a region identical to the region created when LINE_SINGLE_REGION is set in uFlags. For an example, refer to L_LineRemoveBitmap. When the region received by the callback function is no longer needed, it must be destroyed using DeleteObject(). |
|
LINE_REMOVE_ENTIRE |
Remove the entire line, even if the line passes through a character or a wall. |
|
|
Consider the line below. |
|
|
|
|
|
Setting iMaxWallPercent as 80 and passing LINE_REMOVE_ENTIRE will remove the red pixels as shown below. |
|
|
|
|
LINE_USE_GAP |
Consider "gaps" in lines when performing line removal. If this flag is passed, the iGapLength field of the LINEREMOVE structure is used. If this flag is not passed, the iGapLength field is ignored. |
|
LINE_USE_VARIANCE |
Consider line variance when performing line removal. If this flag is passed, the iVariance field of the structure is used. If this flag is not passed, the iVariance field of the structure is ignored. |
iMinLineLength |
Minimum length of a line considered for removal. Lines less than this length are not removed. If LINE_USE_DPI is set in uFlags, units are in thousandths of an inch, otherwise units are in pixels. |
|
iMaxLineWidth |
Maximum average width of a line that is considered for removal. Lines that are greater in average width are not removed. If LINE_USE_DPI is set in uFlags, units are in thousandths of an inch, otherwise units are in pixels. |
|
iWall |
Height of a wall. Walls are slices of a line that are too wide to be considered part of the line. Examples of walls include a character that a line passes through or a perpendicular line. If the image contains lines that pass through characters, set iWall to be equal to or a little larger than iMaxLineWidth. If LINE_USE_DPI is set in uFlags, units are in thousandths of an inch, otherwise units are in pixels. |
|
iMaxWallPercent |
The maximum number of wall slices (expressed as a percent of the total length of the line) that are allowed. A line consists of wall slices and non-wall slices (see description of iWall). This field specifies that maximum number of wall slices (expressed as a percent of the total length of the line) that are allowed. Lines that have a wall percent that is larger than iMaxWallPercent will not be removed. For example, consider the line below that is 10 pixels in length, and 1 pixel in height in some places, and five pixels in height in other places. |
|
|
||
|
Setting iMinLineLength to 10 pixels and iWall to four pixels will identify the line below as a candidate for removal. Note that the wall percent for this line is 60% (because six of ten line slices are walls). If iMaxWallPercent is 80 then the line will be removed (actually, the pixels marked as red will be removed). If iMaxWallPercent is 30, then the line will not be removed. |
|
|
||
iGapLength |
Maximum length of a break or a hole in a line. This can be used to remove dotted lines, dashed lines, or lines that have breaks due to scanning. If LINE_USE_DPI is set in uFlags, units are in thousandths of an inch, otherwise units are in pixels. This member is valid only if LINE_USE_GAP is set in uFlags. |
|
iVariance |
Amount of width change that is tolerated between adjacent line slices. If LINE_USE_DPI is set in uFlags, units are in thousandths of an inch, otherwise units are in pixels. This member is valid only if LINE_USE_VARIANCE is set in uFlags. For example, the following horizontal line is 30 pixels in length (X represents a pixel) |
|
XXXXXXXXXX |
|
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
|
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
|
XXXXXXXXXX |
|
XXXXXXXXXX |
|
If iVariance is 2 pixels (i.e. tolerate width changes of 2 pixels or less), the first 10 columns and the last 10 columns of the line will be removed. The middle 10 columns will be unchanged. This helps preserve characters that intersect a line that is being removed. |
|
uRemoveFlags |
Flag that indicates which lines to remove. Possible values are: |
|
|
Value |
Meaning |
|
LINEREMOVE_HORIZONTAL |
remove horizontal lines |
|
LINEREMOVE_VERTICAL |
remove vertical lines |
pBitmapRegion |
Pointer to a variable of type BITMAPHANDLE. If LINE_SINGLE_REGION | LINE_LEAD_REGION have been set in uFlags, then when L_LineRemoveBitmap returns, this is updated with a shallow copy of pBitmap that also has a region that contains the removed lines. To use this, declare a variable of type BITMAPHANDLE and point pBitmapRegion to this variable. Set uFlags to (LINE_SINGLE_REGION | LINE_LEAD_REGION). It is the programmer's responsibility to free the region using L_FreeBitmapRgn() when it is no longer needed. Refer to the L_LineRemoveBitmap example to see how pBitmapRegion is used and freed. |
|
uBitmapStructSize |
Size of the structure pointed to by pBitmapRegion, for versioning. Use sizeof(BITMAPHANDLE). |
|
hRgn |
Handle to a windows region. When L_LineRemoveBitmap returns, this is updated with a single windows region corresponding to all changes, only if LINE_SINGLE_REGION has been set in uFlags and LINE_LEAD_REGION has not been set. To use this, set the flags field to (LINE_SINGLE_REGION). It is the programmer's responsibility to delete this region using the windows API DeleteObject() when the region is no longer needed. |
Comments
To "fine-tune" the performance of L_LineRemoveBitmap, try modifying the values for iWall, iGapLength and iVariance.