Как я могу применить размытие по Гауссу к фигуре в `matplotlib`? - PullRequest
0 голосов
/ 14 мая 2019

Как применить гауссово размытие к фигуре в matplotlib?

Чтобы быть более точным, у меня на рисунке matplotlib изображено следующее изображение:

enter image description here

Который был произведен со следующим кодом:

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter


x = np.linspace(0, 3*np.pi, 100)
ys = []
for i in range(20):
    ys.append(np.sin(x) + (np.random.rand(100)-0.5)*np.random.rand())

new_y = ys[0]
new_x = x
for i in range(1, 20):
    new_x = np.concatenate([new_x, x])
    new_y = np.concatenate([new_y, ys[i]])

fig, ax = plt.subplots()
ax.hist2d(new_x, new_y, bins=50, cmap='inferno')
plt.show()

Как можно нарисовать размытую по Гауссу версию этого изображения? Любая помощь будет оценена.


Что я пробовал:

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

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter


x = np.linspace(0, 3*np.pi, 100)
ys = []
for i in range(20):
    ys.append(np.sin(x) + (np.random.rand(100)-0.5)*np.random.rand())

new_y = ys[0]
new_x = x
for i in range(1, 20):
    new_x = np.concatenate([new_x, x])
    new_y = np.concatenate([new_y, ys[i]])

fig, ax = plt.subplots()
ax.hist2d(new_x, new_y, bins=50, cmap='inferno')
fig.canvas.draw()

data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
data2 = gaussian_filter(data, sigma=5)


plt.imshow(data2)

plt.pause(5)

Однако это, по-видимому, никак не влияет на полученное изображение.

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Я полагаю, что когда вы берете визуализированную гистограмму, каждый бин имеет много пикселей, и поэтому сглаживание этого изображения едва заметно. Увеличение параметра сглаживания должно улучшить ваши результаты. Но это никогда не будет выглядеть так, как вы ожидаете, потому что каждый входной лоток представляет собой патч пикселей.

Правильным решением было бы использовать numpy.histogram2d для генерации гистограммы. Затем вы можете правильно сгладить его и отобразить любым удобным вам способом.

1 голос
/ 14 мая 2019

С помощью ответа Маркуса мне удалось решить проблему. Использование функции gaussian_filter для данных, возвращаемых np.histogram2d, корректно применяет размытие к изображению:

import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter

x = np.linspace(0, 3*np.pi, 200)
xs = []
ys = []

for i in range(200):
    xs.append(x+np.random.rand(200))
    ys.append(np.sin(xs[i]) + (np.random.rand(200)-0.5)*np.random.rand())

new_y = ys[0]
new_x = xs[0]
for i in range(1, 200):
    new_x = np.concatenate([new_x, xs[i]])
    new_y = np.concatenate([new_y, ys[i]])

fig, ax = plt.subplots()
data = np.histogram2d(new_x, new_y, bins=150)[0]
data = gaussian_filter(data, sigma=5)
plt.pcolormesh(data.T, cmap='inferno', shading='gouraud')
fig.canvas.draw()

plt.pause(5)

, который генерирует следующее изображение: enter image description here

1 голос
/ 14 мая 2019

Вы можете построить гистограмму с помощью pcolormesh и использовать shading="gouraud".Возможно, это не совсем гауссово, но я думаю, что результат выглядит так, как вы ищете, см. Изображение здесь .

Код:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 3*np.pi, 100)
ys = []
for i in range(20):
    ys.append(np.sin(x) + (np.random.rand(100)-0.5)*np.random.rand())

new_y = ys[0]
new_x = x
for i in range(1, 20):
    new_x = np.concatenate([new_x, x])
    new_y = np.concatenate([new_y, ys[i]])

fig, ax = plt.subplots()
data = np.histogram2d(new_x, new_y, bins=50)[0]
plt.pcolormesh(data.T, cmap='inferno', shading='gouraud')
fig.canvas.draw()

plt.pause(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...