首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenCV 影像操作:Image Offset(影像平移/環繞位移)實現

     編輯:關於C++

效果描述

Image Offset 將影像在水平/垂直方向平移指定像素。支援兩種模式:

  • 環繞模式:超出邊界的像素從對面繞入(模運算)。
  • 裁剪模式:超出邊界像素捨棄,空白區填充預設色(通常為黑)。

核心演算法

  1. 輸入位移量 xOffset, yOffset(可正可負)。
  2. 環繞模式:xOffset = ((xOffset % w) + w) % w 正規化至 [0, w-1];同理 yOffset。
  3. 對每個輸出像素 (x, y),計算源座標:
    環繞:src_x = (x + w - xOffset) % w,src_y = (y + h - yOffset) % h。
    裁剪:src_x = x - xOffset,src_y = y - yOffset,檢查邊界。
  4. 直接複製像素值(無需插值,因為是整數位移)。

完整 OpenCV C++ 實現

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void showImage(const Mat& img, const string& name) {
    namedWindow(name, WINDOW_AUTOSIZE);
    imshow(name, img);
}

int main() {
    Mat src = imread("4.jpg");
    if (src.empty()) return -1;
    Mat dst(src.size(), src.type());

    int xOffset = 150, yOffset = 100;
    bool warp = true; // true=環繞, false=裁剪

    int w = src.cols, h = src.rows;
    if (warp) {
        xOffset = ((xOffset % w) + w) % w;
        yOffset = ((yOffset % h) + h) % h;
    }

    for (int y = 0; y < h; ++y) {
        for (int x = 0; x < w; ++x) {
            int sx, sy;
            if (warp) {
                sx = (x + w - xOffset) % w;
                sy = (y + h - yOffset) % h;
            } else {
                sx = x - xOffset;
                sy = y - yOffset;
                if (sx < 0 || sx >= w || sy < 0 || sy >= h) {
                    dst.at<Vec3b>(y, x) = Vec3b(0,0,0); // 黑色填充
                    continue;
                }
            }
            dst.at<Vec3b>(y, x) = src.at<Vec3b>(sy, sx);
        }
    }
    showImage(dst, "Image Offset");
    waitKey(0);
    return 0;
}

應用場景

  • 影像拼接預對齊。
  • 視差校正與立體視覺。
  • 資料增強:隨機平移訓練樣本。
  • 環繞模式適用於無縫紋理生成。

OpenCV 內建替代方案

// 使用仿射變換矩陣
Mat M = (Mat_<double>(2,3) << 1, 0, xOffset, 0, 1, yOffset);
warpAffine(src, dst, M, src.size(), INTER_LINEAR, BORDER_WRAP); // 環繞
// 或 BORDER_CONSTANT, Scalar(0) 裁剪填充黑色

warpAffine 內建高優化、支援插值與多種邊界模式,實務上優先使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved