【3】医学图像——读取和显示.his文件
1.offset.his、pxlMask.his、Gain.his
Offset.his图像数据类型是16bitunsignedinteger:int16
Gain.his图像数据类型32bit,unsigned integer:int32
.his文件的头是100字节,图像大小:1024*1024,软件amide
2.图像文件大小计算:
a) Offset.his、PxlMask.his:16 bit unsigned integer:2个字节(Byte)
1024*1024*2+100=2097252字节(Byte)
2097252/1024=2048.09765625KB
b) Gain.his:32bit unsigned integer:4个字节(Byte)
1024*1024*4+100=4194404字节(Byte)
4194404/1024=4096.09765625KB
备注:1024字节=1KB
3.实际图像
说明:Offset.his、bright.his、gain.his的图像灰度值都不是整体灰度值是一致的
1)offset.his
针对1024*1024的PE平板,采集offset图像都是可以满足灰度值在4000左右要求
2)bright.his:针对1024*1024的PE平板,采集bright图像都是可以满足2万-3万要求
3)gain.his:
针对1024*1024的PE平板,采用offset.his和bright.his合并成gain.his图像的灰度值大多数在6万以上
4)pxlMask.his: 用xis打开文件时,背景值为0,坏点坏线值为65535
4.读取和显示图像(opencv/c++)
Mat His16toMat8(string ImagePath)
{
const char* ImageStr = ImagePath.c_str();//文件路径
int fd = open(ImageStr, O_RDONLY);//O_RDONLY 只读模式--打开文件
int data_numb = 1024 * 1024 * sizeof(unsigned short);
char* src = new char[data_numb];
//,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数
//SEEK_SET 从距文件开头offset 位移量为新的读写位置.
//文件跳过1024个字节,文件的读写位置从1024开始
lseek(fd, 100, SEEK_SET);//参数 whence 为SEEK_SET时, 参数offset 即为新的读写位置.
//开始读取文件内容
//read系统调用从文件描述符fd指向的文件中,读取count个字节到buf中。
//ssize_t read(int fd, void *buf, size_t count);
read(fd, src, data_numb);
//构造16位的mat图像---16位图像用
Mat mat(1024, 1024, CV_16U, src);
//转为为16位图像
Mat src16;
mat.convertTo(src16, CV_16U);
//16bit unsigned integer:int16 无符号整数 CV_16U - 16位无符号整数(0..65535)
//以上步骤可以省略
imshow("1", src16);
//16位转到0-1之间(即:归一化)
Mat dst;
mat.convertTo(dst, CV_64FC1, 1 / 65535.0);//其中dst为目标图, CV_32FC3为要转化的类型
waitKey();//如果没有此句,图像会加载出来成为灰色的,一直转圈圈
return dst8;
}
int main(int argc, char* argv[])
{
string datPath = "F:\\Work In Progress\\Test.his";
Mat src = His16toMat8(datPath);
char saveDst[20];
sprintf(saveDst, "F:\\Work In Progress\\Test_New %d.png", 1);
imwrite(saveDst, src);
system("pause");
return 0;
}
5.读取和显示图像(matlab)