项目背景:
1.前后端采用websocket通讯,后端处理得到的结果通过png数据格式返回前端
2.常规的8位png图像只能由256个灰阶,动态范围小,不能在前端进行窗宽窗位调节,因此需要使用16png数据
3.使用VTK 从nrrd/Dicom/nifty格式中解析图像数据解析得到的数据通常为16有符号类型,signed short,VtkImageData->QImage->png
处理方式:
1.先使用vtkNrrdReader读取nrrd数据
vtkSmartPointer <vtkNrrdReader> reader = vtkSmartPointer<vtkNrrdReader>::New(); reader->SetFileName(nrrdFileName.c_str()); reader->Update(); m_imageData = reader->GetOutput();
2.数据灰度偏移处理
需要注意的是,1中得到的数据格式为VTK_SHORT类型,但是png是没有有符号数据的概念,也就是png中存储的均为正数,因此需要先对数据进行处理,VTK_SHORT->VTK_UNSIGNED_SHORT。
使用vtkImageShiftScale。
double range[2]; data->GetScalarRange(range);//获取data的最大最小像素值 vtkImageShiftScale* shifter = vtkImageShiftScale::New(); shifter->SetShift(-1.0 * range[0]); //减去最小值 shifter->SetOutputScalarTypeToUnsignedShort(); shifter->SetInputData(data); shifter->Update();
3.将2中处理好的数据用QImage类表示
vtkSmartPointer<vtkImageData> castdata = shifter->GetOutput(); uchar* newMipData = (unsigned char*)castdata->GetScalarPointer(); QImage tmpImg(newMipData, castdata->GetDimensions()[0], castdata->GetDimensions()[1], castdata->GetDimensions()[1] * sizeof(quint16), QImage::Format_Grayscale16);
4.将3中的QImage保存为png格式即可
QByteArray imgData; QBuffer tmpBuf(&imgData); tmpBuf.open(QIODevice::WriteOnly); img.save(&tmpBuf, "png");
img.save(QString::fromStdString("D:/1.png"), "png");
接下来即可将png格式的数据流通过qwebsocket发出去了。
下图即为保存得到的16-bit的png图像
\
标签:castdata,16,VtkImageData,png,shifter,reader,PNG,QImage From: https://www.cnblogs.com/0523jy/p/17109980.html