執行個體1: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 filename = "1066244_20110617_CT_102_215_001.dcm" ;
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檔案放在工程目錄下:
可見讀取的為單通道的512*512像素大小的圖像:
本例程配套素材見源碼整理文章下載下傳(點選進入)