HDRReader读取并显示一个 HDR(高动态范围)图像文件

一:主要的知识点


1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程——逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①窗宽和窗位的概念,②交互

二:代码及注释

import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkIOImage import vtkHDRReader
from vtkmodules.vtkInteractionImage import vtkImageViewer
from vtkmodules.vtkRenderingCore import vtkRenderWindowInteractor


def main():
    file_name = "spiaggia_di_mondello_1k.hdr"
    reader = vtkHDRReader()
    if not reader.CanReadFile(file_name):  # 检查文件是否可读
        print("can not read file")
        return

    reader.SetFileName(file_name)
    reader.UpdateInformation()
    # 获取数据的空间范围,会返回一个包含六个整数的元组或列表:[xmin, xmax, ymin, ymax, zmin, zmax]
    we = reader.GetDataExtent()
    extents = [we[0], we[1], we[2], we[3], 0, 0]
    reader.UpdateExtent(extents)  # 获取范围之内的数据,简介取代了Updata的作用
    # reader.Update()

    # visualize
    imgviewer = vtkImageViewer()
    imgviewer.SetInputData(reader.GetOutput())

    """
    设置窗宽
    控制图像的对比度,窗宽越大,对比度越低
    值大 → 灰度拉伸范围大 → 对比度低 → 图像更灰、更平
    值小 → 范围窄 → 对比度高 → 细节容易“过曝/过黑”
    """
    imgviewer.SetColorWindow(1)
    """
    设置窗位
    值大 → 整体变亮
    值小 → 整体变暗。
    控制图像的亮度,窗位值决定了哪个灰度值会显示为中等亮度
    高动态范围(HDR)图像的像素值范围可能非常大,比如从 0 到 100000。
    如果直接显示,图像会非常暗,因为大部分像素值都集中在低端。
    通过设置窗宽和窗位,你可以只显示你感兴趣的像素值范围,从而让图像内容更清晰可见
    """
    imgviewer.SetColorLevel(1)
    imgviewer.SetPosition(0, 100)

    imgviewer.Render()
    iren = vtkRenderWindowInteractor()
    imgviewer.SetupInteractor(iren)
    imgviewer.GetRenderWindow().SetWindowName("HDRReader")

    """
    注册一个事件监听器,让程序能够相应用户的特定交互行为
    EndInteractionEvent  VTK 中预定义的事件名称。它表示“交互结束事件”。
    当用户完成一个交互动作(例如,在调整窗宽窗位后松开鼠标左键,或者完成一次缩放操作后停止拖动鼠标)时,
    这个事件就会被触发
    代码中的鼠标交互功能是 VTK 内置的,而回调函数只是利用这个功能来展示窗宽窗位是如何变化的
    """
    iren.AddObserver("EndInteractionEvent", ColorCallback(imgviewer))

    iren.Start()


class ColorCallback(object):
    def __init__(self, img_viewer):
        self.img_viewer = img_viewer

    def __call__(self, caller, event):
        res = 'Color window: {} level: {}'.format(self.img_viewer.GetColorWindow(),
                                                  self.img_viewer.GetColorLevel())
        print(res)


if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值