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

标签 python image-processing pycharm mapping shearsort

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

最佳答案

正向映射:

形状的顺序应该是(行数,列数, channel 数),所以它变成 imgForward = np.ndarray(shape=(int(rows + cols*Bx),int(cols + rows*By),3))

不需要这一行np.matmul(imgForward,np.array([[rows],[cols]]))

然后,您必须将所有 3 个 channel 复制到新位置

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 *作者)

所以你的代码变成了

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()

关于python - 使用 Bx 和 By 在 python 中剪切图像以进行前向和后向映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414696/

相关文章:

matlab - 如何在 Matlab 中从 RGB 图像创建训练示例?

python - python中的OpenCV轮廓最小尺寸位置

Python:将 X509 证书的颁发者 CN 值存储为字符串

python - 如何让 pyCharm 停止隐藏(展开)我的 Python 导入?

python-3.x - 无法识别 PyCharm + conda + pip 包

python - 如何使用 matplotlib 在 x 轴上针对特定日期绘制数据

python - 使用 Python 获取目录(包括子目录)的最后修改日期?

java - (k<<24)>>>24在遥感图像读取中有何意义?

jquery - 使用 Tornado 向ajax发送响应

python - 仅使用batch_size和仅使用steps_per_epoch的Keras model.fit之间的区别