如何从视频中提取像素行(roi),将多行合并为一个.tif图像?

1 投票
1 回答
739 浏览
提问于 2025-04-18 13:16

我刚开始学习编程,正在尝试使用ImageJ和Jython从视频中提取一条线,并把这些线合成一个时间进程。我想制作一个视频kymogram(也就是一种特殊的图像展示方式,详细信息可以查看这个链接:http://www.kymography.com/supp_demo.html)!

我尝试的代码是这样的:

from ij import ImagePlus, IJ
from ij.process import FloatProcessor

img = IJ.getImage() 
roi = img.getRoi()
StackSize = 100  #img.getImageStackSize() 

pixels = roi.getPixels()
Length = len(pixels)
Width = 1

total_pixels = [[0] *len(pixels)] * StackSize
t_pixels = []


for j in range (1, StackSize):
    img.setSlice (j)
    roi = img.getRoi()
    pixels = roi.getPixels()
    for i in xrange (len(pixels)):
        pixels [i] = pixels [i] 
    total_pixels[j-1] = pixels 

fp = FloatProcessor (Length, StackSize,total_pixels)
imp = ImagePlus ("White Noise", fp) 
imp.show()

但是它返回了一个错误信息: TypeError: ij.process.FloatProcessor(): 第三个参数不能转换为double[], int[], float[]

有没有什么建议可以解决这个问题?我可能可以通过遍历一个文本文件来添加像素变量,但我不知道该怎么做。 任何帮助都非常欢迎。 顺便说一下,如果你想试试,可以使用Fiji的Fly Brain示例。

非常感谢!

1 个回答

0

你遇到的错误提示说明,total_pixels 不是一个 double[]、int[] 或 float[] 类型的数组,而这是使用 FloatProcessor 类的构造函数所需要的。

在 Python 中创建 Java 数组的一个好方法是使用 jarray,这是一个用于 Java 数组的 Jython 模块,具体可以参考 Fiji wiki 的 Jython 脚本文档

我对你的代码做了一些修改,同时 for 循环里面也需要一些修正:

from ij import ImagePlus, IJ
from ij.process import FloatProcessor
from jarray import zeros

img = IJ.getImage() 
roi = img.getRoi()
stackSize = img.getImageStackSize() 

pixels = roi.getPixels()
length = len(pixels)

total_pixels = zeros(length * stackSize, 'f')

for j in xrange (stackSize):
    img.setSlice (j+1)
    roi = img.getRoi()
    pixels = roi.getPixels()
    for i in xrange (length):
        total_pixels[j*length+i] = pixels [i]

fp = FloatProcessor (length, stackSize, total_pixels)
imp = ImagePlus ("White Noise", fp) 
imp.show()

顺便提一下,其他人也用过 ImageJ 来处理 kymographs(运动图):你可以在 Fiji wiki 上找到一个教程,还有一些 生成 kymographs 的插件

撰写回答