2010-04-12 3 views

ответ

22

Чтобы преобразовать grayscale image к RGB image, есть два вопроса, вы должны решить:

  • Grayscale images являются 2-D, в то время как RGB images являются 3-D, поэтому вы должны скопировать данные черно-белое изображение три и объединить три копии по третьему измерению.
  • Данные изображения могут храниться во многих разных data types, поэтому вам необходимо их соответствующим образом преобразовать. При сохранении в виде типа данных 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 ГРА yscale изображения в 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]); 
    
+0

Я только что сделал тест, кажется, что 'double (grayImage)' такой же, как 'grayImage'? И'./'И'. * 'Делить и работать с продуктами в MATLAB? Кажется '. /' То же самое, что '/'? – user198729

+0

@ user198729: Операторы '. /' И '. *' Обозначают * element-wise * деление и умножение, так что каждый элемент матрицы изображения делится или умножается на 255. Вы можете проверить класс (т. Е. Тип данных) матрицы, набрав 'class (grayImage)'. Хотя «double (grayImage)» и «grayImage» могут * отображаться * одинаковыми, каждый из них может быть другим классом (таким образом, чтобы они сохраняли свои значения по-разному). – gnovice

+0

Я пробовал различные операции, но '/' и '. /' Никогда не давал другой результат ... И поскольку 'double (grayImage)' такой же, как 'grayImage',' double (grayImage) ./ 255' также так же, как 'grayImage./255'. Так вы можете привести два примера, демонстрирующих, почему нужны'./'и' double'? – user198729

2

По определению изображение 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-канальную матрицу.

+0

Я подумал, что, по определению, максимальное значение 'rgbImage' является' 1', который обозначает 'white', но это, кажется, не так? – user198729

+0

Не совсем, это зависит от вашего использования изображения. – Jacob

Смежные вопросы