一、光学分辨率
- 光学分辨率:在显微镜拍摄图像时,光学分辨率参数的设置决定了图像的精度和细节。分辨率越高,能够分辨的细节就越多。
- 光学分辨率转换:由于内存限制和不同的应用需求,实际操作中常常需要对图像的分辨率进行转换。例如,在图像配准时,通常使用各向同性图像(各方向上的分辨率相同),而显微镜下机得到的图像可能是各向异性的(不同方向上的分辨率不同)。这种转换能够保证在后续分析中的一致性和准确性。
二、放大倍率与光学分辨率
2.1、光学误差
在显微镜成像中,放大倍率和分辨率之间存在直接关系。
- 理论上,分辨率与放大倍率成正比。这意味着随着放大倍率的增加,能够分辨的细节也应相应增加。
- 但在实际操作中,由于成像系统和采集设备的光学特性,理论和现实之间往往会产生差异。这种差异在高倍率情况下尤其明显。
- 例如:当像元尺寸固定时,理论放大倍率设定为4倍,但实际测量结果可能仅为3.95倍。这表明,尽管硬件条件未发生问题,但光学因素(如镜头的衍射效应、成像质量等)会影响实际分辨率,导致实际成像效果低于理论预期。
已知:使用光学显微镜得到原始图像,然后使用后处理得到下采样图像,然后开始图像配准。
放大倍率 XZY光学分辨率(μm) 图像内存
------------------------------------------------------------
原始图像 1.625 1.625 3 261.12GB
4x(XYZ均下采样四倍) 6.5 6.5 12 4.08GB
8x(XYZ均下采样八倍) 13 13 24 0.51GB
############################################################
使用8x图像完成图像配准:
使用[13, 13, 24]配准失败;
使用[15, 15, 24]配准成功; 为什么是15?实验值
############################################################
2.2、由于光学误差,图像配准需要调参
三、光学分辨率转换
3.1、计算公式
输入图像的像素分辨率 X Y Z = [ 6.5 , 6.5 , 12 ] 输出图像的像素分辨率 X Y Z = [ 3.25 , 6.5 , 24 ] = 输出图像的图像分辨率 X Y Z = [ 548 , 431 , 2182 ] 输入图像的图像分辨率 X Y Z = [ 1096 , 431 , 1091 ] \frac{\text{输入图像的像素分辨率} XYZ=[6.5,6.5,12]}{\text{输出图像的像素分辨率} XYZ=[3.25,6.5,24]} = \frac{\text{输出图像的图像分辨率} XYZ=[548,431,2182]}{\text{输入图像的图像分辨率} XYZ=[1096,431, 1091]} 输出图像的像素分辨率XYZ=[3.25,6.5,24]输入图像的像素分辨率XYZ=[6.5,6.5,12]=输入图像的图像分辨率XYZ=[1096,431,1091]输出图像的图像分辨率XYZ=[548,431,2182]
备注:像素分辨率越小,图像分辨率越大。
3.2、代码复现
import tifffile
from skimage import transform
def resolution_conversion(image, resolution, resolution_target):
"""将三维图像的光学分辨率从原始分辨率转换为目标分辨率。
参数:
image: numpy 数组, 输入的三维图像。
resolution: 列表 [Z, Y, X], 图像的原始光学分辨率 (单位:微米)。
resolution_target: 列表 [Z, Y, X], 图像的目标光学分辨率 (单位:微米)。
返回:
target_image: numpy 数组, 调整分辨率后的三维图像。
"""
# (1)计算 Z、Y、X 方向的缩放比例
scale_Z = resolution_target[0] / resolution[0]
scale_Y = resolution_target[1] / resolution[1]
scale_X = resolution_target[2] / resolution[2]
# (2)根据缩放比例计算目标图像的形状
image_shape_Z_target = int(resolution[0] / resolution_target[0] * image.shape[0])
image_shape_Y_target = int(resolution[1] / resolution_target[1] * image.shape[1])
image_shape_X_target = int(resolution[2] / resolution_target[2] * image.shape[2])
target_size = (image_shape_Z_target, image_shape_Y_target, image_shape_X_target)
print(f"转换比例:{
[scale_X, scale_Y, scale_Z]}, 原图形状: {
image.shape}, 目标形状: {
target_size}")
# (3)插值与缩放
target_image = transform.resize(image, target_size, mode='constant', cval=0, order=0)
return target_image
if __name__ == "__main__":
# (1)读取图像
image = tifffile.imread(r"F:/py/image.tif")
# (2)图像的光学分辨率转换 ———— 根据放大倍率的不同:4倍200GB图像,[10, 10, 10]大约1GB,[20, 20, 20]大约100MB
resolutionZYX = [6.5, 6.5, 12] # 原始图像的光学分辨率ZYX,单位:微米(um)
converted_image = resolution_conversion(image, resolutionZYX, resolution_target=[20, 20, 20])
# (3)保存图像
target_image_path = "converted_image.tif"
tifffile.imwrite(target_image_path, converted_image)
# (4)可视化图像
# import napari
# viewer = napari.Viewer()
# viewer.add_image(image, name='image')
# viewer.add_image(converted_image, name='converted_image')
# viewer.grid.enabled = not viewer.grid.enabled # 切换到网格模式
# napari.run()
"""
转换比例:[1.6666666666666667, 3.076923076923077, 3.076923076923077]
原图形状: (1084, 754, 1198)
目标形状: (352, 245, 718)
"""