我有一张用scipy.misc.imread
阅读的图片。
枢轴([0,0]
)在图像的左上方。
我想将其顺时针旋转90度。
我得到的结果是:
我希望您能找到错误以及如何解决该错误:
对于点(x,y)
和图像大小h=Image_Hieght-1
和w=Image_Width-1
,我将枢轴更改为位于图的中心。 (x,y) -> (x-w/2,y-h/2)
。
现在我可以使用将点顺时针旋转90度的线性变换:
(1,0) -> (0,-1)
(0,-1) -> (1,0)
(x1,y1) -> (y1,-x1)
==> (x - w/2,y - h/2) -> (y-h/2,w/2 - x)
现在,我需要将点移回原始图形(在执行(x,y) -> (x-w/2,y-h/2)
之前):(y-h/2,w/2 - x) -> (y-h/2+h/2,w/2 - x+w/2) = (y,w-x)
i,j
(i
=行,j
=列),所以(y,w-x) == (-j+w,i)
结论:
def movePointBy90(hieght, width, i, j):
iNew = -j + width - 1
jNew = i
return int(iNew), int(jNew)
其余代码:
image1 = imread('image.jpg')
image2 = np.zeros([image1.shape[1], image1.shape[0], image1.shape[2]])
print(image1.shape)
print(image2.shape)
for c in range(2):
for i in range(image1.shape[0]-1):
for j in range(image1.shape[1]-1):
newPoint = moveBy90(image1.shape[0], image1.shape[1], i, j)
image2[newPoint[0], newPoint[1], c]=image1[i,j,c]
plt.subplot(1, 2, 1)
plt.imshow(image1)
plt.subplot(1, 2, 2)
plt.imshow(image2)
plt.show()
更改为(我认为range
是近距离范围):
for c in range(3):
for i in range(image1.shape[0]):
for j in range(image1.shape[1]):
答案 0 :(得分:2)
您的图片有几个频道?当我在for循环中更改c变量的范围时,它可以正常工作。来自
for c in range(2):
我认为这是numpy / matplotlib与图像像素值有关的问题。如果您的强度值在[0,255]而不是[0,1]范围内,则应首先执行
image1 = image1 / 255
读取图像后,它将正确显示。
更新:我在下面用您的图像运行代码,并显示了结果,重点是指定新初始化数组的数据类型。
import numpy as np
import matplotlib.pyplot as plt
def moveBy90(hieght, width, i, j):
iNew = -j + width - 1
jNew = i
return int(iNew), int(jNew)
image1 = plt.imread('3PWin.png')
image2 = np.zeros([image1.shape[1], image1.shape[0], image1.shape[2]], dtype=image1.dtype)
for c in range(4):
for i in range(image1.shape[0]-1):
for j in range(image1.shape[1]-1):
newPoint = moveBy90(image1.shape[0], image1.shape[1], i, j)
try:
image2[newPoint[0], newPoint[1], c]=image1[i,j,c]
except IndexError as error:
print(error)
plt.subplot(1, 2, 1)
plt.imshow(image1)
plt.subplot(1, 2, 2)
plt.imshow(image2)
plt.show()
答案 1 :(得分:0)
旋转图像的过程似乎相当复杂。仅使用numpy
意味着您可以将3圈旋转90度,以达到顺时针旋转90度的效果
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
data_orig = misc.face()
data_rotated = np.rot90(data_orig, k=3)
plt.imshow(data_rotated)
plt.show()
或者,如果您想使用scipy,
import matplotlib.pyplot as plt
from scipy import misc
from scipy.ndimage import rotate
data_orig = misc.face() # or use data_orig = imread('image.jpg')
data_rotated = rotate(data_orig, 270)
plt.imshow(data_rotated)
plt.show()
在两种情况下,图像均顺时针旋转90°: