Получение некорректного вывода изображения при запуске моего собственного алгоритма вращения - PullRequest
0 голосов
/ 07 ноября 2018

Чтобы лучше понять, как работают манипуляции с изображениями, я решил создать собственный алгоритм поворота изображения, а не использовать 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)

Редактировать:

Я думаю, что неуместное положение изображения может иметь какое-то отношение котсутствие надлежащей исходной точки, однако я не могу найти работающего решения этой проблемы.

1 Ответ

0 голосов
/ 07 ноября 2018

Хотя я не погружался в математическую часть домена, но, основываясь на предоставленной информации, я думаю, что матрица, вращающаяся , должна работать следующим образом:

UPDATE:

Как я и обещал, я немного углубился в домен и нашел решение, которое вы видите следующим образом. Основной трюк в том, что я поменял местами индексы источника и назначения в цикле, поэтому округление не означает никаких проблем:

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, если вы хотите глубже погрузиться в домен.

...