如何从视频中提取像素行(roi),将多行合并为一个.tif图像?
我刚开始学习编程,正在尝试使用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 的插件。