2

MHH,有點難以用我的英語不好解釋;)如何檢測圖像內的「圖像區域」百分比?

因此,可以說,我有一個形象,不事關什麼樣的(GIF,JPG,PNG)具有200×200像素大小(總面積爲40000個像素)

此圖像有背景,可以是透明的,或每種顏色(但我事先知道背景顏色)。

可以說,在這張圖片的中間,有一張100x100像素(總面積10000像素)的圖片(用於保持簡單的例子,假設是一個正方形繪製)。

我需要知道圖像內小方塊填充的面積百分比。因此,在我知道完整的圖像大小和背景顏色,有一種方式在PHP/python掃描圖像和檢索(總之,計算與給定的背景不同的像素)?

在上面的例子中,結果應該是25%

EDIT:這兩個圖像作爲示例(不論是否供OIN的方式):

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

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

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

+0

周邊地區只有一種顏色,對吧? – 2010-03-11 21:44:20

+0

是的,sorrounding區域(背景)只是一種顏色或transsparent。 – Strae 2010-03-11 21:49:25

回答

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這兩個圖像

+0

哇,這正是我需要的,它需要一個背景樣本(0,0),然後比較每個像素。大。 – Strae 2010-03-12 08:35:15

+0

太棒了!,這幫助我開發了一個10行內容,用於從大量圖像集合中挑選出大部分圖形,因爲它們中的很多都具有白色背景!大! – math 2010-08-24 15:08:00

0

我假設周圍區域只有一種顏色,並且圖像中的物體可以具有任何形狀(所以您需要先找出其座標,對吧?)

如果您可以使用ImageMagick,那很容易。圖像的

  1. 存儲大小(40000個像素)

  2. 發送圖像到ImageMagick的和修剪使用-trim(介紹here

  3. 比較得到的圖像(10000個像素)的大小與周圍的區域那些原始圖像

如果你不能使用ImageMagick,你將不得不使用GD將周邊地區剪除。粗略描述在this question的答案中。不過,我很確定這已經在PHP中實現了。

+0

更新我的答案 - 圖像將不會是一個廣場.. – Strae 2010-03-11 22:02:51

+0

@DaNieL啊,我明白了。那不一樣。修剪圖像絕對是您需要採取的步驟。嗯。 *你可以使用ImageMagick嗎? – 2010-03-11 22:05:02

+0

當然,即時通訊運行我自己的服務器,所以我可以安裝所有東西;但更簡單和「無依賴」的方式將是首選;) – Strae 2010-03-11 22:08:26

0

使用Python和PIL(Python圖像庫),你可以嘗試以下方法(未經測試 - 幸得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(前後修整後您的計算)。

+0

問題更新與圖像示例 – Strae 2010-03-11 22:07:04

0

這取決於您的精度要求和圖像中背景顏色的存在。考慮這個令人討厭的測試案例:

  • 做一個400磅的大「G」。
  • 使文本變白。點擊「陰影」或「輪廓」,使其被黑色包圍。
  • 把它放在白色背景上。

挑選你的努力:

  • 你可以得到一個邊框,這在很大程度上高估了「G」的大小,因爲裏面的大片空白的 。
  • 您可以計算白色像素,由於輪廓內有許多白色像素,因此會嚴重低估'G'的大小。
  • 您可以選擇不在圖像中的顏色,如藍色,然後從左上角運行遞歸繪畫師的算法。然後,您可以準確計算藍色像素。
  • 有更快的方法,這是更復雜的。

您通常可以使用PIL(Python Imaging Library)http://www.pythonware.com/products/pil/從文件格式訪問原始圖像數據。