我有一个剪切图像的代码,但我希望它在x和y轴上旋转,具有前向和后向映射。关于如何做到这一点的任何建议?

问题描述 投票:0回答:1

我需要使用代码来旋转图像而不是使用向前和向后映射进行剪切。

我已经尝试更改变量的值,并更改计算,但无法使其工作。一切都有帮助。

import numpy as np
import cv2

img = cv2.imread("lena.jpg", 0)
rows, cols = img.shape

x = 0.3
y = 0.2

def forMap (img, x, y):
rows = img.shape[0]
cols = img.shape[1]
imgForward = np.zeros((int(rows + cols*x), int(cols+rows*y)), 
dtype=np.ubyte)

for row in range(rows):
    for col in range(cols):
        imgForward[int(row+col*x), int(col+row*y)] = img[row,col]
return imgForward

def backMap (img, x, y):
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*y)
        backRow = int (row-col*x)
        imgBackwards[backRow, backCol] = img[row,col]
return imgBackwards


aimg = forMap(img, x, y)
bimg = backMap(aimg, x, y)

cv2.imshow("Original image", img)
cv2.imshow("Forward mapping",aimg)
cv2.imshow("Backward mapping", bimg)
cv2.waitKey(0)
python rotation pycharm
1个回答
0
投票

选择旋转中心C和旋转角θ。

然后定义复数R = cos(theta)+ i sin(theta)。

每个像素P的旋转函数是:

M(P)= R *(P-C)+ C.

涉及的产品*是复数产品。如果您愿意,可以使用2×2旋转矩阵R进行相同操作。

因此,您只需要创建两个嵌套循环,并且对于每个像素P,使用M(P)找到其旋转位置。

您需要定义旋转位置超出目标图像边界时要执行的操作。最简单的解决方案是跳过该像素。生成的旋转图像将在角落处被裁剪。

当然,其他方法是使用输入图像的旋转角来定义目标图像的新尺寸。为此,您需要将函数M应用于角点,然后找到旋转角的最大X,最大Y,最小X和最小Y.

C ++伪代码:

#include <complex>

struct Point
{
    double x, y;
    Point(double _x, double _y) : x(_x), y(_y) {};
};

// Rotate a point around a center using complex numbers.
// This is slow
Point transform(const Point& pt, double rot_angle, const Point& rot_center)
{
    auto R = std::complex<double>(cos(rot_angle), sin(rot_angle));
    auto C = std::complex<double>(rot_center.x, rot_center.y);
    auto P = std::complex<double>(pt.x, pt.y);

    auto M = R * (P - C) + C;

    return Point(M.real(), M.imag());
}


// Pseudocode for rotating the input_image.
// This code cropp the corners outside the bounds.
constexpr double PI = 3.14159265358979323846;
auto center = Point(width/2, height/2);
auto angle = PI / 4.0:

for(int y = 0 ; y < height; ++y)
{
    for(int x = 0 ; x < width ; ++x)
    {
        auto point = transform(Point(x,y), angle, center);
        if(point.x < 0 || point.x >= width || point.y < 0 || point.y >= height)
            continue;
        auto color = input_image.get_pixel(x,y);
        output_image.set_pixel((int)point.x, (int)point.y, color);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.