Повернуть необработанные пиксельные данные изображения на 180 градусов

Я пытаюсь повернуть необработанные данные пикселей из файла DICOM на 180 градусов (или перевернуть). Однако я успешно перевернул изображение после записи пиксельных данных обратно в файл (в данном случае это файл DICOM) и его отображения. Окончательный вывод изображения неверен.

Ниже приведен образец изображения, которое я пытаюсь перевернуть на 180 / зеркало.

введите описание изображения здесь

Вот код, который я использую для переворачивания:

        string file = @"adicomfile.dcm";
        DicomFile df = new DicomFile();
        df.Load(file);

            // Get the amount of bits per pixel from the DICOM header.
        int bitsPerPixel = df.DataSet[DicomTags.BitsAllocated].GetInt32(0, 0);

            // Get the raw pixel data from the DICOM file.
        byte[] bytes = df.DataSet[DicomTags.PixelData].Values as byte[];

                    // Get the width and height of the image.
        int width = df.DataSet[DicomTags.Columns].GetInt32(0, 0);
        int height = df.DataSet[DicomTags.Rows].GetInt32(0, 0);

        byte[] original = bytes;
        byte[] mirroredPixels = new byte[width * height * (bitsPerPixel / 8)];

        width *= (bitsPerPixel / 8);

                    // The mirroring / image flipping.
        for (int i = 0; i < original.Length; i++)
        {
            int mod = i % width;
            int x = ((width - mod - 1) + i) - mod;

            mirroredPixels[i] = original[x];
        }

        df.DataSet[DicomTags.PixelData].Values = mirroredPixels;

        df.Save(@"flippedicom.dcm", DicomWriteOptions.Default);

И вот мой вывод (неверный). Белый цвет и искажения не являются желаемым результатом.

введите описание изображения здесь

Я использую библиотеку ClearCanvas DICOM, однако это не имеет значения, поскольку я пытаюсь манипулировать необработанными данными пикселей, содержащимися в самом файле.

Желательно, чтобы результат был похож на оригинал, но перевернут на 180 / зеркально.

Некоторая помощь будет принята с благодарностью. Я старался изо всех сил искать ТАК, но безрезультатно.


person Joshua H    schedule 01.05.2014    source источник
comment
Возьмите небольшое изображение в качестве теста, чтобы увидеть, какие байты он перемещает на самом деле   -  person csharpwinphonexaml    schedule 01.05.2014
comment
Тот факт, что ваше изображение имеет правильную форму и правильные элементы в нужных местах, говорит мне, что ваша математика верна, вы перемещаете пиксели из нужного места в нужное место. Поэтому я должен подозревать, что вы перемещаете не все пиксели - возможно, вы перемещаете только красный, зеленый или синий канал, если цветное изображение, или, может быть, вы не маскируете прозрачность должным образом и не добавляете ее обратно. Я говорю о вашем maths дает вам правильные местоположения, но вы либо не берете весь пиксель из оригинала, либо не записываете весь пиксель обратно в перевернутое изображение.   -  person Mark Setchell    schedule 01.05.2014
comment
Каково значение bitsPerPixel (и какова фотометрическая интерпретация изображения)? Если он больше 8, вам понадобится массив int вместо массива байтов.   -  person Chris O    schedule 01.05.2014


Ответы (1)


Это заняло некоторое время, но в итоге я решил свою проблему с помощью метода из библиотеки Java. Вы можете увидеть класс здесь.

string file = @"adicomfile.dcm";
DicomFile df = new DicomFile();
df.Load(file);

// Get the amount of bits per pixel from the DICOM header.
int bitsPerPixel = df.DataSet[DicomTags.BitsAllocated].GetInt32(0, 0);

// Get the raw pixel data from the DICOM file.
byte[] bytes = df.DataSet[DicomTags.PixelData].Values as byte[];

// Get the width and height of the image.
int width = df.DataSet[DicomTags.Columns].GetInt32(0, 0);
int height = df.DataSet[DicomTags.Rows].GetInt32(0, 0);

byte[] newBytes = new byte[height * width * (bitsPerPixel / 8)];
int stride = bitsPerPixel / 8;

for (int y = 0; y < height; y++)
{
      for (int x = 0; x < width * stride; x++)
      {
        newBytes[((height - y - 1) * (width * stride)) + x] = bytes[(y * (width * stride)) + x];
    }
}

// Set patient orientation.
df.DataSet[DicomTags.PatientOrientation].Values = @"A\L";

// The pixel data of the DICOM file to the flipped/mirrored data.
df.DataSet[DicomTags.PixelData].Values = mirroredPixels;

// Save the DICOM file.
df.Save(@"flippedicom.dcm", DicomWriteOptions.Default);

Результат был правильным, и я смог продолжить другие модификации необработанных данных пикселей.

Всем спасибо за указатели.

person Joshua H    schedule 05.05.2014