Ant*_*ria 16 python numpy matplotlib
我有以下问题:我用显微镜保存16位tiff图像,我需要分析它们.我想用numpy和matplotlib做到这一点,但是当我想做一些简单的事情,比如用绿色绘制图像(我稍后需要叠加其他图像)时,它会失败.
这是一个例子,当我尝试将图像绘制为RGB数组或默认色图jet.
import numpy as np
import matplotlib.pyplot as plt
import cv2
imageName = 'image.tif'
# image as luminance
img1 = cv2.imread(imageName,-1)
# image as RGB array
shape = (img1.shape[0], img1.shape[1], 3)
img2 = np.zeros(shape,dtype='uint16')
img2[...,1] += img1
fig = plt.figure(figsize=(20,8))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
im1 = ax1.imshow(img1,interpolation='none')
im2 = ax2.imshow(img2,interpolation='none')
fig.show()
Run Code Online (Sandbox Code Playgroud)
对我来说,产生了下图: 
如果这个问题太基础,我很抱歉,但我不知道为什么正确的情节会显示这些文物.我想得到绿色比例,类似于图形看起来(图像J也产生类似于左图的东西).
非常感谢您的合作.
DrV*_*DrV 39
我发现正确的情节更具艺术性......
matplotlib在解释图像方面相当复杂.大致如下:
如果图像是任何类型的NxM数组,则通过颜色图解析(如果没有另外指示,则自动缩放).(原则上,如果数组是一个float缩放到0..1 的数组,它应该被解释为灰度图像.这是文档所说的,但实际上这不会发生.)
如果图像是NxMx3 float阵列,则RGB分量被解释为0..1之间的RGB分量.如果值超出此范围,则采用正模1,即1.2 - > 0.2,-1.7 - > 0.3等.
如果图像是NxMx3 uint8阵列,则将其解释为标准图像(0..255组件)
如果图像是NxMx4,则解释如上,但第四个分量是不透明度(alpha)
因此,如果给出matplotlib除uint8or 之外的NxMx3整数数组,float则不会定义结果.但是,通过查看源代码,可以理解奇怪的行为:
if A.dtype != np.uint8:
A = (255*A).astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)
A图像阵列在哪里.所以,如果你给它uint16值0,1,2,3,4 ...,你会得到0,255,254,253 ......是的,它看起来很奇怪.(恕我直言,解释可能更直观,但这就是它的完成方式.)
在这种情况下,最简单的解决方案是将数组除以65535.然后图像应该符合预期.此外,如果您的原始图像是真正线性的,那么您需要进行反向伽马校正:
img1_corr = (img1 / 65535.)**(1/2.2)
Run Code Online (Sandbox Code Playgroud)
否则你的中间色调会太暗.
| 归档时间: |
|
| 查看次数: |
12348 次 |
| 最近记录: |