目次
ソースコード (コメントは非常に詳細なので、ゆっくり読んでください):
知識の説明:
マスク:
マスクは元の画像と同じサイズの行列で、画像処理を制御するために使用されます。マスク内の各ピクセル値は元の画像内のピクセル位置に対応し、異なる情報を表すために異なるピクセル値を取ることができます。
OpenCV では、マスクは通常、0 から 255 の範囲のピクセル値を持つ単一チャネルの画像です。マスク内のピクセル値により、対応する位置のピクセルが特定の画像処理操作に参加するかどうかが決まります。
マスク操作とは、画像処理プロセス中にマスクのピクセル値に基づいて画像の処理を制御したり、対象領域を選択したりすることを指します。マスク操作では、ゼロ以外のピクセル値を持つマスク内の位置については、元の画像内の対応するピクセルが処理または選択され、ゼロのピクセル値を持つマスク内の位置については、元の画像内の対応するピクセルが処理または選択されます。元の画像が処理または選択されます。無視または不明瞭になります。
Mat.SetTo()
行列 (Mat) のすべての要素を指定された値に設定します。
public void SetTo(Scalar value);
画像ピクセルのチャネル値を表すために使用される複数の要素を含む配列であるScalar
オブジェクトをパラメーターとして受け入れます。Scalar
たとえば、グレースケール イメージの場合、Scalar
オブジェクトにはグレー値を表す要素が 1 つだけありますが、カラー イメージの場合、Scalar
オブジェクトには青チャネル、緑チャネル、赤チャネルの値を表す 3 つの要素があります。
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()
マスク ( )のピクセル値src
に従ってマット画像( ) をコピーし、結果を別の画像に保存します ( ) mask
dst
public void CopyTo(OutputArray dst, InputArray mask = null)
1.dst
コピーされた画像データを保存するために使用されるターゲット画像です。
2.mask
マスクを指定するオプションのパラメータです。マスクはsrc
元のイメージ ( ) と同じサイズの行列で、イメージのコピーを制御するために使用されます。
パラメータが指定されている場合mask
、mask
の対応する位置のピクセルsrc
値が 0 以外 (non-0) の場合にのみ、 の対応する位置のピクセル値がコピーされますdst
。mask
の対応する位置のピクセル値がゼロ (0) の場合、対応する位置のピクセル値はコピーされません。これはマスクされることと同じです。
mask
パラメーターが指定されていない場合(つまり、 null
)、すべてのピクセル値が にコピーされますdst
。これは、マスキング操作がないことと同等であり、完全なコピーが実現されます。
アイデア:
RAW画像を読み込み、マスクのピクセル値を設定して処理する領域を指定するマスクマトリクスを作成します。次に、マスクのピクセル値に従って元の画像がコピーされて処理結果画像が得られ、最終的に元の画像と結果画像がウィンドウに表示されます。
ソースコード (コメントは非常に詳細なので、ゆっくり読んでください):
「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);
}
}
}