python - 运行我自制的旋转算法时得到不正确的图片输出

标签 python numpy image-manipulation image-rotation

为了更好地理解图像处理的工作原理,我决定创建自己的图像旋转算法,而不是使用 cv2.rotate() 但是,我遇到了奇怪的图片裁剪和像素错位问题。

我认为这可能与我的填充有关,但也可能有其他错误

import cv2

import math

import numpy as np
# Load & Show original image
img = cv2.imread('Lena.png', 0)
cv2.imshow('Original', img)

# Variable declarations
h = img.shape[0]  # Also known as rows

w = img.shape[1]  # Also known as columns

cX = h / 2 #Image Center X

cY = w / 2 #Image Center Y

theta = math.radians(100) #Change to adjust rotation angle

imgArray = np.array((img))

imgArray = np.pad(imgArray,pad_width=((100,100),(100,100)),mode='constant',constant_values=0) 
  #Add padding in an attempt to prevent image cropping

# loop pixel by pixel in image
for x in range(h + 1):

 for y in range(w + 1):

  try:
   TX = int((x-cX)*math.cos(theta)+(y-cY)*math.sin(theta)+cX) #Rotation formula 

   TY = int(-(x-cX)*math.sin(theta)+(y-cY)*math.cos(theta)+cY) #Rotation formula

   imgArray[x,y] = img[TX,TY]

  except IndexError as error:

   print(error)

cv2.imshow('Rotated', imgArray)

cv2.waitKey(0)

编辑:

我认为图像位置错位可能与缺乏正确的原点有关,但我似乎找不到解决该问题的有效解决方案。

最佳答案

虽然我没有深入研究该领域的数学部分,但根据给定的信息,我认为矩阵旋转公式应该像这样工作:

更新:

正如我所 promise 的,我深入研究了该领域并找到了解决方案,如下所示。主要技巧是我也在循环中交换了源索引和目标索引,因此舍入并不意味着出现任何问题:

import cv2
import math
import numpy as np


# Load & Show original image
img = cv2.imread('/home/george/Downloads/lena.png', 0)
cv2.imshow('Original', img)


# Variable declarations
h = img.shape[0]  # Also known as rows
w = img.shape[1]  # Also known as columns

p = 120
h += 2 * p 
w += 2 * p

cX = h / 2 #Image Center X
cY = h / 2 #Image Center Y

theta = math.radians(45) #Change to adjust rotation angle

imgArray = np.zeros_like((img))  

#Add padding in an attempt to prevent image cropping
imgArray = np.pad(imgArray, pad_width=p, mode='constant', constant_values=0)   
img = np.pad(img, pad_width=p, mode='constant', constant_values=0)   

# loop pixel by pixel in image
for TX in range(h + 1):
    for TY in range(w + 1):
        try:
            x = int( +(TX - cX) * math.cos(theta) + (TY - cY) * math.sin(theta) + cX) #Rotation formula 
            y = int( -(TX - cX) * math.sin(theta) + (TY - cY) * math.cos(theta) + cY) #Rotation formula

            imgArray[TX, TY] = img[x, y]

        except IndexError as error:
           pass
#           print(error)

cv2.imshow('Rotated', imgArray)
cv2.waitKey(0)
exit()

enter image description here

注意:如果您想更深入地了解该领域,请参阅 usr2564301 评论。

关于python - 运行我自制的旋转算法时得到不正确的图片输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53193497/

相关文章:

python - pyaudio 改变调用回调函数的样本数

python - 获取可点击列表

python - Kivy:固定值(value)的属性(property)

python - OpenCV VideoWriter:播放视频的问题

svg - ImageMagick 将 svg 文件转换为带有工件和更改大小的 xmp

actionscript-3 - 如何使用 AS3 在 Flash 中单击显示对象?

php - 允许用户操作在浏览器中呈现的图像 - API 推荐?

python - 在保持序列的同时删除二维数组中的重复项

python - 判断一个序列是否存在于 Pandas Series 中,并返回找到该序列的行

python - 从python中的numpy npz文件加载数组