Image processing Python和ffmpeg创建不同的tiff堆栈

Image processing Python和ffmpeg创建不同的tiff堆栈,image-processing,ffmpeg,python-imaging-library,libtiff,Image Processing,Ffmpeg,Python Imaging Library,Libtiff,大家好,大家都对图像处理感兴趣 从灰度电影创建多页tiff文件tiff堆栈无需使用ffmpeg和tiffcp编程即可实现。后者是Debian libtiff工具的一部分: ffmpeg -i movie.avi frame%03d.tif tiffcp frame*.tif stack.tif 使用OpenCV和TIFF文件库,用Python编程对我来说也是可行的: import numpy as np import cv2 import tifffile cap = cv2.VideoCa

大家好,大家都对图像处理感兴趣

从灰度电影创建多页tiff文件tiff堆栈无需使用ffmpeg和tiffcp编程即可实现。后者是Debian libtiff工具的一部分:

ffmpeg -i movie.avi frame%03d.tif
tiffcp frame*.tif stack.tif
使用OpenCV和TIFF文件库,用Python编程对我来说也是可行的:

import numpy as np
import cv2
import tifffile

cap = cv2.VideoCapture('movie.avi')

success, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

image = np.zeros((300, 400, 500), 'uint8')  # pre-allocate some space
i = 0;

while success:
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    image[i,:,:] = gray[80:480,0:500]
    success, frame = cap.read()

cap.release()
tifffile.imsave('image.tif',image,photometric='minisblack')
然而,结果大小不同。查看Python解决方案的直方图,我意识到它与ffmpeg解决方案不同

由于下面的答案,我将输出文件与文件进行了比较:

此外,我将这些文件与ffmpeg进行了比较:

我可以使用哪些附加诊断来确定问题?

压缩算法 默认情况下,ffmpeg对TIFF输出使用packbits压缩算法。这可以通过-compression_algo选项进行更改,其他可接受的值为raw、lzw和deflate:

ffmpeg-i input.avi-压缩算法lzw输出%04d.tif 像素格式 另一个差异可能由像素格式颜色空间和色度子采样引起。有关支持的像素格式列表,请参见ffmpeg-h encoder=tiff。 使用哪种像素格式取决于您的输入,日志/控制台输出将指示所选的像素格式

比较产出 我不知道tifffile使用的默认值是什么,但您可以运行ffmpeg-I ffmpeg.tif-I tifffile.tif和ffmpeg.tif tifffile.tif文件来查看可能解释差异的详细信息。

压缩算法 默认情况下,ffmpeg对TIFF输出使用packbits压缩算法。这可以通过-compression_algo选项进行更改,其他可接受的值为raw、lzw和deflate:

ffmpeg-i input.avi-压缩算法lzw输出%04d.tif 像素格式 另一个差异可能由像素格式颜色空间和色度子采样引起。有关支持的像素格式列表,请参见ffmpeg-h encoder=tiff。 使用哪种像素格式取决于您的输入,日志/控制台输出将指示所选的像素格式

比较产出
我不知道tifffile使用的默认设置是什么,但您可以运行ffmpeg-I ffmpeg.tif-I tifffile.tif和ffmpeg.tif tifffile.tif文件来查看可能解释差异的详细信息。

非常感谢您的提示,我将仔细尝试。现在我知道如何继续了。非常感谢你的提示。我将这两个输出文件与文件程序和ffmpeg进行了比较,但遗憾的是,无法确定两者之间的差异。@NicolasBourbaki文件输出表明tifffile未使用压缩,而ffmpeg使用压缩打包算法。如果希望ffmpeg使用无压缩,请添加-compression_algo raw output选项。您的文件没有显示ffmpeg tiff的更多信息,但它为我提供了一个示例文件:ffmpeg-f lavfi-I testsrc=s=500x400,format=gray-frames:v1 output.tiff非常感谢您的提示,我将仔细尝试。现在我知道如何继续了。非常感谢你的提示。我将这两个输出文件与文件程序和ffmpeg进行了比较,但遗憾的是,无法确定两者之间的差异。@NicolasBourbaki文件输出表明tifffile未使用压缩,而ffmpeg使用压缩打包算法。如果希望ffmpeg使用无压缩,请添加-compression_algo raw output选项。您的文件没有显示ffmpeg tiff的更多信息,但我制作的示例文件却显示了:ffmpeg-f lavfi-I testsrc=s=500x400,format=gray-frames:v 1 output.tiff
user@ubuntu:~$ file ffmpeg.tif tifffile.tif 
ffmpeg.tif: TIFF image data, little-endian
tifffile.tif:  TIFF image data, little-endian, direntries=17, height=400, bps=8, compression=none, PhotometricIntepretation=BlackIsZero, description={"shape": [300, 400, 500]}, width=500
user@ubuntu:~$ ffmpeg -i ffmpeg.tif -i tifffile.tif 
[tiff_pipe @ 0x556cfec95d80] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, tiff_pipe, from 'ffmpeg.tif':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: tiff, gray, 500x400 [SAR 1:1 DAR 5:4], 25 tbr, 25 tbn, 25 tbc
[tiff_pipe @ 0x556cfeca6b40] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #1, tiff_pipe, from 'tifffile.tif':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Video: tiff, gray, 500x400 [SAR 1:1 DAR 5:4], 25 tbr, 25 tbn, 25 tbc