PIL (python imaging library) or Mathematics help both appreciated

amine surfeurX at gmail.com
Mon Nov 24 03:52:02 EST 2008


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.



More information about the Python-list mailing list