本文测试环境:
win10 64位
vistual studio 2019
Emgu CV 4.6.0
环境配置准备:
1 新增控制台项目,.net framework为4.7.2
2 把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下
3 项目选择x64
4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll
具体配置参考:
Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客
下面的内容转自:EmguCV-第10讲-对比度亮度调整与通道分离_YADONCHEN的博客-CSDN博客
1 对比度和亮度调整
代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Image<Bgr, Byte> chunfen1 = new Image<Bgr, Byte>("chunfen1.png");
Image<Bgr, Byte> outPutImage = new Image<Bgr, Byte>(new System.Drawing.Size(chunfen1.Width,chunfen1.Height));
double contract = 1.2;
int brighness = 2;
for (int i = 0; i < chunfen1.Rows; i++)
{
for (int j = 0; j <chunfen1.Cols; j++)
{
int B=(int)((int)chunfen1.Data[i, j, 0] * contract) + brighness;
int G = (int)((int)chunfen1.Data[i, j,1] * contract) + brighness;
int R = (int)((int)chunfen1.Data[i, j,2] * contract) + brighness;
outPutImage.Data[i, j, 0] =(byte)B;
outPutImage.Data[i, j, 1] = (byte)G;
outPutImage.Data[i, j, 2] = (byte)R;
}
}
CvInvoke.Imshow("outPutImage", outPutImage);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
}
}
chunfen1.png原图为:
程序运行结果为:
2 通道分离
代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat chunfen1 = CvInvoke.Imread("chunfen1.png");
Mat []channelArray=chunfen1.Split();
//显示B通道
CvInvoke.Imshow("B", channelArray[0]);
CvInvoke.WaitKey(0);
//显示G通道
CvInvoke.Imshow("G", channelArray[1]);
CvInvoke.WaitKey(0);
//显示R通道
CvInvoke.Imshow("R", channelArray[2]);
CvInvoke.WaitKey(0);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
}
}
chunfen1.png原图为:
程序运行结果如下:
看结果,B、G、R三通道单独拿出来显示,显示为灰度图
3 通道合并
代码如下:
//二值化处理,第一个参数为输入图片,第二个参数是输出图片,100为二值化的临界值,255为二值化的最大值
CvInvoke.Threshold(channelArray[0], channelArray[0], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Mat chunfen1 = CvInvoke.Imread("chunfen1.png");
Mat []channelArray=chunfen1.Split();
Mat outPutMat = new Mat();
//二值化处理,第一个参数为输入图片,第二个参数是输出图片,100为二值化的临界值,255为二值化的最大值
CvInvoke.Threshold(channelArray[0], channelArray[0], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.Threshold(channelArray[1], channelArray[1], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.Threshold(channelArray[2], channelArray[2], 100, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
VectorOfMat vectorOfMat = new VectorOfMat();
vectorOfMat.Push(channelArray[0]);
vectorOfMat.Push(channelArray[1]);
vectorOfMat.Push(channelArray[2]);
CvInvoke.Merge(vectorOfMat, outPutMat);
CvInvoke.Imshow("outPutMat", outPutMat);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
}
}
运行结果如下: