Я хочу применить шум к объему, который изображен с помощью трехмерного массива - PullRequest
0 голосов
/ 17 октября 2018

У меня есть полутоновый том, который содержит интересующий вас объект.Я могу импортировать его в python в виде трехмерного массива с поплавками от -1 до 1.

У меня две проблемы:

  1. на самом деле отрицательные числа с плавающей точкой не должнысуществует, однако я не уверен, как заменить каждый отрицательный с плавающей точкой случайным положительным с плавающей точкой.Методы, которые я использовал для замены массива в прошлом, применяют одно и то же правило ко всем числам ниже 0. Любая помощь с этим будет очень признательна.Я попробовал следующую строку, но очевидно, что все они заканчиваются заменой одного случайного числа:

    numpyarray[numpyarray < 0] = random.uniform(0,1)
    
  2. Я хочу применить шум ко всему изображению.Я хочу сделать это таким образом, чтобы я мог применять шум столько раз, сколько захочу, и каждый раз он будет случайным.Я также хочу сохранить объект, то есть вещи вне объекта должны стать более шумными, чем сам объект, но оба должны стать более шумными, чем исходный объем.Объект имеет тенденцию иметь самые высокие положительные числа с плавающей точкой, однако это не означает, что случайный воксель в шуме не может иметь значение в том же диапазоне, но это нормально.

У меня есть функция для создания случайного массива шума правильного размера (100x100x100):

def RandomNoise():
    NoiseArray = np.random.uniform(0,high=1,size=(100,100,100))

    return NoiseArray

И тогда я могу просто умножить свой объем на этомассив, однако он не делает хорошую работу по поддержанию объекта интереса.

Мне интересно, смогу ли я разработать кривую, и в зависимости от того, где интенсивность находится на кривой, будет определяться, как будет реализован шум, но я изо всех сил пытаюсь представить, как это все будет работать.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 17 октября 2018

Чтобы заменить отрицательные значения случайными значениями, существует один простой способ:

numpyarray = np.where(numpyarray < 0, np.random.uniform(0, 1, size=numpyarray.shape), numpyarray)

Однако это приведет к созданию множества случайных значений, которые не будут использоваться.Если вы хотите сохранить эту работу, вы можете сделать:

m = numpyarray < 0
numpyarray[m] = np.random.uniform(0, 1, size=np.count_nonzero(m))

Что касается шума, вы можете масштабировать его, но функцию в зависимости от интенсивности.Например,

numpyarray_noise = np.clip(numpyarray + RandomNoise() * (1 - numpyarray), 0, 1)

Использование (1 - numpyarray) сделает шум меньше, чем выше интенсивность звука.Вы также можете использовать (1 - numpyarray) ** k с некоторыми k > 0, или что-то экспоненциальное, например np.exp(1 - 1 / (1 - numpyarray + eps)).Вы также можете иметь какое-то правило, например «применить 10% шума и масштабировать остальные 90% в зависимости от интенсивности».

...