Как определить процент «площади изображения» внутри изображения? - PullRequest
2 голосов
/ 12 марта 2010

Мхх, довольно трудно объяснить моим плохим английским;)

Итак, допустим, у меня есть изображение, не имеет значения, какого типа (gif, jpg, png) с размером 200x200 пикселей (общая площадь 40000 пикселей)

Это изображение имеет фон, который может быть прозрачным, или любой цвет (но я заранее знаю цвет фона).

Допустим, что в середине этого изображения находится картинка (для примера оставим простой, предположим, нарисован квадрат), размером 100x100 пикселей (общая площадь 10000 пикселей).

Мне нужно знать процент площади, заполненной маленьким квадратом внутри изображения.

Итак, я знаю полный размер изображения и цвет фона, в php / python есть способ сканировать изображение и извлекать его (вкратце, считая пиксели, которые отличаются от заданного фона)? 1011 *

В приведенном выше примере результат должен быть 25%

РЕДАКТИРОВАТЬ : это два изображения в качестве примера (позолоченные в пути;):

alt text

alt text

Мне нужно знать процентное содержание зеленого перца во всем изображении (то есть 400x400)

Ответы [ 4 ]

4 голосов
/ 12 марта 2010
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 голосов
/ 12 марта 2010

Это немного зависит от ваших требований к точности и от наличия цвета фона на изображении. Рассмотрим этот надоедливый тестовый пример:

  • Сделайте 400 пт большой "G".
  • Сделать текст белым. Нажмите «Тень» или «Контур», чтобы оно было окружено черным.
  • Поместите его на белый фон.

Выберите ваше усилие:

  • Вы можете получить ограничивающую рамку, которая сильно переоценивает размер «G», потому что большого пустого пространства внутри.
  • Вы можете сосчитать белые пиксели, которые сильно недооценивают размер 'G' из-за множества белых пикселей внутри контура.
  • Вы можете выбрать цвет не на изображении, например синий, и запустить алгоритм рекурсивного рисования из верхнего левого угла. Тогда вы можете точно посчитать синие пиксели.
  • Существуют более быстрые методы, более сложные.

Обычно вы можете использовать PIL (Python Imaging Library) http://www.pythonware.com/products/pil/ для доступа к необработанным данным изображения из форматов файлов.

0 голосов
/ 12 марта 2010

Используя Python и PIL (Python Imaging Library), вы можете попробовать следующее (не проверено - кредит переходит к исходному потоку здесь):

 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 (до и после обрезки).

0 голосов
/ 12 марта 2010

Я предполагаю, что окружающая область имеет только один цвет, и объект на изображении может иметь любую форму (поэтому сначала вам нужно узнать его координаты, верно?)

Если вы можете использовать ImageMagick, это легко.

  1. Размер магазина изображения (40000 пикселей)

  2. Отправьте изображение в ImageMagick и обрежьте окружающую область, используя -trim (описание здесь )

  3. Сравните размер полученного изображения (10000 пикселей) с размером исходного изображения

Если вы не можете использовать ImageMagick, вам придется использовать GD, чтобы обрезать окрестности. Грубое описание есть в ответе на этот вопрос . Я почти уверен, что это уже реализовано в PHP.

...