天天看点

QT和VTK联合显示图像时发生扭曲变形的问题解决

本文由Markdown语法编辑器编辑完成。

1. 问题提出背景:

  基于本博客之前的一篇博文《QT+VTK: 如何在QT中显示VTK生成的图像》,主要讲解了一般医学软件是如何基于QT和VTK的基础,进行医学图像的渲染和展示的。

  前段时间在实现一个需求——在一个窗口中显示一个序列的部分图像。这就需要在QT的一个布局窗口(QWidget/QLayout)中,再内建一个QGridLayout,然后将序列图像依次布局在子layout中。然后,随着QGridLayout的行和列不断增加,最后当增加一定程度时,会导致布局内部的部分图像发生扭曲变形。效果如下图所示:

QT和VTK联合显示图像时发生扭曲变形的问题解决
QT和VTK联合显示图像时发生扭曲变形的问题解决

  两幅图中,第一幅图的主布局是1行2列,在左侧是一张X光图像,在右侧的布局中显示的是一组CT序列的图像。内部是一个QGridLayout,它会随着布局内需要显示的图像层数,来动态地调整行和列的数字。可以看到,当显示的图像层片数从25层,再增加一层时。即由五行五列到五行六列时,之前显示正常的图像突然很多都发生了扭曲变形,如第2张图中紫色线框包含的那2列图像。

  本文主要分析,产生这个问题的原因,和最后的解决方案。

2. 问题解决思路:

  在解决这个问题时,首先需要理解这个图像是如何显示在前台的界面中的。这里涉及到VTK的渲染,QImage的显示,QWidget的事件机制,像素拷贝等基础知识。用一句话概括这个过程就是:

VTK在后台进行图像渲染,然后渲染出的图像按照像素,逐个拷贝到一个QImage中,QWidget利用它的paintEvent事件响应,将拷贝后的QImage显示在QWidget中。

因此,要调研这个图像变形的问题,就需要从这几个环节中去排查,看到底是哪一个环节出了问题,然后再对症下药,解决问题。

3. 问题解决方案:

问题排查(2018.08.12补充):

根据前面的现象描述:图像出现扭曲是从,序列内的布局从5*5过度到5*6时发生的,也就是从序列内加载的图像数量从25增加到26个时发生的。因此在这个临界点debug代码,看一下这个时刻发生了什么变化。

经过对成像过程的跟踪,发现页面布局变化后,序列布局内窗口的宽度(同一行内的窗口宽度),会不相等。按理来说,每个窗口的宽度应该是界面的总宽度除以一行内窗口的数量,应该是相等的。但是由于计算宽度时,不知道什么原因,会造成一行内窗口的宽度不同,某一列或某几列的宽度会比其他列少1~2个像素值。但是原始DICOM图像在通过vtk生成的图像大小却是相同的。这样会造成窗口宽度狭窄的那些列图像会发生变形。

了解了这个原因后,在vtk生成的图像向QImage拷贝前,将每个窗口的实际宽度再重新设置给QImage(这样可以确保即使每一行的窗口宽度相差1~2个像素,但是生成的QImage一定是能够和该窗口的宽度是一致的)。这样就不会造成图像发生歪曲变形了。

最终在了解了问题产生的原因,和提出相应的解决方案后,修改代码后,再增加显示的图像层数时,所有的图像层便可以正常显示。如下图所示。

QT和VTK联合显示图像时发生扭曲变形的问题解决

完!

继续阅读