I have been writing a program in Magick++ that loads up several images and does processing on them. The problem is that some of the images have borders (white, black and everything in between) and those borders make the processing that I am doing useless.
I investigated the trim command, but it does not seem to be doing anything for a large number of my images - perhaps because of subtle color variations resulting from JPEG compression?
Here is an example image that I found on flickr It has a large white border:
http://farm1.static.flickr.com/39/10224 ... c01d2d.jpg
I ran it through the Magick Studio (http://studio.webbyland.com/MagickStudi ... Studio.cgi) trim command several times but the image never changed.
I noticed that the MagickWand C Library appears to have a trim command that allows for a level of color tolerance. Are there any plans to port this command into other places in ImageMagick, or is there a simple way I can simulate this command in my own code that someone knows of?
Improved Trim/Border Removal Command?
So I've found something that might work - maybe. First, I found the colorFuzz() setting in Magick++ which I had overlooked before. I don't know if trim() uses this value or not, but I am hoping it does. I couldn't find a way to set this value for trim in Magick Studio (I saw it at the bottom of the front page, but couldn't figure out how to keep it set.)
I also noticed that, in Magick Studio, I had to click the 'reset page geometry' check box on when I trimmed it. I couldn't find a similar command in the Magick++ documentation, (I found page() but that seemed functionally different.)
Many thanks to Anthony Thyssen for his page which helped me out:
http://www.cit.gu.edu.au/~anthony/graph ... crop/#trim
If anyone knows if this will work, or knows of a good replacement for repage, it would be appreciated. Thanks!
I also noticed that, in Magick Studio, I had to click the 'reset page geometry' check box on when I trimmed it. I couldn't find a similar command in the Magick++ documentation, (I found page() but that seemed functionally different.)
Many thanks to Anthony Thyssen for his page which helped me out:
http://www.cit.gu.edu.au/~anthony/graph ... crop/#trim
If anyone knows if this will work, or knows of a good replacement for repage, it would be appreciated. Thanks!
Thanks, magick.
Here's the code I've come up with so far. It's far from perfect, but it is functional for the average case:
A better, more brute force approach, might be to find a way to adjust the colorFuzz according to the standard deviation of colors in the image. I found a sepia toned image that this function ate a large portion of (it didn't actually have a border to begin with!)
Here's the code I've come up with so far. It's far from perfect, but it is functional for the average case:
Code: Select all
//function continuously trims away the edges of an image, attempting to
//remove any borders. stops when the trim() function fails to chip anything away
void remove_border(Image &img) {
int pw, ph;
double fuzz = img.colorFuzz();
img.colorFuzz(11000);
do {
pw = img.columns();
ph = img.rows();
img.trim();
} while (img.columns() != pw || img.rows() != ph);
img.page(Geometry(0, 0));
img.colorFuzz(fuzz);
}
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Improved Trim/Border Removal Command?
Look a bit further down and try to do a blured trim for 'noisy' images. That will let you trim an image but control and ignore any small scale bits in the image.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/