You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用VB.NET/C#在Emgu(Python包装库)中将小图粘贴到大图指定位置?

在Emgu(VB.NET/C#)中实现小图像粘贴到大图指定位置

问题描述

需要将尺寸为(100, 100)的小图像粘贴到尺寸为(500, 500)的大图像的(10,10)位置处。尝试设置大图像的ROI后执行CopyTo命令,却发现该命令直接覆盖了整个大图像。Python中可以通过image_large[10:110,10:110] = image_small[0:100,0:100]的切片方式轻松实现,询问Emgu中的正确操作方式。

原测试代码(VB.NET):

Dim image_small As New Image(Of Gray, Byte)(New Size(100, 100))
Dim image_large As New Image(Of Gray, Byte)(New Size(500, 500))

image_small.SetValue(New Gray(100))   'Gray
image_large.SetValue(New Gray(0))     'Black

image_large.ROI = New Rectangle(New Point(10, 10), New Size(100, 100))
image_small.CopyTo(image_large)

预期效果:大图的(10,10)位置出现100x100的灰色区域,其余区域保持黑色。


解决方案

CopyTo方法默认会忽略目标图像的ROI设置,直接将源图像完整复制到目标图像中。正确的做法是获取大图像指定区域的子Mat,再将小图像复制到该子Mat上,具体实现如下:

VB.NET 代码

Dim image_small As New Image(Of Gray, Byte)(New Size(100, 100))
Dim image_large As New Image(Of Gray, Byte)(New Size(500, 500))

image_small.SetValue(New Gray(100))   ' 灰色小图
image_large.SetValue(New Gray(0))     ' 黑色大图

' 获取大图指定区域的子Mat,将小图复制到该区域
Using roiMat As Mat = image_large(New Rectangle(10, 10, 100, 100))
    image_small.CopyTo(roiMat)
End Using

C# 代码

var image_small = new Image<Gray, byte>(new Size(100, 100));
var image_large = new Image<Gray, byte>(new Size(500, 500));

image_small.SetValue(new Gray(100));   // 灰色小图
image_large.SetValue(new Gray(0));     // 黑色大图

// 获取大图指定子区域,复制小图到该区域
using (var roiMat = image_large.GetSubRect(new Rectangle(10, 10, 100, 100)))
{
    image_small.CopyTo(roiMat);
}

原理说明

通过image_large(rect)(VB.NET)或GetSubRect(rect)(C#)获取大图像的指定区域子Mat,这个子Mat是原大图像内存的引用,对它进行修改会直接反映到原大图像上。此时调用CopyTo将小图像复制到该子Mat,只会修改指定的区域,不会覆盖整个大图像,实现了和Python切片赋值一致的效果。


内容的提问来源于stack exchange,提问作者Doug Schofield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:45:29