实例3:opencv批量读取指定路径DCM图像并显示
#include <iostream>
#include <io.h> // 当中含有_finddata_t
#include <string>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>
#include <vtkImageCast.h>
#include <vtkDICOMImageReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkImageData.h>
#include <vtkCoordinate.h>
using namespace std;
using namespace cv;
// 读入一个CT图,返回它的像素矩阵,使用OpenCV的Mat类型返回
// VTK读取DICOM图像并将像素值转给OpenCV的Mat对象
void dicomread(string inputFilename, Mat &img,vtkSmartPointer<vtkDICOMImageReader> &reader)
{
img.create(512,512,CV_32SC1);
vtkSmartPointer<vtkImageCast> imageCast =
vtkSmartPointer<vtkImageCast>::New();
reader->SetFileName(inputFilename.c_str());
reader->Update();
imageCast->SetInputConnection(reader->GetOutputPort());
imageCast->SetOutputScalarTypeToInt();
imageCast->Update();
// 图像的基本信息
int dims[3];
reader->GetOutput()->GetDimensions(dims);
//图像的像素值
for(int k=0;k<dims[2];k++)
{
for(int j=0;j<dims[1];j++)
{
for(int i=0;i<dims[0];i++)
{
//转换数据类型,使用imagecast转到double(或float)
int* pixel =
(int*)(imageCast->GetOutput()->GetScalarPointer(i,j,k)); // 第i列第j行的像素值
img.at<int>(j,i) = int(*pixel); // 第j行第i列的像素值
}
}
}
}
//可视化DICOM图像
void showdicom(Mat I)
{
double maxx=0,minn=0;
double *max = &maxx;
double *min = &minn;
I.convertTo(I,CV_64FC1);
minMaxIdx(I,min,max);
for(int i=0;i<I.rows;i++)
{
for(int j=0;j<I.cols;j++)
{
I.at<double>(i,j) = 255*(I.at<double>(i,j)-minn)*1/(maxx-minn);
}
}
minMaxIdx(I,min,max);
for(int i=0;i<I.rows;i++)
{
for(int j=0;j<I.cols;j++)
I.at<double>(i,j) = (I.at<double>(i,j)-minn)*1/(maxx-minn);
}
//cout << I <<endl; //I为图像的像素值
imshow("DICOM Image",I);
waitKey(0);//等待键盘输入,程序继续运行
}
int main()
{
//要读取的CT数据文件名
string vc[8] =
{
"1066244_20110617_CT_102_215_001.dcm" ,
"1066244_20110617_CT_102_215_011.dcm" ,
"1066244_20110617_CT_102_215_021.dcm" ,
"1066244_20110617_CT_102_215_031.dcm" ,
"1066244_20110617_CT_102_215_041.dcm" ,
"1066244_20110617_CT_102_215_051.dcm" ,
"1066244_20110617_CT_102_215_061.dcm" ,
"1066244_20110617_CT_102_215_071.dcm" ,
};
int i = 0;
for (int j = 0;j < 8;j++) {
//指定要读取的CT数据文件位置
string filename = "F:\\Software\\VTK8.2.0\\vtk1\\helloVtk\\CT\\" + vc[i];//quarter CT000895 1066244_20110617_CT_102_215_001
i++;
Mat I1;//I1为原图,G1为转化图
vtkSmartPointer<vtkDICOMImageReader> reader =
vtkSmartPointer<vtkDICOMImageReader>::New();
// 读入dicom图
dicomread(filename, I1, reader);
//翻转图像
flip(I1, I1, 0);
//显示得到的Mat对象I1的信息*(单通道 大小512*512)
cout << I1.channels() << " " << I1.size() << endl;
showdicom(I1);
}
}
读取DCM图像路径:
每按下空格,进行下一张图像读取和显示: