在包含边框的图像中提取子图像

时间:2018-05-24 14:05:08

标签: c++ opencv

假设我有一个图像,并且我想提取一个子图像,假设原始图像被包裹成环形。

我的猜测是做

之类的事情
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdio>
#include <vector>
#include <Windows.h>

using namespace cv;
using namespace std;

int main(int argc, char **argv) {

    Mat image = imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    const int & rows = image.rows;
    const int & cols = image.cols;

    Rect roi = Rect(rows - 1, cols - 1, 51, 51);
    Mat subImage = image(roi);

    namedWindow("Window", CV_WINDOW_AUTOSIZE);
    imshow("Window", subImage);
    waitKey(0);

    return 0;
}

但那并没有奏效。有什么可以建议的吗?也许我有一个我可以使用的功能?

如果不是最简单的方式?

2 个答案:

答案 0 :(得分:0)

负值不起作用,因为显然所讨论的库不支持类环形图像处理......

我现在为您看到两个选项:

  • 提取(最多)四个子图像并重新组合它们
  • 或手工提取

对于后者:

int cx = 0, cy = 0;
for(int y = lowerBoundY; y < upperBoundY; ++y)
{
    for(int x = lowerBoundX; x < upperBoundX; ++x)
    {
        subImage[cy][cx++] = image[(y + height) % height][(x + width) % width];
    }
    ++cy;
    cx = 0;
}

(默默地假设你没有超过[-width;2*width)[-height;2*height)的间隔......)

答案 1 :(得分:0)

尝试openCV copyMakeBorder;它提取子图像,为边框处理提供多种选择。