使用OpenCV将小图像平铺成更大的图像

os8fio9y  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(179)

假设我有一个200x200像素的图像。我想要一个800x800像素的版本,我基本上复制200x200图像,并填充800x800图像(将较小的图像平铺到较大的图像中)。
在openCV中你会怎么做呢?看起来很简单,但我不知道如何创建另一个与模式类型相同的cv::Mat,但尺寸更大(Canvas尺寸),或者如果可以使用原始的200x200像素图像并增加它的行和列,然后简单地使用循环将角粘贴到图像的其余部分。
我用的是openCV 2.3,我已经对固定尺寸的图像做了一些处理,但是当涉及到增加矩阵的尺寸时,我有点不知所措。

bweufnob

bweufnob1#

你可以使用repeat函数:

def tile_image(tile, height, width):      
  x_count = int(width / tile.shape[0]) + 1
  y_count = int(height / tile.shape[1]) + 1

  tiled = np.tile(tile, (y_count, x_count, 1))

  return tiled[0:height, 0:width]
a2mppw5e

a2mppw5e2#

仅供参考-@karlphillip回复中的博客,基本思想是使用cvSetImageROIcvResetImageROI。两者都是C API。
在以后的版本中,例如v2.4和3.x,可以定义具有所需位置和尺寸的Rect,并将所需部分称为img(rect)
C API中的示例(函数式风格):

cvSetImageROI(new_img, cvRect(tlx, tly, width, height);
cvCopy(old_img, new_img);
cvResetImageROI(new_img);

在C++ API中使用类:

Mat roi(new_img, Rect(tlx, tly, width, height));
roi = old_img;    // or old_img.clone()

C++中的另一种方法(复制图像):

old_img.copyTo(new_img(Rect(tlx, tly, width, height)))
8i9zcol2

8i9zcol23#

在C++中,你可以这样做:

cvx::Mat CreateLargeImage(const cvx::Mat& small, int new_rows, int new_cols) {
  // Create a Mat of the desired size, the mat may also be created by resizing of the smaller one.
  cvx::Mat result(new_rows, new_cols, 16);
  const int sm_rows = small.rows;
  const int sm_cols = small.cols;
  for (int r = 0; r < result.rows; ++r) {
    for (int c = 0; c < result.cols; ++c) {
        // use mod operation to effectively repeat the small Mat to the desired size.
        result.at<cvx::Vec3b>(r, c)[0] =
            small.at<cvx::Vec3b>(r % sm_rows, c % sm_cols)[0];
        result.at<cvx::Vec3b>(r, c)[1] =
            small.at<cvx::Vec3b>(r % sm_rows, c % sm_cols)[1];
        result.at<cvx::Vec3b>(r, c)[2] =
            small.at<cvx::Vec3b>(r % sm_rows, c % sm_cols)[2];
    }
  }
  return result;
}

相关问题