c#-OpenCvSharp-掩码操作(附源码)

目录

知识讲解:

 掩码:

 Mat.SetTo() 

 Rect类:

  Mat.CopyTo()

思路:

源码(注释很详细,慢慢看):


知识讲解:

掩码:

掩码(Mask)是一个与原始图像相同尺寸的矩阵,用于控制图像的处理。掩码中的每个像素值对应着原始图像中的一个像素位置,它可以取不同的像素值来表示不同的信息。

在OpenCV中,掩码通常是一个单通道的图像,像素值的范围通常是0到255。掩码中的像素值决定了对应位置的像素是否参与到特定的图像处理操作中。

掩码操作是指在图像处理过程中,根据掩码的像素值来控制图像的处理或选取感兴趣的区域。在掩码操作中,对于掩码中像素值为非零的位置,对应原始图像中的像素将被处理或选取,而对于掩码中像素值为零的位置,对应原始图像中的像素将被忽略或遮蔽

Mat.SetTo() 

设置矩阵(Mat)的所有元素为给定的值。 

public void SetTo(Scalar value);

接受一个 Scalar 对象作为参数,Scalar 是一个包含多个元素的数组,用于表示图像像素的通道值。例如,对于灰度图像,Scalar 对象只有一个元素,表示灰度值;对于彩色图像,Scalar 对象有三个元素,分别表示蓝色通道、绿色通道和红色通道的值。

Rect类:

  定义一个矩形的位置和大小,通常用于指定图像中需要处理的特定区域。

public Rect(int x, int y, int width, int height);

eg:
Rect roi = new Rect(100, 100, 200, 150)

参数说明:

  • x:矩形左上角的X坐标。
  • y:矩形左上角的Y坐标。
  • width:矩形的宽度。
  • height:矩形的高度 

Mat.CopyTo()

将一个Mat图像(src)按掩码(mask)的像素值进行拷贝,并将结果保存在另一个图像(dst)中 

public void CopyTo(OutputArray dst, InputArray mask = null)

1.dst 是目标图像,它用于保存拷贝后的图像数据。

2.mask 是可选参数,用于指定掩码。掩码是一个与原图像(src)尺寸相同的矩阵,用于控制图像的复制。

如果提供了 mask 参数,那么只有在 mask 中对应位置的像素值为非零(非0)时,才会将 src 中对应位置的像素值复制到 dst 中。如果 mask 中对应位置的像素值为零(0),则对应位置的像素值不会被复制,即相当于被遮罩掉了。

如果不提供 mask 参数(即为 null),那么所有的像素值都会被复制到 dst 中,相当于没有进行掩码操作,实现了完全的复制。

思路:

 读取一个原始图像,然后创建一个掩码矩阵,通过设置掩码的像素值来指定需要处理的区域。接着,将原始图像按照掩码的像素值进行拷贝,得到一个处理后的结果图像,最后将原始图像和结果图像在窗口中显示出来。

源码(注释很详细,慢慢看):

需要安装“OpenCvSharp4”库才行,不然会报错。

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 掩码操作
{
    class Program
    {
        static void Main(string[] args)
        {
            // 一、读取原始图像
            string imagePath = "C:\\Users\\CGW\\Desktop\\digits\\556.jpg"; //图像路径
            Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
            // 图像读取的错误处理:如果无法读取图像,会输出错误消息并结束程序。
            if (src.Empty())
            {
                Console.WriteLine("无法读取图像:{0}", imagePath);
                return;
            }

            // 二、创建掩码
            //  使用Mat类的构造函数和MatType.CV_8UC1参数创建掩码(初始值为0,与原图像尺寸相同)
            //  掩码的初始值被设置为全零,即所有像素值都为0,这意味着初始时不对图像进行任何处理。
            Mat mask = new Mat(src.Size(), MatType.CV_8UC1, Scalar.All(0));

            // 三、设置矩形区域为掩码中的非零值
            // 设置矩形区域为掩码中的非零值(255),在掩码中指定了一个矩形区域,表示该区域需要进行处理。
            Rect roi = new Rect(100, 100, 200, 150);
            mask[roi].SetTo(new Scalar(255));

            // 四、应用掩码
            //  用Cv2.CopyTo()方法,将原始图像src按照掩码mask的像素值进行拷贝,得到一个新的Mat对象result
            //  在拷贝过程中,只有掩码中对应位置为非零的像素值才会被拷贝到新的图像中,其他位置的像素值保持不变。
            //  从而实现了对原始图像中指定区域的处理。
            Mat result = new Mat();
            src.CopyTo(result, mask);

            //  显示原始图像和处理后的结果
            Cv2.ImShow("Original Image", src);
            Cv2.ImShow("Masked Image", result);

            Cv2.WaitKey(0);
        }
    }
}

 

结果图:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉和机器学习软件库,提供了丰富的图像处理计算机视觉算法。C#语言可以通过OpenCVSharp等第三方库来使用OpenCVOpenCVSharp是一个非常流行的OpenCVC#封装库,它提供了一组C#封装的OpenCV库的API,可以在C#中方便地使用OpenCV的功能。使用OpenCVSharp,您可以访问OpenCV的所有主要模块,包括图像处理计算机视觉,机器学习等。 下面是OpenCVSharp的一个例子,它演示了如何读取图像、转换图像并在图像上绘制矩形: ``` using OpenCvSharp; class Program { static void Main(string[] args) { Mat src = new Mat("image.jpg", ImreadModes.Color); Mat gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); CascadeClassifier classifier = new CascadeClassifier("haarcascade_frontalface_default.xml"); Rect[] faces = classifier.DetectMultiScale(gray); foreach (Rect rect in faces) { Cv2.Rectangle(src, rect, new Scalar(0, 255, 0), 2); } Cv2.ImShow("result", src); Cv2.WaitKey(0); } } ``` 在这个例子中,我们首先读取一张彩色图像 `image.jpg`,然后将其转换为灰度图像。接着,我们使用 `CascadeClassifier` 类检测灰度图像中的人脸,并在图像上绘制矩形。最后,我们显示结果图像并等待用户按下任意键关闭窗口。 这只是OpenCVSharp的一个简单示例,OpenCVSharp还提供了很多其他功能,例如图像处理、图像分割、特征提取、目标跟踪、机器学习等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值