使用 Bx 和 By 在 python 中剪切图像以进行向前和向后映射

我有这个问题,我想解决。我需要使用前向映射剪切图像,然后使用反向映射将其剪切回来。如果我删除 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)


慕盖茨4494581
浏览 235回答 1
1回答

RISEBY

正向映射:形状的顺序应该是(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 cv2import numpy as npimg = cv2. imread('one.jpg')rows, cols, c = img.shapeBx = 0.2By = 0.3def 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 imgForwarddef 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 imgBackwardsfimg = 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python