ROI
ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域,但是图像是矩阵是矩形的,感兴趣的是乱八七糟的,所以还有一个Mask需要了解一下的。
public class RoiStep : IImageProcessingStep
{
public ImageProcessingStepType StepType => ImageProcessingStepType.Preprocessing;
public string Name => "ROI";
public ProcessingResult ProcessImage(Mat src, Dictionary<string, object> parameters)
{
// 获取ROI参数
object roiObj = parameters["ROI"];
object typeObj = parameters["Type"];
// 检查是否获取到了ROI和Type
if (roiObj == null || typeObj == null)
{
throw new ArgumentException("Missing required parameters ROI or Type.");
}
Rect rect= new Rect();
// 尝试将ROI对象转换为Rect,如果失败则抛出异常
try
{
dynamic rectdy = roiObj as dynamic;
if (rectdy == null)
{
throw new ArgumentException("ROI parameter must be a Rect object or a compatible equivalent.");
}
rect = new Rect();
rect.X = rectdy.X;
rect.Y = rectdy.Y;
rect.Width= rectdy.Width;
rect.Height = rectdy.Height;
// 检查ROI是否有效
if (rect.Width <= 0 || rect.Height <= 0)
{
throw new ArgumentException("ROI width and height must be positive values.");
}
}
catch (Exception ex)
{
throw new ArgumentException("Error converting ROI to Rect: " + ex.Message);
}
string type = typeObj.ToString().ToUpper();
// 根据Type参数执行相应的操作
switch (type)
{
case "ROI":
return new(src[rect].Clone());
case "MASK1":
return new(ProcessMask1(src, rect));
case "MASK2":
return new(ProcessMask2(src, rect));
default:
throw new ArgumentException("Type parameter is unknown or invalid.");
}
}
private Mat ProcessMask1(Mat src, Rect rect)
{
Mat dst = new Mat();
Mat mask = Mat.Zeros(src.Size(), MatType.CV_8UC1).ToMat();
mask[rect].SetTo(255);
src.CopyTo(dst, mask);
return dst;
}
private Mat ProcessMask2(Mat src, Rect rect)
{
Mat dst = new Mat();
Mat mask1 = Mat.Zeros(src.Size(), MatType.CV_8UC1).ToMat();
mask1[rect].SetTo(255);
src.CopyTo(dst);
dst.SetTo(0, mask1);
return dst;
}
public static Mat GetRoi(Mat src, Rect rect)
{
return src[rect].Clone();
}
}
可以拿着代码去用用看。记得VS F12+ChatGPT
- Rect是opencvsharp中对矩形的定义 通过Mat[Rect] 就可以获得相应的区域。
- Mat.CopyTo(Mat m, InputArray? mask = null) 这个方法 直接中文翻译直接就是:我拷贝给你,你要哪些区域,就在mask的图像上给我标255。
- Mat.SetTo(InputArray value, Mat? mask = null)这个方法 直接中文翻译直接就是:设置图像颜色,你要哪些区域被设置颜色,就在mask的图像上给我标255。
- 不要看我的示例都是矩形的 你可以做圆形,梯形,三角形,人字拖形。Mask 是可以精确到像素点的哦!!所以你只需要在mask中给相应的像素点赋值,就能得到相应的形状。可以去参考官网像素赋值和Draw的方法。
效果图
放两张效果图睡觉了
原图
普通ROI
Mask1
Mask2