Nasıl bir görüntü içinde bir 'görüntü alanı' yüzdesini tespit etmek için?

4 Cevap php

Mhh, biraz zor benim kötü İngilizce ;) ile açıklamak

Yani, ben bir görüntü var diyelim, 200x200 piksel boyutunda (gif, jpg, png) ne tür (toplam alanı 40000 piksel) farketmez

Bu görüntü Trasparent edilebilir bir arka plan, ya da her renk var (ama önceden background-color biliyorum).

100x100 piksel (toplam alanı 10000 piksel), (varsayalım çizilmiş bir kare sağlayan basit örnek tutmak için) bu görüntünün ortasında, bir resim olduğunu söylemek sağlar.

Ben küçük kare görüntünün içinde doldurmak alan yüzdesini bilmek gerekir.

I tam görüntü boyutu ve arka plan rengini bilmek Yani, görüntüyü taramak ve bu almak için php / python bir yol (Verilen kökenli farklı piksel sayma, kısa) var mı?

Yukarıdaki örnekte, sonuç% 25 olmalıdır

EDIT: Bu (;) arada oin gipe örnek olarak iki resim vardır:

alt text

alt text

Ben bütün görüntüdeki yeşil biber yüzdesini (yani 400x400 olduğunu) bilmek gerekir

4 Cevap

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

Her iki görüntüde için 7.361875 verir

Ben Çevredeki görüntüdeki bir renk ve nesne tek sahip varsayarak yaşıyorum herhangi bir şekle sahip (yani sağ, önce onun koordinatlarını bulmak gerekir?) Olabilir

Eğer ImageMagick kullanabilirsiniz varsa, o kolay.

  1. Görüntünün mağaza boyutu (40000 piksel)

  2. Imagemagick için görüntü göndermek ve -trim (açıklamasına here ) kullanarak çevredeki Döşeme

  3. Orijinal görüntü ile (10000 Piksel) elde edilen görüntünün boyutunu karşılaştırın

Eğer ImageMagick kullanamıyorsanız, uzak çevredeki kırpmak için GD kullanmak zorunda olacak. Bir kaba açıklama this question için cevap olduğunu. Ben bu olsa, zaten PHP uygulanmakta olan eminim.

Eğer aşağıdaki deneyebilirsiniz Python ve PIL (Python Imaging Library) kullanılarak (denenmemiş - kredi original thread buraya gider):

 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")

Ve sonra hesaplamalar dayalı iş yapmak width * height (öncesi ve Döşeme sonra).

Bu doğruluk gereksinimleri ve görüntüde arka plan renginin varlığı üzerinde biraz bağlıdır. Bu can sıkıcı testi davayı düşünün:

  • 400 pt büyük "G" yapın.
  • Metin beyaz olun. Siyah çevrili bu yüzden "Gölge" veya "Anahat" Hit.
  • Beyaz zemin üzerine koyun.

Çaba almak:

  • You can get a bounding box, which heavily overestimates the size of the 'G' because of the large blank space inside.
  • Eğer ağır çünkü anahat içinde birçok beyaz piksellerin 'G' boyutunu hafife beyaz pikselleri sayabilirsiniz.
  • Mavi gibi değil, görüntüdeki bir renk seçin ve sol üst köşesinden bir özyinelemeli ressamın algoritması çalıştırabilirsiniz. Sonra doğru mavi pikselleri sayabilirsiniz.
  • Daha karmaşık daha hızlı yöntemler vardır.

Genellikle http://www.pythonware.com/products/pil/ dosya formatları ham görüntü verilerine erişmek için PIL (Python Imaging Library) kullanabilirsiniz.