如何检测图像中的“图像区域”百分比?

时间:2010-03-11 21:41:30

标签: php python web-applications image-processing image-manipulation

是的,有点难以用我糟糕的英语解释;)

所以,让我说我有一个图像,无论什么样的(gif,jpg,png)200x200像素大小(总面积40000像素)

此图像具有背景,可以是透明的,或每种颜色(但我事先知道背景颜色)。

让我们说在这张图片的中间,有一张图片(为了保持示例简单,假设是一个正方形),100x100像素(总面积10000像素)。

我需要知道图像内部填充小方块的面积百分比。

所以,我知道完整的图像大小和背景颜色,在php / python中有一种方法可以扫描图像并检索它(简而言之,计算与给定背景不同的像素)? / p>

在上面的例子中,结果应为25%

编辑:这是两个图片为例(gimped oin the way;):

alt text http://www.freeimagehosting.net/uploads/5ea3aed4e3.png

alt text http://www.freeimagehosting.net/uploads/73a72bd6aa.png

我需要知道整个图像中青椒的百分比(即400x400)

4 个答案:

答案 0 :(得分:4)

from PIL import Image
image = Image.open("pepper.png")
bg = image.getpixel((0,0))
width, height = image.size
bg_count = next(n for n,c in image.getcolors(width*height) if c==bg)
img_count = width*height - bg_count
img_percent = img_count*100.0/width/height

为两个图像提供7.361875

答案 1 :(得分:0)

我假设周围区域只有一种颜色,图像中的物体可以有任何形状(所以你需要先查找它的坐标,对吗?)

如果你可以使用ImageMagick,那很简单。

  1. 图像的存储大小(40000像素)

  2. 使用-trim将图像发送到ImageMagick并修剪周围区域(说明here

  3. 将生成的图像(10000像素)的大小与原始图像的大小进行比较

  4. 如果您无法使用ImageMagick,则必须使用GD来裁剪周围区域。 this question的答案中有一个粗略的描述。我很确定这已经在PHP中实现了。

答案 2 :(得分:0)

使用Python和PIL(Python Imaging Library),您可以尝试以下方法(未经测试 - 此处的信用额转到original thread):

 from PIL import ImageChops

 def trim(im, border):
     bg = Image.new(im.mode, im.size, border)
     diff = ImageChops.difference(im, bg)
     bbox = diff.getbbox()
     if bbox:
         return im.crop(bbox)
     else:
         # found no content
         raise ValueError("cannot trim; image was empty")

然后根据width * height(修剪前后)进行计算。

答案 3 :(得分:0)

这取决于您的准确度要求以及图像中是否存在背景颜色。考虑这个烦人的测试用例:

  • 制作一个400磅大的“G”。
  • 将文字设为白色。点击“Shadow”或“Outline”使其被黑色包围。
  • 把它放在白色背景上。

选择你的努力:

  • 你可以得到一个边界框,它大大高估了'G'的大小,因为 里面的空白空间很大。
  • 您可以计算白色像素,由于轮廓内有许多白色像素,因此严重低估了“G”的大小。
  • 您可以选择不在图像中的颜色,如蓝色,并从左上角运行递归画家的算法。然后,您可以准确计算蓝色像素。
  • 有更快的方法,更复杂。

您通常可以使用PIL(Python Imaging Library)http://www.pythonware.com/products/pil/从文件格式访问原始图像数据。