摘要
在 OpenCvSharp 中,你可以使用 Mat 对象的 .At<T> 方法来读取和修改图像的像素值。
正文
nuget 安装 OpenCVSharp
这里OpenCvSharp4.runtime.win 库需要引用,不然会报错
DllNotFoundException: Unable to load DLL 'OpenCvSharpExtern' or one of its dependencies
OpenCvSharp.Extensions 库
private void btnSet_Click(object sender, EventArgs e)
{
// 读取图像
Mat image = Cv2.ImRead("D:\\Video\\C#logo.jpg", ImreadModes.Color);
// 获取图像尺寸
int width = image.Width;
int height = image.Height;
// 遍历图像像素并进行转换
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
//blue,red,green
Vec3b pixel = image.At<Vec3b>(y, x); // 获取像素值
// 假设你想要将像素值的红色通道增加 50
//pixel.Item2 = (byte)Math.Min(pixel.Item2 + 50, 255); // 增加红色通道
pixel.Item0 = 255;
image.Set(y, x, pixel); // 设置像素值
}
}
Mat newImage = new Mat();
// 保存处理后的图像
pictureBox2.Image = BitmapConverter.ToBitmap(image);
// 释放图像资源
image.Dispose();
pictureBox1.Image = Image.FromFile("D:\\Video\\C#logo.jpg");
}
通过索引修改(速度快)
private void btnIndexSet_Click(object sender, EventArgs e)
{
// 读取图像
Mat image = Cv2.ImRead("D:\\Video\\C#logo.jpg", ImreadModes.Color);
Mat.Indexer<Vec3b> indexer = image.GetGenericIndexer<Vec3b>();
for (int y = 0; y < image.Height; y++)
{
for (int x = 0; x < image.Width; x++)
{
Vec3b color = indexer[y, x];
byte temp = color.Item0;
color.Item0 = color.Item2; // 蓝 <- 红
color.Item2 = temp; // 红 <- 蓝
indexer[y, x] = color;
}
}
// 保存处理后的图像
pictureBox2.Image = BitmapConverter.ToBitmap(image);
// 释放图像资源
image.Dispose();
pictureBox1.Image = Image.FromFile("D:\\Video\\C#logo.jpg");
}