我正在尝试使用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像素,一幅为负,另一幅为正。
答案 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>黑色)。
更新:
如果你还不明白发生了什么,我已经为你拍了一张照片: