opencv warpaffine否定翻译

时间:2016-05-11 12:19:29

标签: opencv

我正在尝试使用OpenCVs warpAffine通过简单的翻译来转换图像。从负面与正面翻译产生的图像让我感到惊讶。

from skimage import data
import numpy as np
import cv2
from pylab import *

ion()
fig = figure()
fig.clear()
image = data.camera()

# positive translation
rigid0 = np.float32([[1.0, 0.0, 96.0], [0.0, 1.0, 0.0]])
w0 = cv2.warpAffine(image,rigid0,(image.shape[1]+int(abs(rigid0[0,2])),image.shape[0]))

# negative translation 
rigid1 = np.float32([[1.0, 0.0, -96.0], [0.0, 1.0, 0.0]])
w1 = cv2.warpAffine(image,rigid1,(image.shape[1]+int(abs(rigid1[0,2])),image.shape[0]))

plt.subplot(1, 2, 1)
imshow(w0, cmap=gray())

plt.subplot(1, 2, 2)
imshow(w1, cmap=gray())

我已经插入了下面生成的图,注意右边的负面翻译看起来如何吃掉两倍于图像的像素。两幅图像的构造均为96像素,一幅为负,另一幅为正。

positive versus negative translation

1 个答案:

答案 0 :(得分:0)

我能够用c ++重现你的输出:

#include <opencv2/opencv.hpp>

int main(int argc, char *argv[]) {
  cv::Mat img = cv::imread("H:/cameraman.jpg");
  cv::resize(img, img, cv::Size(512, 512));

  cv::Mat rigid0 = (cv::Mat_<double>(2, 3) << 1., 0., 96.,
                                              0., 1., 0.);


  cv::Mat rigid1 = (cv::Mat_<double>(2, 3) << 1., 0., -96.,
                                              0., 1., 0.);

  cv::Mat res0, res1;

  cv::warpAffine(img, res0, rigid0, cv::Size(img.cols + 96., img.rows));
  cv::warpAffine(img, res1, rigid1, cv::Size(img.cols + 96., img.rows));

  cv::imshow("0", res0);
  cv::imshow("1", res1);
  cv::waitKey();
  return 0;
}

根据warpAffine function的文档,生成的图像由以下构建:

dst(x, y) = src(M11 * x + M12 * y + M13, M21 * x + M22 * y + M23)

其中M是仿射矩阵的反转。所以在负面翻译的情况下,你有:

dst(x, y) = src(x + 96, y)

所以,它正是你所拥有的(输入偏移了96像素)。

您可以将结果尺寸设置为96像素,因此根据 borderMode borderValue 默认值( BORDER_CONSTANT <),生成的图像将填充黑色/ strong>黑色)。

更新:

如果你还不明白发生了什么,我已经为你拍了一张照片:

eating cameraman