检测并选择文件夹中的非黑色图像

时间:2019-08-08 22:31:40

标签: python python-3.x image-processing scikit-image

我目前正在从事媒体项目。我们已经拍摄了很长的剪辑,如果不是黑色的话,主要是黑色。我已将这些剪辑分解为它们的帧(> 500k单帧),并将它们放入某些文件夹中。现在,我的目标是找出并选择那些不是黑色或主要是深色的帧:大约占总数的一千。

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

例如this image should be reported as black并因此被忽略,而this other one尽管光线暗淡,仍应保持良好状态。

理想情况下,最好的脚本是使用一个或多个条件来确定图像是否完全暗,然后将其放在另一个文件夹中以供人(我)检查。

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您无需使用 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进行操作,我将使用多处理池来加快处理速度。

答案 1 :(得分:1)

Opencv足以解决此问题。

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

答案 2 :(得分:1)

正如答复中指出的那样,对图像进行“均值”分析很有帮助。读取图像后,我计算np.mean(img, axis = 2).mean(),以便获得三个颜色通道的均值。如果该平均值较低(<2),则将丢弃该图像,否则将该文件复制到另一个文件夹。

该代码并不是真正地节省时间,因为200k文件大约需要3个小时,但可以解决问题!

答案 3 :(得分:0)

您可能要使用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可能有一种更优雅的方法,但这也许会让您入门。

希望有帮助!