World: r3wp
[View] discuss view related issues
older newer | first last |
Anton 19-Apr-2008 [7639x3] | Yes, I would grade the scan line according to ratio of black : white pixels on the line. Text is probably between 20-85% black pixels, and borders could perhaps be detected at > 95% black. Anyway, if you don't need it, that's much easier :) |
I have something that's starting to work. If we can preprocess the greyscale images so that they're bitonal (black and white), and denoised, then my algorithm has a chance. | |
http://anton.wildit.net.au/rebol/gfx/auto-crop-bitmap-text.r http://anton.wildit.net.au/rebol/gfx/demo-auto-crop-bitmap-text.r | |
Graham 19-Apr-2008 [7642x2] | I'll give it a twirl |
if they're placed in an anonymous context, how did you make them public? | |
Anton 19-Apr-2008 [7644x2] | Almost all my function libraries are in anonymous contexts. Basically, DOing the library file (eg. do %auto-crop-bitmap-text.r) returns the context, and you just GET out the words you are interested in. This job is eased a bit by my INCLUDE function. |
You should be able to do this instead of use INCLUDE. auto-crop-bitmap-text: get in do %auto-crop-bitmap-text.r 'auto-crop-bitmap-text | |
Graham 19-Apr-2008 [7646] | ok |
Anton 19-Apr-2008 [7647x2] | Now you can use the auto-crop-bitmap-text function. |
It's really very simple. I've just got this include function which kind of hides the simplicity a bit (unfortunately). I wish something like that was built in to rebol. | |
Graham 19-Apr-2008 [7649] | ok, found some images that don't work. |
Anton 19-Apr-2008 [7650] | cool, ... why not ? |
Graham 19-Apr-2008 [7651] | I'll run them again ... |
Anton 19-Apr-2008 [7652] | (note, the cropping is only off the top and bottom edges, ie. vertically cropped only.) |
Graham 19-Apr-2008 [7653] | what does it do if the image is all white space? |
Anton 19-Apr-2008 [7654] | good question. let me check... |
Graham 19-Apr-2008 [7655] | what happens if you include two words above and below in the image? |
Anton 19-Apr-2008 [7656x2] | All white does not do any cropping. It didn't find any "content" (non-white pixels) to crop to. What do you want it to do ? |
If there's two words above and below in the image, like this: line one line two middle line four line five then the 3 middle lines will be included, unless there is some white above the top line or some white below the bottom line (in which cases they will be included, respectively). | |
Graham 19-Apr-2008 [7658] | Hmm.... return none? |
Anton 19-Apr-2008 [7659] | Let me add that to the to-do list... Is this a common case, by the way ? |
Graham 19-Apr-2008 [7660x3] | Yes |
Let me send you some images ... that it appears to have failed on. | |
Ok, sent. some don't have the whitespace cropped at the top. | |
Anton 19-Apr-2008 [7663] | Currently the algorithm scans downwards and upwards simultaneously, looking for non-white content. When it doesn't find any, it has nowhere to crop to, so no cropping happens. I can change it so that when the scans bump into each other they set that as the "content found" position, and, the scan lines being right next to each other, will result in a 0-height crop region. I will check for that case and return none instead. |
Graham 19-Apr-2008 [7664] | some don't lose some rubbish at the bottom. |
Anton 19-Apr-2008 [7665x3] | The first one show this result, indeed. Let me analyse... |
I understand the bug in my code. I did not implement the weighting quite correctly. | |
hmm.. more issues... it's complex when you want to scan from top and from bottom simultaneously. | |
Graham 19-Apr-2008 [7668] | Anton, I found that the OCR engine I am using needs a white space border, so I am padding the image back again with a little white space. |
Anton 19-Apr-2008 [7669] | That would help my algorithm. Text which is right up against the edge is likely to be classified as 'junk'. When there is text at the top edge and text at the bottom edge only, then we have two possibly 'content' texts. But which one is the content and which is the junk ? The algorithm is forced to either make a choice (which it could do by choosing the larger one), or not choose at all (which is what currently happens), so including both as the 'content'. If you put just one line of white outside the text you consider 'content' then it will be surrounded by white and the algorithm will select it as 'content'. |
Graham 19-Apr-2008 [7670] | I would always select the larger ... |
Anton 20-Apr-2008 [7671x2] | Rewritten algorithm (selects the larger now). load-thru/update these two: http://anton.wildit.net.au/rebol/gfx/auto-crop-bitmap-text.r http://anton.wildit.net.au/rebol/gfx/demo-auto-crop-bitmap-text.r And download this new test script: http://anton.wildit.net.au/rebol/gfx/test-auto-crop-bitmap-text.r |
You can fiddle with the last script to make it load your 6 test files (which all yield correct looking results). | |
Graham 20-Apr-2008 [7673x2] | Cool. |
if the region is blank, your scan routine returns none, and then the crop errors. | |
Anton 20-Apr-2008 [7675] | Oops, forgot the simplest input. |
Anton 21-Apr-2008 [7676x2] | I've fixed that oversight. Update these files: auto-crop-bitmap-text.r test-auto-crop-bitmap-text.r |
The above update also cleans up loose words in the auto-crop-bitmap-text.r file. | |
Graham 21-Apr-2008 [7678x2] | I added a /pad option to mine so that it returns the text with a white space border. |
which is needed for some ocr engines | |
Anton 21-Apr-2008 [7680x5] | /border makes more sense, doesn't it ? |
maybe not... | |
updated auto-crop-bitmap-text.r removed old code and comments (file is 3.5k smaller) | |
updated again auto-crop-bitmap-text.r replaced old comments with new ones. | |
Hmm.. I think the image padding might be outside the responsibility of an auto-crop function. Its job is to remove stuff, not add. It's probably better to write a small generalised function to do the padding (which could be useful elsewhere) and just feed the result of the auto-crop to it. | |
Graham 21-Apr-2008 [7685x2] | you're probably right |
though it could be auto-crop to as it were. | |
Anton 21-Apr-2008 [7687] | I think if you're going to make an "all-in-one" function, then its name should reflect that. eg. crop-and-pad-ready-for-ocr: func [image][ pad-image auto-crop-bitmap-text image 1x1 ] (where pad-image is adding a 1x1 white border around the cropped image.) |
Graham 21-Apr-2008 [7688] | auto-crop-bitmap-text: func ["Returns a cropped image, or none if the input image was blank" image [image!] /local region ][ if region: find-bitmap-text-crop-region image [ copy/part skip image region/1 region/2 ; return a cropped image ] ] Looking at this, it appears to return unset! if region is none! |
older newer | first last |