如何使用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
相关产品推荐
相关产品推荐

