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
Чтобы преобразовать изображение в оттенках серого в изображение 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]);
По определению, 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, вам необходимо преобразовать одноканальную матрицу в трехканальную матрицу.