Как преобразовать матрицу оттенков серого в матрицу RGB в MATLAB?
rgbImage = grayImage / max(max(grayImage));
или
rgbImage = grayImage / 255;
что из вышеперечисленного правильно, и причина?
2 ответов
преобразование изображение в оттенках серого до RGB-изображение, есть два вопроса, которые вы должны решить:
- оттенки серого изображения являются 2-D, в то время как изображения RGB являются 3-D, поэтому вам нужно трижды повторить данные изображения в оттенках серого и объединить три копии вдоль третьего измерения.
- данные изображения могут храниться во многих различных типы данных, так что вы должны преобразовать их соответственно. При хранении в
doubleтип данных, значения пикселей изображения должны быть числами с плавающей запятой в диапазоне от 0 до 1. При хранении вuint8тип данных, значения пикселей изображения должны быть целыми числами в диапазоне от 0 до 255. Вы можете проверить тип данных матрицы изображений с помощью функцииclass.
вот 3 типичных условия, с которыми вы можете столкнуться:
-
для преобразования a
uint8илиdoubleизображение в оттенках серого в RGB изображение один и тот же тип данных, вы можете использовать функцииrepmatилиcat:rgbImage = repmat(grayImage,[1 1 3]); rgbImage = cat(3,grayImage,grayImage,grayImage); -
преобразование
uint8изображение в оттенках серого доdoubleRGB-изображение, вы должны преобразовать вdoubleсначала, затем масштабировать на 255:rgbImage = repmat(double(grayImage)./255,[1 1 3]); -
для преобразования a
doubleизображение в оттенках серого доuint8RGB изображение, вы должны сначала масштабировать на 255, а затем преобразовать вuint8:rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);
по определению, изображение RGB имеет 3 канала, что означает, что вам нужна трехмерная матрица для представления изображения. Итак, правильный ответ:
rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);
будьте осторожны при нормировании grayImage. Если grayImage is uint8 тогда вы потеряете некоторую точность в 255*grayImage/max(grayImage(:)) операции.
кроме того, нормализация grayImage зависит от данных. В вашем вопросе вы использовали два метода:
rgbImage = grayImage / max(max(grayImage));
который нормализует изображение в оттенках серого, чтобы максимальное значение в изображении 1 и
rgbImage = grayImage / 255;
что имеет смысл только если значения в grayImage ложь в