Как преобразовать матрицу оттенков серого в матрицу RGB в MATLAB?

from __future__ import division
import random
from collections import Counter


def num_gen(num_probs):
    # calculate minimum probability to normalize
    min_prob = min(prob for num, prob in num_probs)
    lst = []
    for num, prob in num_probs:
        # keep appending num to lst, proportional to its probability in the distribution
        for _ in range(int(prob/min_prob)):
            lst.append(num)
    # all elems in lst occur proportional to their distribution probablities
    while True:
        # pick a random index from lst
        ind = random.randint(0, len(lst)-1)
        yield lst[ind]

Проверка:

gen = num_gen([(1, 0.1),
               (2, 0.05),
               (3, 0.05),
               (4, 0.2),
               (5, 0.4),
               (6, 0.2)])
lst = []
times = 10000
for _ in range(times):
    lst.append(next(gen))
# Verify the created distribution:
for item, count in Counter(lst).iteritems():
    print '%d has %f probability' % (item, count/times)

1 has 0.099737 probability
2 has 0.050022 probability
3 has 0.049996 probability 
4 has 0.200154 probability
5 has 0.399791 probability
6 has 0.200300 probability
10
задан Amro 29 July 2012 в 22:44
поделиться

2 ответа

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

  • Изображения в оттенках серого являются двухмерными, а ] Изображения RGB являются трехмерными, поэтому вам необходимо трижды реплицировать данные изображения в градациях серого и объединить три копии по третьему измерению.
  • Данные изображения могут храниться во многих различных типах данных , поэтому вам необходимо преобразовать их соответствующим образом. При сохранении как типа данных 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]); 
     
23
ответ дан 3 December 2019 в 16:29
поделиться

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

2
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: