<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
Thank you very much for your feedback, John. It works wonders!!!<br><br>Would you please make comments on what I could do to improve the code below?<br><br>im = Image.open("C:\Scan_119.jpg")<br>pixels = im.load()<br>width, height = im.size<br><br>def distance (a, b):<br>&nbsp;&nbsp;&nbsp; return ((a[0]- b[0])** 2 + (a[1]- b[1])** 2 + (a[-1]- b[-1]) ** 2) ** 0.5<br><br>blue = (205, 241, 255) # a value I am presuming would be the average blue in the image<br><br>for x in range(width):<br>&nbsp;&nbsp;&nbsp; for y in range(height):<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if distance(pixels[x, y], blue) &lt; 50:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pixels[x, y] = (255, 255, 255)<br><br>I guess I got the main idea, but please tell me if there is anything I could do to improve it. Also, I don't think I followed your advice on "processing at the image level rather than by looping over pixels" Would you correct it for me?<br><br>By the way, thanks to your explanation of the color cube approach, I was able to come up with this other script:<br><br>im = Image.open("C:\Scan_119.jpg")<br>pixels = im.load()<br>width, height = im.size<br>for x in range(width):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for y in range(height):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pixels[x, y][0] &lt;= 210: # Red above 210 tended not to create blue<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Green could be ignored in this case, i guess<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if pixels[x, y][-1] &gt;= 170: # Blue under 170 seemed to be around the image's blue<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixels[x, y] = (255, 255, 255)<br><br>which affected what I would call purple a bit, but it was quite precise otherwise. Well, I guess it just needs some adjusting. I came up with R210 and B170 after looking at a color cube I adapted. <br><br>What method you suggest I should stick to - in other words, which one seems to bring more accuracy?<br><br>Also, If not RGB, which color space would be the best?<br><br><br>&gt; From: jcupitt@gmail.com<br>&gt; Date: Mon, 27 Apr 2009 11:56:00 +0100<br>&gt; Subject: Re: [Image-SIG] Removing specific range of colors from scanned image<br>&gt; To: eismb@hotmail.com<br>&gt; CC: image-sig@python.org<br>&gt; <br>&gt; 2009/4/25 Eduardo Ismael &lt;eismb@hotmail.com&gt;:<br>&gt; &gt; I scanned a color page from a book and I would like to remove specific<br>&gt; &gt; colors from it.<br>&gt; <br>&gt; The best solution is to calculate a colour difference metric. This is<br>&gt; rather like the 'magic wand' in most paint programs.<br>&gt; <br>&gt; RGB isn't the best colour space for this, but it would sort-of work.<br>&gt; The idea is: imagine that your three colour values are coordinates in<br>&gt; a cube. You want to find pixels whose value is close to the position<br>&gt; of a point in the blue corner of this cube, in other words, something<br>&gt; like:<br>&gt; <br>&gt;    for pixel in image:<br>&gt;      if distance (image[pixel], blue) &lt; 10:<br>&gt;        image[pixel] = white<br>&gt; <br>&gt; The simplest distance function is just pythagoras, ie.<br>&gt; <br>&gt;   def distance (a, b):<br>&gt;     vector = a - b<br>&gt;     return (vector.red ** 2 + vector.green ** 2 + vector.blue ** 2) ** 0.5<br>&gt; <br>&gt; You can do this efficiently by processing at the image level rather<br>&gt; than by looping over pixels (always incredibly slow). So: calculate an<br>&gt; image where each pixel is the distance function for that point, then<br>&gt; threshold and use that mask to set sections of your original image to<br>&gt; white.<br>&gt; <br>&gt; John<br><br /><hr />Quer saber qual produto Windows Live combina melhor com o seu perfil? <a href='http://www.windowslive.com.br' target='_new'>Clique aqui e descubra!</a></body>
</html>