AvPai Ответов: 1

Как перезаписать изображение в файле данных 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

Так что же вы предлагаете? Как перезаписать пиксельные данные?

1 Ответов

Рейтинг:
0

KarstenK

Во-первых: писать новый файл, в лучшем случае с именем с patren "файл %%_"формат".БМП". Это лучшая практика, потому что вы не перезаписываете свои входные данные для последующего использования.

На втором этапе для записи преобразованных данных необходимо пересчитать данные заголовка и записать их в правильном формате.

Для более глубокого понимания трансформации изображения и других необходимых деталей я советую выдающийся Cximage статья и Образцы OpenCV.

Совет: если вы пишете файлы, используйте всегда полный путь и не только имя файла.


AvPai

Какие теги данных заголовка я должен пересчитать?