检测并 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 图片库)。
我快速搜索了计算图像平均值的代码并找到了这个片段:
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 中这样做,顺便说一句,我会使用多处理池来加快速度。
我目前正在从事一个媒体项目。我们拍摄了很长的片段,如果不是黑色的话,主要是黑暗的。我已经将这些剪辑分解成它们的帧(>500k 单帧)并将它们放在一些文件夹中。现在,我的目标是找出并 select 那些不是黑色或主要是黑色的帧:总数中大约有 1000 个。
这似乎是一个简单的 Python 脚本可以轻松处理的工作。我知道 scikit-image 在处理图像方面很常见,但不知道如何编写一个脚本来巧妙地完成这项工作。我有一些科学编程方面的经验,但是图像处理有点超出我的领域。
例如,this image should be reported as black and thus ignored, while this other one,虽然在光线较暗的情况下,但仍应保持完好。
理想情况下,最好有一个脚本使用一个或多个标准来确定图像是否完全黑暗,并且在后一种情况下将其放入另一个文件夹以供人工(我)检查。
非常感谢任何帮助!
您可能想要使用 PIL(Python 图片库)。
我快速搜索了计算图像平均值的代码并找到了这个片段:
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 中这样做,顺便说一句,我会使用多处理池来加快速度。