2d矩阵到锥形图像

时间:2018-04-08 00:12:20

标签: python python-3.x image-processing

我有一个尺寸为512x256的2D numpy矩阵。我可以很容易地使用PIL或scipy等将其转换为图像,但这显然给了我一个512x256大小的矩形形状。我想知道我是否可以做一些事情来使这个矩阵形成一个像附图所示的锥形? enter image description here

我如何考虑它是矩阵的第一列是锥体的最左边的行,而矩阵的下一列对那条线来说是一点点,依此类推。由于两个极端之间的角度是45度,而我有256列,这意味着每条线的增量为(45/256)度角?这些只是一些粗略的想法,但我想向社区学习,如果他们对我应该如何处理这个有任何想法?我正在设想一个黑色方形主图像和它中间的这个锥形。任何想法/想法?

1 个答案:

答案 0 :(得分:2)

这是一个快速的&amp;将结果图像中的极坐标映射到原始图像中的直角坐标并在原始图像的每个通道上使用import numpy as np from scipy import misc from scipy.interpolate import interp2d from math import pi, atan2, hypot inputImagePath = 'wherever/whateverYouWantToInterpolate.jpg' resultWidth = 800 resultHeight = 600 centerX = resultWidth / 2 centerY = - 50.0 maxAngle = 45.0 / 2 / 180 * pi minAngle = -maxAngle minRadius = 100.0 maxRadius = 600.0 inputImage = misc.imread(inputImagePath) h,w,chn = inputImage.shape print(f"h = {h} w = {w} chn = {chn}") channels = [inputImage[:,:,i] for i in range(3)] interpolated = [interp2d(range(w), range(h), c) for c in channels] resultImage = np.zeros([resultHeight, resultWidth, 3], dtype = np.uint8) for c in range(resultWidth): for r in range(resultHeight): dx = c - centerX dy = r - centerY angle = atan2(dx, dy) # yes, dx, dy in this case! if angle < maxAngle and angle > minAngle: origCol = (angle - minAngle) / (maxAngle - minAngle) * w radius = hypot(dx, dy) if radius > minRadius and radius < maxRadius: origRow = (radius - minRadius) / (maxRadius - minRadius) * h for chn in range(3): resultImage[r, c, chn] = interpolated[chn](origCol, origRow) import matplotlib.pyplot as plt plt.imshow(resultImage) plt.show() 的脏解决方案:

np.array([np.interp(X[i], x, Y[i]) for i in range(len(X))])

产地:

warped logo of StackOverflow

表演非常糟糕,没有费心去做&#34;矢量化&#34;。在找到方法时会更新。