以水平图像位移为例
方法一:
原理:
将图像分成两个区域,而后利用临时变量将这两个区域进行交换。
代码实现:
参数img表示需要平移的图像数据,参数d表示平移像素量(右移为正,左移为负)
Mat img_shift(Mat img, int d)
{
Mat tmp;
if (d > 0)
{
//右移
Mat q0(img, Rect(0, 0, img.cols - d, img.rows));
Mat q1(img, Rect(img.cols - d, 0, d, img.rows));
q0.copyTo(tmp);
Mat q2(img, Rect(0, 0, d, img.rows));
Mat q3(img, Rect(d, 0, img.cols - d, img.rows));
q1.copyTo(q2);
tmp.copyTo(q3);
}
else
{
//左移
d = -d;
Mat q0(img, Rect(0, 0, d, img.rows));
Mat q1(img, Rect(d, 0, img.cols - d, img.rows));
q0.copyTo(tmp);
Mat q2(img, Rect(0, 0, img.cols - d, img.rows));
Mat q3(img, Rect(img.cols - d, 0, d, img.rows));
q1.copyTo(q2);
tmp.copyTo(q3);
}
return img;
}
结果展示:
结果展示的为右移100像素的结果
?
?
方法二:
原理:
将图像数据复制粘贴在原图像两倍宽的矩阵中,即两个原始图像在矩阵中左右并列存放;而后根据位移量来截取原始图像宽高的图像数据。
代码实现:
参数img表示需要平移的图像数据,参数d表示平移像素量(右移为正,左移为负)
//第二种图像平移
//将图像扩展两倍的宽 并对其进行截取达到是图像平移
Mat img_shift1(Mat img, int d)
{
Mat src(img.rows, img.cols * 2, img.type());
//水平平移 则在水平方向上对其复制粘贴
img.copyTo(src({ 0,0,img.cols,img.rows }));
img.copyTo(src({ img.cols,0,img.cols,img.rows }));
if (d > 0)
{
Mat tmp(src, Rect(img.cols - d, 0, img.cols, img.rows));
tmp.copyTo(img);
}
else
{
Mat tmp(src, Rect(-d, 0, img.cols, img.rows));
tmp.copyTo(img);
}
return img;
}
结果展示:
?
?仅供自己学习笔记!
如需转载,请注明出处!
|