PIL (python imaging library) or Mathematics help both appreciated
well, here is the background. I have images of objects (cars, clothes, ...) with a white background in most of the cases I have to build a function with PIL that takes away the background. it seems simple, just look for the white and make it transparent but the problem is in reality much more complex: 1) the image could contain some white inside the object (e.g. shoes with some white in between straps) 2) there are often pixels that are part of the background but have a colour different from white which leaves a few points throughout the image to be more concrete: here is a bit of code of what i've made so far def transparent(im): #i take all the images of the pixel pixels = list(im.getdata()) #i convert the image into png if im.mode != 'RGBA': im = im.convert('RGBA') #i create a new image with the same dimension with one unique layer for transparency width , height = im.size gradient = Image.new('L', (width,height)) white = { 'r' : 255 , 'g' : 255, 'b' : 255 } #i browse the pixels of the image for y in range(height): yp = y * width for x in range(width): xy = yp + x pix = pixels[xy] #the color of the current pixel c = { 'r' : pix[0] , 'g' : pix[1], 'b' : pix[2] } #i calculate the vectorial distance between the current color and the color white d = sqrt( pow((c['r']- white['r'] ),2) + pow((c['g'] - white['g']), 2) + pow((c['b'] - white['b']),2) ) if d 5 : #if it is more or less white, i make the pixel transparent gradient.putpixel((x,y) , 0 ) else: #otherwise i show the color gradient.putpixel((x,y) , 255) after the layer of transparency of the new image is done, the algorithm works generally fine except there are some small but noticeable quality issues. i am just asking myself if there is maybe not a better approach either in terms of algorithms or even mathematics or maybe refine the algorithm that i've create. anything would help. i know the function will not be 100% precise but I just hope the image can be presentable and that the image is homogenous. thank you in advance for your help. -- http://mail.python.org/mailman/listinfo/python-list
Re: PIL (python imaging library) or Mathematics help both appreciated
Well not much maths in my answers but... On 24 Nov, 08:52, amine [EMAIL PROTECTED] wrote: well, here is the background. I have images of objects (cars, clothes, ...) with a white background in most of the cases I have to build a function with PIL that takes away the background. it seems simple, just look for the white and make it transparent but the problem is in reality much more complex: 1) the image could contain some white inside the object (e.g. shoes with some white in between straps) A simple solution would be to start with a transparent pixel in the top left corner say, then scan the image from left to right (line by line): if the current pixel is white (or pale enough) and has a transparent pixel above it or to its left, then make it transparent. I remember when I was a kid playing graphical adventure games on my C64, you could actually see this happening as the picture was being built on the screen (as a floppy could only contain around 160k, you couldn't store bitmaps unless you had very few pictures). 2) there are often pixels that are part of the background but have a colour different from white which leaves a few points throughout the image What you're doing is fine I think: calculate the distance to white. HTH -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list
Re: PIL (python imaging library) or Mathematics help both appreciated
On Mon, 24 Nov 2008 00:52:02 -0800 (PST), amine [EMAIL PROTECTED] wrote: well, here is the background. I have images of objects (cars, clothes, ...) with a white background in most of the cases I have to build a function with PIL that takes away the background. it seems simple, just look for the white and make it transparent but the problem is in reality much more complex: 1) the image could contain some white inside the object (e.g. shoes with some white in between straps) 2) there are often pixels that are part of the background but have a colour different from white which leaves a few points throughout the image to be more concrete: here is a bit of code of what i've made so far ... after the layer of transparency of the new image is done, the algorithm works generally fine except there are some small but noticeable quality issues. i am just asking myself if there is maybe not a better approach either in terms of algorithms or even mathematics or maybe refine the algorithm that i've create. anything would help. i know the function will not be 100% precise but I just hope the image can be presentable and that the image is homogenous. How about calling on the Gimp? I haven't done it, but I seem to recall it has a Python interface. Hopefully that means you can use its algorithms from a standalone Python program, with no GUI. I guess in the Gimp you'd use a fuzzy select a continuous region around this pixel with approximately this color algorithm. Then you'd use another one which replaces the whiteness with transparency. /Jorgen -- // Jorgen Grahn grahn@Ph'nglui mglw'nafh Cthulhu \X/ snipabacken.se R'lyeh wgah'nagl fhtagn! -- http://mail.python.org/mailman/listinfo/python-list