Dicom:Matlab与ImageJ灰度级

Pro*_*eus 3 matlab image-processing dicom imagej

我正在使用ImageJ和Matlab处理一组DICOM图像.为了进行处理,我需要在8位深度版本的图像中找到灰度级在110和120之间的斑点.

问题是:Matlab和ImageJ显示的图像是不同的,使用相同的源文件.我假设其中一个在读取时或显示之前在其灰度级执行某种转换.但是其中哪一个呢?在这种情况下,我如何校准,以便它们显示相同的图像?

下图显示了读取的图像的比较.在imageJ的情况下,我刚刚打开了应用程序并打开了DICOM图像.

在第二种情况下,我使用了以下MATLAB脚本:

[image] = dicomread('I1400001');

figure (1)
imshow(image,[]);
title('Original DICOM image');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那么哪一个正在改变原始图像,如果是这种情况,我该如何修改以使两个版本看起来都一样?

gno*_*ice 5

看来默认情况下,ImageJ使用DICOM标题中的Window Center和Window Width标签在显示原始像素数据之前对原始像素数据执行窗口和水平对比度调整,而MATLAB代码使用全范围的数据进行显示.取自ImageJ用户指南:

16显示DICOM图像的范围

使用DICOM图像,ImageJ基于Window Center(0028,1050)和 Window Width(0028,1051)标签设置初始显示范围.单击W&L或B&C窗口上的重置,显示范围将设置为最小和最大像素值.

因此,将ImageJ设置为使用全范围的像素值应该会为您提供与MATLAB中显示的图像相匹配的图像.或者,您可以dicominfo在MATLAB中使用从标题中获取这两个标记值,然后在显示之前对数据应用窗口/调平.您的代码可能看起来像这样(使用上面第一个链接中的公式):

img = dicomread('I1400001');
imgInfo = dicominfo('I1400001');
c = double(imgInfo.WindowCenter);
w = double(imgInfo.WindowWidth);
imgScaled = 255.*((double(img)-(c-0.5))/(w-1)+0.5);  % Rescale the data
imgScaled = uint8(min(max(imgScaled, 0), 255));      % Clip the edges
Run Code Online (Sandbox Code Playgroud)

注意1)double用于转换为双精度以避免整数运算,2)假设数据是无符号8位整数(这是结果转换回来的),以及3)我没有使用变量名,image因为已经存在具有该名称的函数.;)