簡體   English   中英

Python - 找出圖像中有多少是黑色的

[英]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%時立即停止並保留圖像。

  • 加載圖片
  • 如果pixel =(0,0,0),讀取每個像素並遞增結果
  • 如果result = <(image.width * image.height)/ 2
  • 保存圖片

或者如果您的像素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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM