目录
知识讲解:
掩码:
Mat.SetTo()
Rect类:
Mat.CopyTo()
思路:
源码(注释很详细,慢慢看):
掩码(Mask)是一个与原始图像相同尺寸的矩阵,用于控制图像的处理。掩码中的每个像素值对应着原始图像中的一个像素位置,它可以取不同的像素值来表示不同的信息。
在OpenCV中,掩码通常是一个单通道的图像,像素值的范围通常是0到255。掩码中的像素值决定了对应位置的像素是否参与到特定的图像处理操作中。
掩码操作是指在图像处理过程中,根据掩码的像素值来控制图像的处理或选取感兴趣的区域。在掩码操作中,对于掩码中像素值为非零的位置,对应原始图像中的像素将被处理或选取,而对于掩码中像素值为零的位置,对应原始图像中的像素将被忽略或遮蔽
设置矩阵(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图像(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);
}
}
}
结果图: