我目前正在从事媒体项目。我们已经拍摄了很长的剪辑,如果不是黑色的话,主要是黑色。我已将这些剪辑分解为它们的帧(> 500k单帧),并将它们放入某些文件夹中。现在,我的目标是找出并选择那些不是黑色或主要是深色的帧:大约占总数的一千。
这似乎是一个简单的Python脚本可以轻松完成的工作。我知道scikit-image在处理图像时很常见,但是不知道如何提出一个能很好地完成工作的脚本。我有一些科学编程方面的经验,但是图像处理方面的知识超出了我的领域。
例如this image should be reported as black并因此被忽略,而this other one尽管光线暗淡,仍应保持良好状态。
理想情况下,最好的脚本是使用一个或多个条件来确定图像是否完全暗,然后将其放在另一个文件夹中以供人(我)检查。
非常感谢您的帮助!
答案 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图像库)。
我快速搜索了计算图像平均值的代码,并找到了以下代码段:
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可能有一种更优雅的方法,但这也许会让您入门。
希望有帮助!