【问题标题】:How to detect an 'image area' percentage inside an image?如何检测图像内的“图像区域”百分比?
【发布时间】:2011-01-26 14:24:39
【问题描述】:

嗯,用我蹩脚的英语有点难以解释;)

所以,假设我有一张图片,不管是 200x200 像素大小(总面积 40000 像素)的(gif、jpg、png)类型

这张图片有背景,可以是透明的,也可以是各种颜色(但我事先知道背景颜色)。

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

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

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

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

编辑:这是两张图片作为示例(顺便说一句;):

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

【问题讨论】:

  • 周边只有一种颜色吧?
  • 是的,周围区域(背景)只是一种颜色或透明的。

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


【解决方案1】:
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

【讨论】:

  • 哇,这正是我需要的,它对背景 (0,0) 进行采样,然后将每个像素与它进行比较。太好了。
  • 太棒了!这帮助我开发了一个 10-liner,用于从巨大的图像集合中整理出几乎所有的图表,因为其中许多都有白色背景!太好了!
【解决方案2】:

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

如果您可以使用 ImageMagick,那就很容易了。

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

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

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

如果您不能使用 ImageMagick,则必须使用 GD 裁剪掉周围区域。粗略的描述在this question 的回答中。不过,我很确定这已经在 PHP 中实现了。

【讨论】:

  • @DaNieL 啊,我明白了。那不一样。修剪图像绝对是您需要采取的步骤。唔。 可以使用 ImageMagick 吗?
  • 当然,我正在运行我自己的服务器,所以我可以安装所有东西;但更简单和“无依赖”的方式将是首选;)
  • @Daniel 如果辣椒中间有一个带有背景颜色的洞,那是 25% 的一部分还是周围 75% 的一部分?
  • 这个洞会成为背景的一部分!
【解决方案3】:

使用 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(修剪前后)进行计算。

【讨论】:

    【解决方案4】:

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

    • 制作一个 400 pt 大的“G”。
    • 将文本设为白色。点击“阴影”或“轮廓”,使其被黑色包围。
    • 将其放在白色背景上。

    选择你的努力:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2011-10-19
      相关资源
      最近更新 更多