Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>the entropy solution seems problematic and overly intensive computationally. Why not edge detect?</p> <p>I just wrote this python code to solve this same problem for myself. My background was dirty white-ish, so the criteria that I used was darkness and color. I simplified this criteria by just taking the smallest of the R, B or B value for each pixel, so that black or saturated red both stood out the same. I also used the average of the however many darkest pixels for each row or column. Then I started at each edge and worked my way in till I crossed a threshold.</p> <p>Here is my code:</p> <pre><code>#these values set how sensitive the bounding box detection is threshold = 200 #the average of the darkest values must be _below_ this to count (0 is darkest, 255 is lightest) obviousness = 50 #how many of the darkest pixels to include (1 would mean a single dark pixel triggers it) from PIL import Image def find_line(vals): #implement edge detection once, use many times for i,tmp in enumerate(vals): tmp.sort() average = float(sum(tmp[:obviousness]))/len(tmp[:obviousness]) if average &lt;= threshold: return i return i #i is left over from failed threshold finding, it is the bounds def getbox(img): #get the bounding box of the interesting part of a PIL image object #this is done by getting the darekest of the R, G or B value of each pixel #and finding were the edge gest dark/colored enough #returns a tuple of (left,upper,right,lower) width, height = img.size #for making a 2d array retval = [0,0,width,height] #values will be disposed of, but this is a black image's box pixels = list(img.getdata()) vals = [] #store the value of the darkest color for pixel in pixels: vals.append(min(pixel)) #the darkest of the R,G or B values #make 2d array vals = np.array([vals[i * width:(i + 1) * width] for i in xrange(height)]) #start with upper bounds forupper = vals.copy() retval[1] = find_line(forupper) #next, do lower bounds forlower = vals.copy() forlower = np.flipud(forlower) retval[3] = height - find_line(forlower) #left edge, same as before but roatate the data so left edge is top edge forleft = vals.copy() forleft = np.swapaxes(forleft,0,1) retval[0] = find_line(forleft) #and right edge is bottom edge of rotated array forright = vals.copy() forright = np.swapaxes(forright,0,1) forright = np.flipud(forright) retval[2] = width - find_line(forright) if retval[0] &gt;= retval[2] or retval[1] &gt;= retval[3]: print "error, bounding box is not legit" return None return tuple(retval) if __name__ == '__main__': image = Image.open('cat.jpg') box = getbox(image) print "result is: ",box result = image.crop(box) result.show() </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload