Как перезаписать изображение в файле данных dicom другим файлом в формате bmp
Привет,
Я пытаюсь перезаписать пиксельные данные набора данных изображений dicom и заменить их другим серым изображением в формате bmp.Я хочу, чтобы все остальные теги оставались такими же.
Я попробовал два метода:-
Способ 1-
Я успешно скопировал изображение в новый файл dicom, но не теги. Код, который я использовал, таков :
OFString pixDataFile, outputFile, tempStr; // Main class for controlling conversion Image2Dcm i2d; // Output plugin to use (ie. SOP class to write) I2DOutputPlug *outPlug = NULL; // Input plugin to use (ie. file format to read) I2DImgSource *inputPlug = NULL; // Group length encoding mode for output DICOM file E_GrpLenEncoding grpLengthEnc = EGL_recalcGL; // Item and Sequence encoding mode for output DICOM file E_EncodingType lengthEnc = EET_ExplicitLength; // Padding mode for output DICOM file E_PaddingEncoding padEnc = EPD_noChange; // File pad length for output DICOM file OFCmdUnsignedInt filepad = 0; // Item pad length for output DICOM file OFCmdUnsignedInt itempad = 0; // Write only pure dataset, i.e. without meta header E_FileWriteMode writeMode = EWM_dataset; // Override keys are applied at the very end of the conversion "pipeline" OFList<OFString> overrideKeys; // The transfersytanx proposed to be written by output plugin E_TransferSyntax writeXfer; pixDataFile = in; outputFile = "pai.dcm"; inputPlug = new I2DBmpSource(); outPlug = new I2DOutputPlugSC(); grpLengthEnc = EGL_recalcGL; lengthEnc = EET_ExplicitLength; /*OFCmdUnsignedInt opt_filepad; OFCmdUnsignedInt opt_itempad; itempad = opt_itempad; filepad = opt_filepad;*/ I2DImgSource *bmpSource = OFstatic_cast(I2DImgSource*, inputPlug); inputPlug->setImageFile(pixDataFile); OFCondition result = i2d.convert(inputPlug, outPlug, dataset, writeXfer); // Saving output DICOM image if (result.good()) { DcmFileFormat dcmff(dataset); result = dcmff.saveFile(outputFile.c_str(), writeXfer, lengthEnc, grpLengthEnc, padEnc, filepad, itempad, writeMode); } // Cleanup and return outPlug = NULL; inputPlug = NULL; dataset = NULL;
Здесь вход и выход показывают входные и выходные изображения
Способ 2 :-
Я успешно скопировал все теги в новое изображение dicom, но не смог заменить пиксельные данные. Я хотел бы знать, как извлечь пиксельные данные изображения в оттенках серого в openCV в формате, который я мог бы использовать для этого :-
dataset_dst = dst_fileformat.getDataset(); // Use DcmDataset's assignment operator to copy the complete dataset *dataset_dst = *dataset_src;///1st one is the dataset of the new dicom while the secon one is the dataset of the source dicom dataset_dst->putAndInsertUint8Array(DCM_PixelData, pixeldata);//how to get pixeldata from bmp grayscale?? dst_fileformat.saveFile("new.dcm");
Это последнее, что я пробовал:-
dataset_dst = dst_fileformat.getDataset(); *dataset_dst = *dataset_src;// dataset_src is the dataset of the original dicom file Mat input= imread("image.bmp"); Uint16 * pixel; const unsigned long size = input.size().height* input.size().width ; pixel = ( Uint16 *)malloc(size); for (int i = 0; i < input.rows; i++) { for (int j = 0; j < input.cols; j++) { *pixel = (Uint16)input.at<uchar>(i, j); cout << *pixel; } } dataset_dst->putAndInsertUint16Array(DCM_PixelData, pixel,size, true);/// line for replacement dst_fileformat.saveFile("new.dcm");
Но, как и предупреждал меня @KarstenK, я получаю мусорные данные. Как и какие изменения я должен внести в заголовок и метаданные, чтобы получить правильное изображение?
Что я уже пробовал:
Все методы, которые я пробовал, показаны выше. Пожалуйста, загляните в него и помогите
KarstenK
Это не очень хорошая идея. Данные заголовка и расширение файла используются для идентификации типа данных. Если ваши биты неверно истолкованы вы зарабатываете мусор вместо картинки :-(
AvPai
Так что же вы предлагаете? Как перезаписать пиксельные данные?