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

时间:2015-01-09 19:58:39

标签: python python-imaging-library satellite

我正在下载这样的卫星图片 satellite_image http://home.chpc.utah.edu/~u0553130/NASA_SPoRT_VIIRS_Images/VIIRS_11um_20150104_1834_UTC.gif 由于有些图像大多是黑色的,就像这个,我不想保存它。

如何使用python检查图像是否超过50%黑色?

4 个答案:

答案 0 :(得分:7)

您正在处理通过示例图像外观主要为灰度的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")

调整&#34;黑色&#34;的阈值在适当的情况下,在0(黑色)和255(亮白色)之间。

答案 1 :(得分:1)

彻底的方法是使用像PIL这样的东西计算像素,如其他答案中给出的那样。

但是,如果它们都是压缩图像,您可以检查文件大小,因为具有大量纯色区域的图像应比具有云层变化的图像压缩得多。

通过一些测试,您至少可以找到一个启发式,其中包含大量云的图像,您可以立即丢弃这些图像,而无需在像素上进行昂贵的循环。可以逐像素地检查接近50%的其他人。

此外,当迭代像素时,您不需要计算所有黑色像素,然后检查至少50%是黑色。相反,一旦你知道至少50%是黑色,就停止计数和丢弃。

第二个优化:如果你知道图像通常是阴天而不是大多数是黑色,那么走另一条路。计算非黑色像素的数量,并在超过50%时立即停止并保留图像。

答案 2 :(得分:0)

  • 加载图片
  • 读取每个像素并增加结果,如果pixel =(0,0,0)
  • 如果result =&lt; (image.width * image.height)/ 2
  • 保存图片

或者如果您的像素R(或G或B)分量小于15,则检查它是否几乎为黑色。

答案 3 :(得分:0)

利用您的测试图像,最常见的颜色的RGB值为(1,1,1)。这是非常黑的,但不完全是黑色。我的回答使用PIL librarywebcolors以及this回答代码的慷慨帮助。

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颜色名称,因此None的{​​{1}}


说明:

这是打开您提供的文件,将其转换为RGB,然后在图像上运行PIL的getcolors方法。结果是格式列表(count,RGB_color_value)。然后我对列表进行排序(按相反顺序)。利用其他answer中的函数,我传递最常见的RGB颜色值(现在是列表中的第一个元组,RBG是元组中的第二个元素)。