opencv实现图像平移

来源:互联网 发布:淘宝可以参加聚划算吗 编辑:程序博客网 时间:2024/04/29 14:53
图像的平移操作是将图像的所有像素坐标进行水平或者垂直方向移动,也就是所有像素点按照给定的偏移量在水平方向上沿x轴、垂直方向上沿y轴移动。平移变换分为两种,图像大小变化和图形大小不变。第一种是保证图像平移的完整性,第二种图像原信息可能部分丢失。
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
//平移操作,图像大小不变
cv::Mat imageTranslation1(cv::Mat & srcImageint x0ffsetint y0ffset)
{
    int nRows = srcImage.rows;
    int nCols = srcImage.cols;
    cv::Mat resultImage(srcImage.size(), srcImage.type());
    //遍历图像
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            //映射变换
            int x = j - x0ffset;
            int y = i - y0ffset;
            //边界判断
            if (x >= 0 && y >= 0 && x < nCols && y < nRows)
            {
                resultImage.at<cv::Vec3b>(i, j) = srcImage.ptr<cv::Vec3b>(y)[x];
            }
        }
    }
    return resultImage;
}
//平移操作,图形大小改变
cv::Mat imageTranslation2(cv::Mat & srcImageint x0ffsetint y0ffset)
{
    //设置平移尺寸
    int nRows = srcImage.rows + abs(y0ffset);
    int nCols = srcImage.cols + abs(x0ffset);
    cv::Mat resultImage(nRows, nCols, srcImage.type());
    //图像遍历
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0; j < nCols; j++)
        {
            int x = j - x0ffset;
            int y = i - y0ffset;
            //边界判断
            if (x >= 0 && y >= 0 && x < nCols && y < nRows)
            {
                resultImage.at<cv::Vec3b>(i, j) = srcImage.ptr<cv::Vec3b>(y)[x]; //Vec3b是一种图像像素值的类型
            }
        }
    }
    return resultImage;
}
int main()
{
    //读取图像
    cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\1.jpg");
    if (srcImage.empty())
    {
        return -1;
    }
    
    //显示原图像
    cv::imshow("原图像", srcImage);
    int x0ffset = 50;
    int y0ffset = 80;
    //图像左平移不改变大小
    cv::Mat resultImage1 = imageTranslation1(srcImage, x0ffset, y0ffset);
    cv::imshow("resultImage1", resultImage1);
    //图像左平移改变大小
    cv::Mat resultImage2 = imageTranslation2(srcImage, x0ffset, y0ffset);
    cv::imshow("resultImage2", resultImage2);
    //图像又平移不改变大小
    x0ffset= -50;
    y0ffset = -80;
    cv::Mat resultImage3 = imageTranslation1(srcImage, x0ffset, y0ffset);
    cv::imshow("resultImage3", resultImage3);
    cv::waitKey(0);
    return 0;
}
原创粉丝点击