DCMTK读取dcm图片+opencv显示图片

读取DCM格式图片中的一些基本信息

DcmFileFormat是最基本的文件对象

OFCondition是每一次操作的返回值,用来判断操作是否成功

所有的数据都存在DcmDataSet对象中,用getDataSet方法得到

void LoadDcmFile()
{
    std::string file_path = "IM00001";	//dcm文件

	DcmFileFormat fileformat;
	OFCondition oc = fileformat.loadFile(file_path.c_str());	//读取Dicom图像
	if (!oc.good())		//判断Dicom文件是否读取成功
	{
		std::cout << "file Load error" << std::endl;
		return;
	}
	DcmDataset *dataset = fileformat.getDataset();	//得到Dicom的数据集,所有的数据都存储在数据集当中
	E_TransferSyntax xfer = dataset->getOriginalXfer();	//得到传输语法

	OFString patientname;
	dataset->findAndGetOFString(DCM_PatientName, patientname);	//获取病人姓名     //dataset->findAndGetOFString/->findAndGetUint16
	cout << "patientName :" << patientname << endl;

	unsigned short bit_count(0);
	dataset->findAndGetUint16(DCM_BitsStored, bit_count);	//获取像素的位数 bit
	cout << "bit_count :" << bit_count << endl;

	OFString isRGB;
	dataset->findAndGetOFString(DCM_PhotometricInterpretation, isRGB);//DCM图片的图像模式
	cout << "isrgb :" << isRGB << endl;

	unsigned short img_bits(0);
	dataset->findAndGetUint16(DCM_SamplesPerPixel, img_bits);	//单个像素占用多少byte
	cout << "img_bits :" << img_bits << endl;
	//DicomImage* img_xfer = new DicomImage(xfer, 0, 0, 1);		//由传输语法得到图像的帧

	unsigned short m_width;		//获取图像的窗宽高
	unsigned short m_height;
	dataset->findAndGetUint16(DCM_Rows, m_height);
	dataset->findAndGetUint16(DCM_Columns, m_width);
	cout << "width :" << m_width << endl;
	cout << "height " << m_height << endl;

        unsigned short center, width;  //获取源图像中的窗位和窗宽
	dataset->findAndGetUint16(DCM_WindowCenter, center);
	dataset->findAndGetUint16(DCM_WindowWidth, width);
    
        DcmElement* element = NULL;    //读取dcm中的像素值
	OFCondition result = dataset->findAndGetElement(DCM_PixelData, element);
	if (result.bad() || element == NULL)
}

 

使用Dcmtk读取dcm图片并且使用opencv显示,这边读取方式和上面有一些区别,上面用的是DcmFileFormat,这边用的是DicomImage,其中设置窗宽和窗位的步骤是十分必要的,否则会出现图像一片黑的情况。

void LoadDcmFile4()
{
	DicomImage *img = new DicomImage("E:\\CT\\ST00001\\SE00001\\IM00020");
	int nWidth = img->getWidth();			//获得图像宽度
	int nHeight = img->getHeight();			//获得图像高度
	img->setWindow(100, 400);  //肝脏一般取窗宽为450HU,窗位为45HU,这边的窗宽和窗位要自己设定
	Uint16 *pixelData = (Uint16*)(img->getOutputData(16));
	std::cout << nWidth << ", " << nHeight << std::endl;
	if (pixelData != NULL)
	{
		//cv::Mat dst2(nWidth, nHeight, CV_16UC1, cv::Scalar::all(0));
		//unsigned short* data = nullptr;
		//for (int i = 0; i < nHeight; i++)
		//{
		//	data = dst2.ptr<unsigned short>(i);	//取得每一行的头指针 也可使用dst2.at<unsigned short>(i, j)
		//	for (int j = 0; j < nWidth; j++)
		//	{
		//		*data++ = pixelData[i*nWidth + j];
		//		 //cout << *data << " ";
		//		//cout << dst2.at<unsigned short>(i, j) << " ";
		//	}
		//}
		Mat dst(nWidth, nHeight, CV_16UC1, pixelData);
		cv::imshow("image2", dst);
		cv::waitKey(0);
	}
}

 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这个功能可以通过以下步骤实现: 1. 导入OpenCVDCMTK库,确保项目中已经包含了这些库文件。 2. 读取DICOM图像,使用DCMTK库中的dcmimgle库来实现。 3. 在OpenCV中创建一个窗口,将DICOM图像显示在窗口中。 4. 实现鼠标事件处理函数,可以通过OpenCV的setMouseCallback函数来实现。当鼠标左键按下时,记录下当前鼠标位置,当鼠标左键松开时,记录下当前鼠标位置,并在图像上画出圆形。 5. 在窗口中显示画出的圆形。 下面是代码示例: ```c++ #include <iostream> #include <dcmimgle/dcmimage.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; // 定义全局变量 Mat img; vector<Point> points; // 存储鼠标点击的位置 // 鼠标事件处理函数 void onMouse(int event, int x, int y, int flags, void* param) { if (event == EVENT_LBUTTONDOWN) // 鼠标左键按下 { Point pt(x, y); points.push_back(pt); } else if (event == EVENT_LBUTTONUP) // 鼠标左键松开 { Point pt(x, y); points.push_back(pt); // 在图像上绘制圆形 circle(img, points[points.size()-2], norm(points[points.size()-1]-points[points.size()-2]), Scalar(0, 255, 0), 2); // 显示画出的圆形 imshow("DICOM Image", img); } } int main() { // 读取DICOM图像 DicomImage* dcm = new DicomImage("test.dcm"); if (dcm != NULL && dcm->getStatus() == EIS_Normal) { Uint8* pixelData = (Uint8*)dcm->getOutputData(8); // 获取像素数据 int rows = dcm->getHeight(); // 图像高度 int cols = dcm->getWidth(); // 图像宽度 // 创建Mat对象 img = Mat(rows, cols, CV_8UC1, pixelData); // 转换为彩色图像 cvtColor(img, img, COLOR_GRAY2RGB); // 创建窗口并显示图像 namedWindow("DICOM Image", WINDOW_NORMAL); imshow("DICOM Image", img); // 设置鼠标事件处理函数 setMouseCallback("DICOM Image", onMouse, 0); waitKey(); } return 0; } ``` 在这个示例代码中,我们首先使用DCMTK库中的dcmimgle库来读取DICOM图像,并将其转换为OpenCV中的Mat对象,然后创建一个窗口来显示图像。接着,我们使用setMouseCallback函数来设置鼠标事件处理函数,当鼠标左键按下时,记录下当前鼠标位置,当鼠标左键松开时,记录下当前鼠标位置,并在图像上画出圆形。最后,在窗口中显示画出的圆形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山渺渺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值