Обрезать изображение в Python, используя Bx и By для прямого и обратного отображения
У меня есть эта проблема, которую я хотел бы решить. Мне нужно сдвинуть изображение с помощью прямого сопоставления, а затем сдвинуть его назад с помощью обратного сопоставления. Код работает, если я удаляю backMapping, но не с его добавлением. Вот мой код, любая помощь приветствуется!
import cv2
import numpy as np
img = cv2. imread("Lena2.jpg")
rows, cols, c = img.shape
Bx = 0.2
By = 0.3
def forMap (img,Bx,By):
rows = img.shape[0]
cols = img.shape[1]
imgForward = np.ndarray(shape = (int(cols + rows*By), int(rows + cols*Bx),3))
for row in range(rows):
for col in range(cols):
np.matmul(imgForward,np.array([[rows],[cols]]))
imgForward[int (row+col*By), int(col+row*Bx)] = img[row,col]/255
return imgForward
def backMap (img, Bx, By):
n = int(1/(1-Bx*By))
rows = img.shape[0]
cols = img.shape[1]
imgBackwards = np.ndarray(shape = img.shape);
for row in range(rows):
for col in range(cols):
backCol = int (n*(col+row*Bx))
backRow = int (n*(col+row*By))
np.matmul(imgBackwards,np.array([[rows],[cols]]))
imgBackwards[int(backRow+backCol*By), int(backCol + backRow*Bx)] = img[row,col]
forMap(img, Bx, By)
BackMapping = (backMap(img, Bx, By))
cv2.imshow("original image", img)
cv2.imshow("Forward Mapping", forMap)
cv2.imshow("Backward mapping", backMap)
cv2.waitKey(0)
1 ответ
Решение
Прямое отображение:
порядок формы должен быть (num of rows, num of cols, channnels)
так становится imgForward = np.ndarray(shape=(int(rows + cols*Bx),int(cols + rows*By),3))
Нет необходимости в этой линии np.matmul(imgForward,np.array([[rows],[cols]]))
Затем вы должны скопировать все 3 канала в новой позиции
imgForward[int(row+col*Bx), int(col+row*By),:] = img[row,col,:]
Обратное отображение
Только вам нужно изменить int(row+col*Bx), int(col+row*By)
с int(row-col*Bx), int(col-row*By)
Таким образом, ваш код становится
import cv2
import numpy as np
img = cv2. imread('one.jpg')
rows, cols, c = img.shape
Bx = 0.2
By = 0.3
def forMap (img,Bx,By):
rows = img.shape[0]
cols = img.shape[1]
imgForward = np.zeros((int(rows + cols*Bx),int(cols + rows*By),3), dtype=np.ubyte)
for row in range(rows):
for col in range(cols):
#np.matmul(imgForward,np.array([[rows],[cols]]))
imgForward[int(row+col*Bx), int(col+row*By),:] = img[row,col,:]
return imgForward
def backMap (img, Bx, By):
rows = img.shape[0]
cols = img.shape[1]
imgBackwards = np.zeros(shape=img.shape, dtype=np.ubyte);
for row in range(rows):
for col in range(cols):
backCol = int (col-row*By)
backRow = int (row-col*Bx)
#np.matmul(imgBackwards,np.array([[rows],[cols],3]))
imgBackwards[backRow, backCol, :] = img[row,col,:]
return imgBackwards
fimg = forMap(img, Bx, By)
bimg = backMap(fimg, Bx, By)
cv2.imshow("original image", img)
cv2.imshow("Forward Mapping", fimg)
cv2.imshow("Backward mapping", bimg)
cv2.waitKey(0)
cv2.destroyAllWindows()