0.概述
图像变换的基本原理都是找到原图和目标图的像素位置的映射关系,这个可以用坐标系来思考,在opencv中,
图像的坐标系是从左上角开始(0,0)
,向右是x增加方向(cols
),向下时y增加方向(rows
)。
普通坐标关系:
图像坐标关系:
1.图像的平移
图像的平移是比较简单的映射关系,对于原图像的某个像素点位置(X0,Y0)
,向右平移100个像素的话,变换之后的目标像素点位置(X = X0+100,Y)
,然后用原图像的像素值填充目标位置就可,因此我们需要将这种映射关系转换一下,方便获得原图像素值,也就是X0 = X-100
,这里X是已知的。
具体代码如下:
void translation(cv::Mat & src, cv::Mat & dst, int dx, int dy)
{
const int rows = src.rows; // 获得原图的高度(y)
const int cols = src.cols; // 获得原图的宽度(x)
dst.create(rows, cols, src.type()); // 按照原图大小和格式创建一个空白图
Vec3b *p;
for (int Y = 0; Y < rows; ++Y) // 按行扫描
{
p = dst.ptr<Vec3b>(Y);
for (int X = 0; X < cols; ++X)
{
int X0 = X - dx; // 逆映射关系,求得原图的位置
int Y0 = Y - dy;
if (X0 >= 0 && Y0 >= 0 && X0 < cols && Y0 < rows) // 防止越界
{