昊虹君 发表于 2022-12-22 19:23

使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)

使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)

图像的平移操作是将图像的所有像素点进行水平或垂直方向上的移动。
平移操作分为两种类型:图像的尺寸变化与图像的尺寸不变。前者保证图像平移时原图的完整信息,后者在平移后原图的信息会有部分丢失。

没什么高深的数学原理,直接用代码驱动图像平移即可。

使用OpenCV对图像进行两种平移操作的C++代码如下:
代码中用到的图像下载链接:
https://pan.baidu.com/s/1G640rwo6shN1S2t1iIupsg?pwd=xjqw

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

// 平移操作:平移后得到的图像与原图像一样大,原图信息部分失丢
cv::Mat imageTranslation1(cv::Mat & srcImage, int xOffset, int yOffset)
{
        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 - xOffset;
                        int y = i - yOffset;
                        // 边界判断
                        if (x >= 0 && y >= 0 && x < nCols && y < nRows)
                                resultImage.at<cv::Vec3b>(i, j) =
                                srcImage.ptr<cv::Vec3b>(y);
                }
        }
        return resultImage;
}

// 平移操作:平移后得到的图像与原图像不一样大,原图信息不失丢
cv::Mat imageTranslation2(cv::Mat & srcImage, int xOffset, int yOffset)
{
        // 设置平移尺寸
        int nRows = srcImage.rows + abs(yOffset);
        int nCols = srcImage.cols + abs(xOffset);
        cv::Mat resultImage(nRows, nCols,
                srcImage.type());
        for (int i = 0; i < nRows; ++i)
        {
                for (int j = 0; j < nCols; ++j)
                {
                        // 映射变换
                        int x = j - xOffset;
                        int y = i - yOffset;
                        // 边界判断
                        if (x >= 0 && y >= 0 && x < nCols && y < nRows)
                                resultImage.at<cv::Vec3b>(i, j) =
                                srcImage.ptr<cv::Vec3b>(y);
                }
        }
        return resultImage;
}
int main()
{
        cv::Mat srcImage = cv::imread("F:/material/images/2022/2022-12/flower1.jpg");
        if (!srcImage.data)
                return -1;
        cv::imshow("原图", srcImage);
        int xOffset = 50, yOffset = 80;

        // 图像右平移,并且平移后得到的图像与原图像一样大,原图信息部分丢失
        cv::Mat resultImage1 =
                imageTranslation1(srcImage, xOffset, yOffset);
        cv::imshow("右平移,原图有信息丢失", resultImage1);

        // 图像右平移,并且平移后得到的图像与原图像不一样大,原图信息不失丢
        cv::Mat resultImage2 =
                imageTranslation2(srcImage, xOffset, yOffset);
        cv::imshow("右平移,原图无信息丢失", resultImage2);

        // 图像左平移,并且平移后得到的图像与原图像一样大,原图信息部分丢失
        xOffset = -50, yOffset = -80;
        cv::Mat resultImage3 =
                imageTranslation1(srcImage, xOffset, yOffset);
        cv::imshow("左平移,原图有信息丢失", resultImage3);

        cv::waitKey(0);
        return 0;
}
运行结果如下图所示:
http://pic1.hhai.cc/pic1/2022/2022-12/002/16.png
页: [1]
查看完整版本: 使用OpenCV对图像进行两种平移操作(图像的尺寸变化与图像的尺寸不变)