检测并 select 个文件夹中的非黑色图像

detect and select nonblack images in a folder

我目前正在从事一个媒体项目。我们拍摄了很长的片段,如果不是黑色的话,主要是黑暗的。我已经将这些剪辑分解成它们的帧(>500k 单帧)并将它们放在一些文件夹中。现在,我的目标是找出并 select 那些不是黑色或主要是黑色的帧:总数中大约有 1000 个。

这似乎是一个简单的 Python 脚本可以轻松处理的工作。我知道 scikit-image 在处理图像方面很常见,但不知道如何编写一个脚本来巧妙地完成这项工作。我有一些科学编程方面的经验,但是图像处理有点超出我的领域。

例如,this image should be reported as black and thus ignored, while this other one,虽然在光线较暗的情况下,但仍应保持完好。

理想情况下,最好有一个脚本使用一个或多个标准来确定图像是否完全黑暗,并且在后一种情况下将其放入另一个文件夹以供人工(我)检查。

非常感谢任何帮助!

您可能想要使用 PIL(Python 图片库)。

我快速搜索了计算图像平均值的代码并找到了这个片段:

Image Average Color

import Image

def get_average_color((x,y), n, image):
    """ Returns a 3-tuple containing the RGB value of the average color of the
    given square bounded area of length = n whose origin (top left corner) 
    is (x, y) in the given image"""

    r, g, b = 0, 0, 0
    count = 0
    for s in range(x, x+n+1):
        for t in range(y, y+n+1):
            pixlr, pixlg, pixlb = image[s, t]
            r += pixlr
            g += pixlg
            b += pixlb
            count += 1
    return ((r/count), (g/count), (b/count))

image = Image.open('test.png').load()
r, g, b = get_average_color((24,290), 50, image)
print r,g,b

也许您可以遍历文件夹中的所有图像并记录(或复制)高于特定值的图像。

使用 PIL 可能有更优雅的方法,但也许这会让您入门。

希望对您有所帮助!

Opencv足以解决这个问题

使用np.mean(image, axis=2)获取不同通道的平均值,然后您可以轻松检查黑色通道。

正如回复中指出的那样,拍摄 'mean' 图像有帮助。读入图像后,我计算 np.mean(img, axis = 2).mean() 以便获得三个颜色通道的平均值。如果此平均值较低 (<2),则丢弃图像,否则将文件复制到另一个文件夹。

该代码的时间效率不高,因为处理 20 万个文件需要约 3 个小时,但确实有效!

您可以使用 ImageMagick 非常简单地获得每张图像的平均值,而无需编写任何代码,它适用于 Windows、Linux 和 macOS。

像这样:

magick identify -format '%[fx:mean*255] %f\r\n' black.jpg
1.01936 black.jpg

和:

magick identify -format '%[fx:mean*255] %f\r\n'  nonblack.jpg
1.72921 nonblack.jpg

为了提高性能,我会在 macOS 或 Linux 上使用 GNU Parallel,但在 Windows 中,我会为每个打开一个新的命令提示符目录和 运行 多个并行脚本,或者启动一个脚本处理所有以 0 或 1 结尾的文件,第二个脚本处理以 2 或 3 结尾的文件,第三个脚本处理以 4,5 或 6 结尾的文件和最后一个处理以 7,8 或 9 结尾的文件。


如果我在 Python 中这样做,顺便说一句,我会使用多处理池来加快速度。