[英]Python - find out how much of an image is black
我正在下載像satellite_image這樣的衛星圖片http://home.chpc.utah.edu/~u0553130/NASA_SPoRT_VIIRS_Images/VIIRS_11um_20150104_1834_UTC.gif因為有些圖像大多是黑色的,就像這個,我不想保存它。
如何使用python檢查圖像是否超過50%黑色?
您正在使用示例圖像的外觀處理大多數灰度級的GIF,因此您可能希望大多數RGB組件相同。
使用PIL:
from PIL import Image
im = Image.open('im.gif')
pixels = im.getdata() # get the pixels as a flattened sequence
black_thresh = 50
nblack = 0
for pixel in pixels:
if pixel < black_thresh:
nblack += 1
n = len(pixels)
if (nblack / float(n)) > 0.5:
print("mostly black")
根據需要將“黑色”的閾值調整為0(投球黑)和255(亮白)。
徹底的方法是使用像PIL這樣的東西計算像素,如其他答案中給出的那樣。
但是,如果它們都是壓縮圖像,您可以檢查文件大小,因為具有大量純色區域的圖像應比具有雲層變化的圖像壓縮得多。
通過一些測試,您至少可以找到一個啟發式,其中包含大量雲的圖像,您可以立即丟棄這些圖像,而無需在像素上進行昂貴的循環。 可以逐像素地檢查接近50%的其他人。
此外,在迭代像素時,您不需要計算所有黑色像素,然后檢查至少50%是黑色。 相反,一旦您知道至少50%是黑色,就停止計數並丟棄。
第二個優化:如果你知道圖像通常是陰天而不是大多數黑色,那么走另一條路。 計算非黑色像素的數量,並在超過50%時立即停止並保留圖像。
或者如果您的像素R(或G或B)分量小於15,則檢查它是否幾乎為黑色。
利用您的測試圖像,最常見的顏色的RGB值為(1,1,1)。 這是非常黑的,但不完全是黑色。 我的回答使用了PIL庫 , webcolors以及來自這個答案的慷慨幫助代碼。
from PIL import Image
import webcolors
def closest_color(requested_color):
min_colors = {}
for key, name in webcolors.css3_hex_to_names.items():
r_c, g_c, b_c = webcolors.hex_to_rgb(key)
rd = (r_c - requested_color[0]) ** 2
gd = (g_c - requested_color[1]) ** 2
bd = (b_c - requested_color[2]) ** 2
min_colors[(rd + gd + bd)] = name
return min_colors[min(min_colors.keys())]
def get_color_name(requested_color):
try:
closest_name = actual_name = webcolors.rgb_to_name(requested_color)
except ValueError:
closest_name = closest_color(requested_color)
actual_name = None
return actual_name, closest_name
if __name__ == '__main__':
lt = Image.open('test.gif').convert('RGB').getcolors()
lt.sort(key=lambda tup:tup[0], reverse=True)
actual_name, closest_name = get_color_name(lt[0][4])
print lt[0], actual_name, closest_name
輸出:
(531162, (1, 1, 1)) None black
在這種情況下,您會對closest_name
變量感興趣。 第一個( lt[0]
)顯示最常見的RGB值。 這沒有定義的Web顏色名稱,因此對於actual_name
None
說明:
這將打開您提供的文件,將其轉換為RGB,然后在圖像上運行PIL的getcolors
方法。 結果是格式列表(count,RGB_color_value)。 然后我對列表進行排序(按相反順序)。 利用其他答案中的函數,我傳遞最常見的RGB顏色值(現在是列表中的第一個元組,RBG是元組中的第二個元素)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.