读取图像的像素值 我试图用草根DICOM(GDCM)库读取我的简单C++应用程序中包含在DICOM文件中的图像的像素值。读取文件元数据时,我得到了有关图片的以下信息: 分配的位:16 存储位数:16 高位:15 未签名或已签名:1 像素:1 尺寸:2 尺寸值:256x256 像素表示:1 样本每像素:1 ScalarType:INT16 光度解释:单色2 像素缓冲区长度:131072

读取图像的像素值 我试图用草根DICOM(GDCM)库读取我的简单C++应用程序中包含在DICOM文件中的图像的像素值。读取文件元数据时,我得到了有关图片的以下信息: 分配的位:16 存储位数:16 高位:15 未签名或已签名:1 像素:1 尺寸:2 尺寸值:256x256 像素表示:1 样本每像素:1 ScalarType:INT16 光度解释:单色2 像素缓冲区长度:131072,c++,image,pixels,gdcm,C++,Image,Pixels,Gdcm,鉴于图像的分辨率为256x256,且为单色2类型,我预计像素缓冲区长度为256x256=65536个元素,但实际上长度为131072个元素 如果我使用MATLAB来导入像素数据,我会得到0-850范围内的65536个值,其中0为黑色,850为白色 当我查看从我的C++应用程序中的GDCM读出器获取的像素缓冲器时,像素缓冲区是131072个元素,其中每个偶数索引元素在范围128到127之间,每个奇数索引元素都在0-3范围内。像这样: 执行: 像素缓冲区[120]=-35 像素缓冲区[121]=0

鉴于图像的分辨率为256x256,且为单色2类型,我预计像素缓冲区长度为256x256=65536个元素,但实际上长度为131072个元素

如果我使用MATLAB来导入像素数据,我会得到0-850范围内的65536个值,其中0为黑色,850为白色

当我查看从我的C++应用程序中的GDCM读出器获取的像素缓冲器时,像素缓冲区是131072个元素,其中每个偶数索引元素在范围128到127之间,每个奇数索引元素都在0-3范围内。像这样:

执行:
像素缓冲区[120]=-35
像素缓冲区[121]=0
像素缓冲区[122]=51
像素缓冲区[123]=2
像素缓冲区[124]=71
像素缓冲区[125]=2
像素缓冲区[126]=9
像素缓冲区[127]=2
像素缓冲区[128]=-80
像素缓冲区[129]=2
像素缓冲区[130]=87
像素缓冲区[131]=3
像素缓冲区[132]=121
像素缓冲区[133]=3
像素缓冲区[134]=-27
像素缓冲区[135]=2
像素缓冲区[136]=27
像素缓冲区[137]=2
像素缓冲区[138]=-111
像素缓冲区[139]=1
像素缓冲区[140]=75
像素缓冲区[141]=1
像素缓冲区[142]=103

这种价值观的安排意味着什么?这是单色图像的典型像素表示吗?我一直在“谷歌图像像素结构”和类似的,但找不到我要找的。是否有一些可用的资源可以帮助我理解这些值的排列以及它们如何与每个像素相关?

我使用此代码读取16位Dicom文件:

byte[] signedData = new byte[2];
        List<int> tempInt = new List<int>();
        List<ushort> returnValue = new List<ushort>();

        for (i = 0; i < PixelBuffer.Length; ++i)
        {
            i1 = i * 2;
            signedData[0] = PixelBuffer[i1];
            signedData[1] = PixelBuffer[i1 + 1];
            short sVal = System.BitConverter.ToInt16(signedData, 0);

            int pixVal = (int)(sVal * rescaleSlope + rescaleIntercept);

            tempInt.Add(pixVal);
        }

        int minPixVal = tempInt.Min();
        SignedImage = false;
        if (minPixVal < 0) SignedImage = true;

        foreach (int pixel in tempInt)
        {
            ushort val;
            if (SignedImage)
                val = (ushort)(pixel - short.MinValue);
            else
            {
                if (pixel > ushort.MaxValue) val = ushort.MaxValue;
                else val = (ushort)(pixel);
            }

            returnValue.Add(val);
        }
byte[]signedData=新字节[2];
List tempInt=new List();
List returnValue=新列表();
对于(i=0;iushort.MaxValue)val=ushort.MaxValue;
else val=(ushort)(像素);
}
returnValue.Add(val);
}

INT16
表示每个像素都是由2个字节组成的整数。谢谢,这帮了大忙。将它们合并为一个INT16的好方法是什么。我想用c=(b你的想法是对的,但是你应该把所有字节和双字节值都当作无符号的。我不确定你的代码是什么样子的,但是你可以从把字节读成
无符号字符而不是
字符开始,或者你可以先转换成无符号字符,或者转换成无符号字符,然后把剩下的符号扩展位归零,比如:
unsigned short c=(static_cast(b)非常感谢,效果非常好!现在我得到的值与MATLAB提供的值完全相同。或者您可以将指向数据内存的字符指针重新解释为
int16_t*pixels=reinterpret_cast(字符指针);
(或者对未签名的数据使用
uint16\u t
,但如果我了解标题信息,您就已经签名了数据)。然后
int16\u t pixel=pixels[256*y+x];
。这只在主机平台和数据具有相同的尾数时起作用,否则您必须交换字节以获得正确的值,或者执行您的
((a))