2017-07-26 76 views
0

我需要计算包含100张图像的时间推移中每个单独图像的绿色信号与红色信号的比率。这些比例需要以与图像相同的顺序绘制(即随着时间的推移)。到目前为止,我可以获取单个图像的每个信号的值,但是我无法获取图像列表的值并以python中的连贯方式绘制数据。计算python中图像列表的绿色信号强度与红色信号强度的比率

对于单个图像I使用的下列:

from PIL import Image 
import scipy.stats as ss 
import matplotlib.pyplot as plt 

im = np.array(Image.open("my_image.tif")) 

red = im[:,:,0] 
green = im[:,:,1] 
plt.hist(red.ravel()) 
plt.hist(green.ravel()) 

任何建议,将不胜感激。我对python相当陌生,所以请原谅我的无能。

+1

您能描述一下,或者更好的草图,如何您理想的输出可能? –

+0

理想的输出是按照时间顺序(根据图像序列)的比率列表,我可以使用它来生成线图来计算信号衰减曲线等。 –

+0

这是一个TIF中的100帧吗?你能分享图像吗? –

回答

0

不确定您是否想要一种方法来获取答案,或者您是否设置了Python解决方案。无论如何,似乎没有任何Python解决方案即将推出,所以我正在演示一种非常简单的方法来获取ImageMagick,它安装在大多数Linux发行版上,可用于macOS和Windows。

基本上,我只是在终端,运行从ImageMagick套件。

我加载了一个形象,并得到ImageMagick的来计算绿色像素的平均值除以红色像素(mean.r)的平均值(mean.g):

convert Stack0000.tif -format "%[fx:mean.r/mean.g]\n" info: 
0.715659 

现在,如果我想获得同样的统计的所有文件,我再次做同样的事情,但加载所有图像,并且还用前缀的文件名(%f)每一个结果,就像这样:

convert Stack*.tif -format "%f %[fx:mean.r/mean.g]\n" info: 

输出

Stack0000.tif 0.715659 
Stack0001.tif 0.704214 
Stack0002.tif 0.710086 
Stack0003.tif 0.711458 
Stack0004.tif 0.715423 
Stack0005.tif 0.715327 
Stack0006.tif 0.720593 
Stack0007.tif 0.719039 
Stack0008.tif 0.725973 
Stack0009.tif 0.730682 
Stack0010.tif 0.731558 
Stack0011.tif 0.769168 
Stack0012.tif 0.808623 
Stack0013.tif 0.863428 
Stack0014.tif 0.952388 
Stack0015.tif 1.02525 
Stack0016.tif 1.09869 
Stack0017.tif 0.857375 
Stack0018.tif 1.24331 
Stack0019.tif 1.18171 
Stack0020.tif 1.10395 
Stack0021.tif 1.07511 
Stack0022.tif 1.05641 
Stack0023.tif 1.04386 
Stack0024.tif 1.03314 
Stack0025.tif 1.02554 
Stack0026.tif 1.02284 
Stack0027.tif 1.02046 
Stack0028.tif 1.01807 

请注意,如果你在29页的多页TIFF的一大摞所有的图像,你可以使用“场景号”%s),而不是文件名(%f):

convert StackOf29.tif -format "%s %[fx:mean.r/mean.g]\n" info: 

0 0.715659 
1 0.704214 
2 0.710085 
3 0.711457 
4 0.715425 
5 0.71533 
6 0.720594 
7 0.719038 
8 0.725976 
9 0.730682 
10 0.731559 
11 0.76917 
12 0.808621 
13 0.863424 
14 0.952388 
15 1.02525 
16 1.09869 
17 0.857375 
18 1.24331 
19 1.18171 
20 1.10395 
21 1.07511 
22 1.05641 
23 1.04386 
24 1.03314 
25 1.02554 
26 1.02283 
27 1.02046 
28 1.01808 

如果你想绘制的是,你可以使用gnuplot这样的:

convert StackOf29.tif -format "%s %[fx:mean.r/mean.g]\n" info: > ratios.dat 
gnuplot < plot.cmd 

enter image description here

其中plot.cmd包含:

set terminal png size 900,300 
set output "graph.png" 
set title 'Intensity Plot' 
set ylabel 'Green:Red Ratio' 
set xlabel 'Frame number' 
plot "ratios.dat" lt 3 
+0

嗨马克。非常感谢。我安装了Magick,它从我的命令行工作。我选择python的原因是我已经熟悉SciPy,并希望最终能够为我所有的timelapses运行一个脚本,并设法绘制信号衰减曲线和所有这些曲线。 ImageMagick似乎现在工作得很好,直到我找出更强大的东西。 :遇到标记为50839(0xc697)的未知字段。 'TIFFReadDirectory'@ warning/tiff.c/TIFFWarnings/921。 –

+0

我不是在电脑上,而是尝试使用'-quiet'选项或搜索'-define tiff:ignore-tags'或其他。 –

+0

https://stackoverflow.com/a/44820485/2836621这里是 –

2
from skimage import io 

# Load all tiff files in current directory 
ic = io.ImageCollection('*.tif') 

# Compute the ratio of red mean vs green mean for each image 
# in the image collection 
ratios = [image[..., 0].mean()/image[..., 1].mean() for image in ic] 

# Plot the results 
import matplotlib.pyplot as plt 
plt.plot(range(len(ic)), ratios) 
plt.show() 

red_vs_green_ratios

+0

非常好的解决方案 - 让我的投票。 –

+0

谢谢Stefan,这真的很有帮助!将它应用到我的大型数据集中,并且完美运行。是否有可能一次读取多个集合(每个集合有一个timelapse图像的独立文件)? –

+0

如果您有存储多个图像的TIFF文件,那肯定是可行的。多页TIFF被读入形状为'(pages,M,N,3)'的数组中,所以你可以遍历图像本身的页面,而不仅仅是遍历ic:'images = io.ImageCollection('* .TIF');比率= [[page,...,0] .mean()/ page [...,1] .mean()用于图像中的页面]。 –