У меня есть код, который подрезает изображение, но я бы хотел, чтобы он вращался по осям X и Y с отображением вперед и назад.Любой совет, как это сделать? - PullRequest
0 голосов
/ 18 февраля 2019

Мне нужен код для поворота изображения вместо сдвига с использованием прямого и обратного отображения.

Я пытался изменить значения моих переменных и изменить вычисления, но не могу заставить его работать.Все помогает.

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)

1 Ответ

0 голосов
/ 19 февраля 2019

Укажите центр поворота C и угол поворота тета.

Затем определите комплексное число R = cos (тета) + i sin (тета).

Функция поворота для каждого пикселя P:

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

Там, где продукт * включает продукт номера complrx.Вы можете сделать то же самое с 2 × 2 матрицей вращения R, если хотите.

Так что вам просто нужно создать два вложенных цикла и для каждого пикселя P найти свою повернутую позицию, используя M (P).

Вам необходимо определить, что делать, когда повернутое положение выходит за границы целевого изображения.Самое простое решение - пропустить этот пиксель.Полученное повернутое изображение будет обрезано по углам.

Другой подход, конечно, заключается в определении нового размера целевого изображения с использованием повернутых углов входного изображения.Для этого вам нужно применить функцию M к углам, а затем найти max X, max Y, min X и min 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...