我们如何在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')
答案 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()
输出:
如果滚动1D数据,您将获得所需的倾斜图案。如果您想使用特殊的倾斜角度,则必须在每行上方滚动更多/更少的角度,然后滚动1 /使其更平整/陡峭。
文档:
答案 1 :(得分:2)
针对您在@Patrick Artner的回答下面的评论:
我们可以看到numpy.roll无法生成平滑模式
函数np.roll
对结果图像的平滑度不负责,它是函数plt.imshow。您需要告诉它如何正确插值生成的数据。因此,仅通过在函数调用中指定interpolation
关键字参数,您就可以拥有例如:
plt.imshow(sine2D,interpolation='bilinear', cmap='gray')
这会使结果更平滑:
但是还有很多其他可能性:'bicubic'
,'spline16'
,'spline36'
...