为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2021-08-24 16:40:28
我有这个问题,我想解决。我需要使用前向映射剪切图像,然后使用反向映射将其剪切回来。如果我删除 backMapping 但不添加它,则代码有效。这是我的代码,任何帮助表示赞赏!import cv2import numpy as npimg = cv2. imread("Lena2.jpg")rows, cols, c = img.shapeBx = 0.2By = 0.3def 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 imgForwarddef 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 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

正向映射:


形状的顺序应该是(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()


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号