没有外部功能的情况下旋转图像

时间:2018-07-22 18:08:43

标签: python image matplotlib image-processing scipy

我有一张用scipy.misc.imread阅读的图片。

枢轴([0,0])在图像的左上方。 我想将其顺时针旋转90度。

我得到的结果是:

enter image description here

我希望您能找到错误以及如何解决该错误:

  1. 对于点(x,y)和图像大小h=Image_Hieght-1w=Image_Width-1,我将枢轴更改为位于图的中心。 (x,y) -> (x-w/2,y-h/2)

  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)
  3. 现在,我需要将点移回原始图形(在执行(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,ji =行,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]):

enter image description here

2 个答案:

答案 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()

result of your example image

答案 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°:

enter image description here