c# opencvsharp学习笔记(3)兴趣区域ROI,图像叠加,操作像素点

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。以上来自百度百科。

lenna太丑了,下面换成滚滚。

1.定义兴趣区域

Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);
Rect roi = new Rect(400, 300, 400, 400);//首先要用个rect确定我们的兴趣区域在哪
Mat ImageROI = new Mat(panda, roi);//新建一个mat,把roi内的图像加载到里面去。
Cv2.ImShow("兴趣区域", ImageROI);
Cv2.ImShow("滚滚",panda);
Cv2.WaitKey();

兴趣区域实际上就是一个mat对象,方便我们完成下一步的工作。

2.图像叠加

    现在要把我们选取的兴趣区域叠加在原图上。这里会涉及到一个函数copyto,

  // 摘要:
        //     Copies the matrix to another one.将矩阵复制到另一个
        //
        // 参数:
        //   m:
        //     Destination matrix. If it does not have a proper size or type before the operation,
        //     it is reallocated.目标矩阵。如果操作前没有合适的尺寸或型号,这是重新分配。
        public void CopyTo(Mat m);如果直接等于的话,对等于中的一个矩阵进行操作,其它矩阵也会被修改,他们是是指向同一个数据缓冲区
        //
        // 摘要:
        //     Copies the matrix to another one.
        // 参数:
        //   m:
        //     Destination matrix. If it does not have a proper size or type before the operation,
        //     it is reallocated.
        //
        //   mask:
        //     Operation mask. Its non-zero elements indicate which matrix elements need to
        //     be copied.操作掩码,它的非零元素表示哪些矩阵元素需要被复制。
        public void CopyTo(Mat m, Mat mask);

第一种重载一般就是原封不动的叠加上去,第二种复杂点,下面再说。

 Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);

 Rect roi = new Rect(400, 300, 400, 400);//首先要用个rect确定我们的兴趣区域在哪
 Mat ImageROI = new Mat(panda, roi);//新建一个mat,把roi内的图像加载到里面去。
Rect rect = new Rect(0,0, ImageROI.Rows, ImageROI.Cols);//定义第一个矩阵,前2个参数是要放的位置,后面插入图片的大小
Mat pos = new Mat(panda, rect);
ImageROI.CopyTo(pos);
            
Cv2.ImShow("滚滚",panda);
Cv2.WaitKey();

把插入的图片复制到pos,而panda却被修改了。这是因为mat pos =new (panda,rect),使用等于号连接,它并没有新建一个图片,而是pos带着rect指向panda,所以在修改pos的时候也就相当于修改了panda。有点指针的感觉啊。

emmm就是这样。

第二种

c# opencvsharp学习笔记(3)兴趣区域ROI,图像叠加,操作像素点_第1张图片

  Mat panda = new Mat(@"滚滚.png", ImreadModes.AnyColor);
            
  Mat ImageROI = new Mat(@"huaji.png",ImreadModes.Color);//读取滑稽
  Mat mask = ImageROI.CvtColor(ColorConversionCodes.BGR2GRAY);//新建一个掩码接收变成灰度图的滑稽
  Cv2.Threshold(mask, mask, 240,255, ThresholdTypes.BinaryInv);//灰度图二值化,高于240的变成黑色,其它白色

  Rect rect = new Rect(430,300, ImageROI.Rows, ImageROI.Cols);//复制到哪去
  Mat pos = new Mat(panda, rect);
  ImageROI.CopyTo(pos, mask);//掩码黑色的区域不复制

  Cv2.ImShow("mask", mask);
  Cv2.ImShow("滚滚", panda);
  Cv2.WaitKey();

cvtcolor是颜色转换,颜色空间转换的函数,例如把BGR(注意opencv是BGR而不是RGB)和HSV互转。当然彩色变灰色也可以,BGR2GARY中间2就是to的意思。

Threshold阈值函数


五个参数分别是源,目的地,阈值,最大值,阈值类型。

常用的阈值类型有binary,和binaryinv

选用binary的时候是某个像素的灰度大于阈值的时候,这个像素的灰度变成最大值,小于的时候则为0.

选用binaryinv的时候与之相反,其它类型百度。

c# opencvsharp学习笔记(3)兴趣区域ROI,图像叠加,操作像素点_第2张图片


你可能感兴趣的:(opencvsharp,c#)