生成倾斜正弦波的图像

时间:2019-08-17 08:59:15

标签: python numpy matplotlib

我们如何在Python中生成以下灰度图像?

下面的代码生成水平模式,但是我需要一个倾斜的模式。

import numpy as np
import matplotlib.pyplot as plt

N = 256
x = np.linspace(-np.pi,np.pi, N)
sine1D = 128.0 + (127.0 * np.sin(x * 8.0))
sine1D = np.uint8(sine1D)
sine2D = np.tile(sine1D, (N,1))
print(sine2D.shape)
plt.imshow(sine2D, cmap='gray')

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以使用numpy.roll左右移动一维正弦数据:

import numpy as np
import matplotlib.pyplot as plt

N = 256
x = np.linspace(-np.pi,np.pi, N)
sine1D = 128.0 + (127.0 * np.sin(x * 8.0))
sine1D = np.uint8(sine1D)
sine2D = np.ndarray((N,N), dtype=np.uint8)
for i in range(N):
    sine2D[i]= np.roll(sine1D,-i)  # shift the 1D sin data by -i, -i increases with rows
plt.imshow(sine2D, cmap='gray')
plt.show()

输出:

resulting image

如果滚动1D数据,您将获得所需的倾斜图案。如果您想使用特殊的倾斜角度,则必须在每行上方滚动更多/更少的角度,然后滚动1 /使其更平整/陡峭。

文档:

答案 1 :(得分:2)

针对您在@Patrick Artner的回答下面的评论:

  

我们可以看到numpy.roll无法生成平滑模式

函数np.roll对结果图像的平滑度不负责,它是函数plt.imshow。您需要告诉它如何正确插值生成的数据。因此,仅通过在函数调用中指定interpolation关键字参数,您就可以拥有例如:

plt.imshow(sine2D,interpolation='bilinear', cmap='gray')

这会使结果更平滑:

smooth_roll

但是还有很多其他可能性:'bicubic''spline16''spline36' ...