我正在下载这样的卫星图片 satellite_image http://home.chpc.utah.edu/~u0553130/NASA_SPoRT_VIIRS_Images/VIIRS_11um_20150104_1834_UTC.gif 由于有些图像大多是黑色的,就像这个,我不想保存它。
如何使用python检查图像是否超过50%黑色?
答案 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)
或者如果您的像素R(或G或B)分量小于15,则检查它是否几乎为黑色。
答案 3 :(得分:0)
利用您的测试图像,最常见的颜色的RGB值为(1,1,1)。这是非常黑的,但不完全是黑色。我的回答使用PIL library,webcolors以及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是元组中的第二个元素)。