Случайные значения +/- 10 от предоставленного x, которые не будут превышать глобальный диапазон 0-255 - PullRequest
1 голос
/ 27 мая 2020

Я нашел похожие, но не подходящие ответы на свой вопрос. Мне нужно добавить шум в полученные значения RGB, но значения не могут превышать 255 или быть ниже 0.

У меня есть следующий пример:

red,green,blue = (253, 4, 130)

print(
    (np.random.randint(red-10,red+10),
     np.random.randint(green-10,green+10),
     np.random.randint(blue-10,blue+10)))

# output values cannot be over 255 or under 0

#The following output would not be ok.
>>>(257, -2, 132)

Как я могу сгенерировать случайный + / - 10 значение из любой точки в диапазоне 0-255, которое не превышает 255 или 0?

Ответы [ 3 ]

0 голосов
/ 27 мая 2020

Чтобы оставаться в пределах границ, было бы более элегантно использовать функции min() и max() вместо операторов if/else.

np.random.randint(max(x-10, 0), min(x+10, 255))

Таким образом, ваш код можно изменить на

def mutate_color(x):
    return np.random.randint(max(x-10, 0), min(x+10, 255))

red,green,blue = (253, 4, 130)

print(
    mutate_color(red),
    mutate_color(green),
    mutate_color(blue)
)
0 голосов
/ 27 мая 2020

Вы можете либо сначала вычислить случайное значение, а затем ограничить его до желаемого диапазона [0, 255], либо вы можете сначала ограничить случайный диапазон.

Вычислить случайное значение, а затем зафиксировать

def clamp(value, minValue, maxValue):
    """Returns `value` clamped to the range [minValue, maxValue]."""
    return max(minValue, min(value, maxValue))

clamp(np.random.randint(red - 10, red + 10))

Ограничить случайный диапазон

np.random.randint(max(0, red - 10), min(255, red + 10))

Обратите внимание, что распределение значений будет другим. В первой версии значение, изначально равное 5, можно было изменить на значение в диапазоне [-5, 15], которое будет обрезано до [0, 15]. Поскольку все значения в диапазоне [-5, 0] будут сопоставлены с 0, вероятность того, что новое значение будет равно 0, будет выше (6 из 21).

При втором подходе случайный диапазон сам настраивается. Значение, изначально равное 5, с равной вероятностью будет изменено на любое значение в диапазоне [0, 15].

Вам придется выбирать, исходя из того, что вы хотите.

0 голосов
/ 27 мая 2020

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

Код:

import numpy as np

red,green,blue = (253, 4, 130)

def rand_within_rgb(inp, thres):
    if np.random.randint(inp - thres, inp + thres) > 255:
        return 255
    elif np.random.randint(inp - thres, inp + thres) < 0:
        return 0
    else:
        return np.random.randint(inp - thres, inp + thres)

print((rand_within_rgb(red, 10), 
       rand_within_rgb(green, 10), 
       rand_within_rgb(blue, 10)))

Вывод:

(253, 0, 127)

Если вам не нравится вырезка, сделанная выше, вы можете попробовать изменить функцию на то, что указано ниже, что также даст желаемый вами результат.

def rand_within_rgb(inp, thres):
    if inp + thres > 255:
        return np.random.randint(inp - thres, 255)
    elif inp - thres < 0:
        return np.random.randint(0, inp + thres)
    else:
        return np.random.randint(inp - thres, inp + thres)
...