一:主要的知识点
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()
图像文件&spm=1001.2101.3001.5002&articleId=154597776&d=1&t=3&u=973a5944b30c4901bd3d6b7a8296e733)
390

被折叠的 条评论
为什么被折叠?



