Как преобразовать матрицу оттенков серого в матрицу RGB в MATLAB? - PullRequest
10 голосов
/ 12 апреля 2010
rgbImage = grayImage / max(max(grayImage));

или

rgbImage = grayImage / 255;

Что из перечисленного верно и причина?

Ответы [ 2 ]

23 голосов
/ 12 апреля 2010

Чтобы преобразовать изображение в градациях серого в RGB-изображение , необходимо решить две проблемы:

  • Изображения в градациях серого являются 2-мерными, в то время как Изображения RGB являются 3-х мерными, поэтому вам необходимо трижды скопировать данные изображения в градациях серого и объединить три копии в третьем измерении .
  • Данные изображения могут храниться во множестве типов данных , поэтому их необходимо преобразовать соответствующим образом. При сохранении в качестве типа данных double значения пикселей изображения должны быть числами с плавающей запятой в диапазоне от 0 до 1. При сохранении в качестве типа данных uint8 Значения пикселей изображения должны быть целыми числами в диапазоне от 0 до 255. Вы можете проверить тип данных матрицы изображения, используя функцию class.

Вот 3 типичных условия, с которыми вы можете столкнуться:

  • Для преобразования uint8 или double изображения в оттенках серого в RGB-изображение того же типа данных , вы можете использовать функции repmat или cat:

    rgbImage = repmat(grayImage,[1 1 3]);
    rgbImage = cat(3,grayImage,grayImage,grayImage);
    
  • Чтобы преобразовать изображение в оттенках серого uint8 в double RGB-изображение, сначала необходимо преобразовать его в double, а затем масштаб по 255:

    rgbImage = repmat(double(grayImage)./255,[1 1 3]);
    
  • Чтобы преобразовать изображение в градациях серого double в uint8 RGB-изображение, сначала следует увеличить его до 255, а затем преобразовать в uint8

    rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);
    
2 голосов
/ 12 апреля 2010

По определению, RGB-изображение имеет 3 канала, что означает, что вам нужна трехмерная матрица для представления изображения. Итак, правильный ответ:

rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);

Будьте осторожны при нормализации grayImage. Если grayImage равно uint8, то вы потеряете некоторую точность в операции 255*grayImage/max(grayImage(:)).

Кроме того, нормализация grayImage зависит от данных. В своем вопросе вы использовали два метода:

rgbImage = grayImage / max(max(grayImage));

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

rgbImage = grayImage / 255;

, который имеет смысл, только если значения в grayImage лежат в диапазоне 0-255.

Так что это действительно зависит от того, что вы хотите сделать. Но если вам нужно изображение RGB, вам нужно преобразовать одноканальную матрицу в 3-канальную матрицу.

...