目录
一、图形处理
1、创建图像
Mat image = new Mat();
2、图像的读取、保存、展示
1.1、图像读取(路径)
string path=@"E:\\0.jpg"; //图片路径
Mat imageRead = CvInvoke.Imread(Path); //读取图片
1.2、图像读取(图片)
Mat imageRead = CvInvoke.Imread("0.jpg"); //读取图片
需将图片放置与项目起始位置
2、图像保存
//path:要保存的文件路径
//image:要保存的图片
CvInvoke.Imwrite(Path, image); //保存图片
3、图片展示
//Image:展示窗体的名称
//image:要展示的图片
CvInvoke.Imshow("Image", image); //展示图片
//表示无限等待,直到有按键按下结束(如果不加这句,执行时窗口可能一闪而过;)
CvInvoke.WaitKey();
//CvInvoke.waitKey(5000),表示5000毫秒即5秒后自动关闭窗口。
3、绘制文本和绘制图形
1、绘制线
//参数: 输入图片,起始点,结束点,颜色,线条粗细
CvInvoke.Line(image,new Point(100,100),new Point(130,130),new MCvScalar(0,255,255),15);
2、绘制矩形
//矩形 参数:x,y,长,宽
Rectangle rectangle = new Rectangle(200,10,50,50);
//绘制矩形 参数:输入图片,矩形,颜色,线条粗细
CvInvoke.Rectangle(image,rectangle,new MCvScalar(0,255,255),5);
3、绘制圆
//参数:输入图片,圆心坐标,半径,颜色,线条粗细(为-1时则填充)
CvInvoke.Circle(image,new Point(140,140),10,new MCvScalar(255,255,255),5);
4、绘制多边形
//多边形的各个点坐标
Point[] points = new Point[] {new Point(100,200),new Point(150,200),new Point(200,150),new Point(125,100),new Point(50,150)};
//绘制多边形 参数:输入图片,各个点坐标,是否封闭,颜色,线条粗细
CvInvoke.Polylines(image,points,true,new MCvScalar(0,255,255),3);
5、绘制文本
//图片 参数: 长,宽,颜色类型,通道数
Mat image = new Mat(200,500,DepthType.Cv8U,3);
image.SetTo(new Bgr(255,0,0).MCvScalar); //颜色
//绘制文本 参数:输入图片,文本,左下角坐标,字体类型,字体比例,颜色,粗细
CvInvoke.PutText(image, "hello world", new Point(10, 80),FontFace.HersheyComplex,2,new Bgr(0,255,255).MCvScalar,4);
3、颜色提取
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
Bgr color = img[e.Y, e.X]; //获取该坐标的颜色
label1.Text = color.ToString(); //将该坐标颜色输出给label
//设置图片的长、宽、颜色
Image<Bgr, Byte> image = new Image<Bgr, byte>(pictureBox2.Width,pictureBox2.Height,color);
//将图片转化为pictureBox控件的图片
pictureBox2.Image = image.ToBitmap();
int num = 10; //差值
ScalarArray max = new ScalarArray(new MCvScalar(color.Blue + num, color.Green + num, color.Red + num));
ScalarArray min = new ScalarArray(new MCvScalar(color.Blue - num, color.Green - num, color.Red - num));
Mat mat = new Mat();
//在max到min范围的全为白,其他部分全为黑
CvInvoke.InRange(img,min,max,mat);
imageBox1.Image = mat;
}
4、灰度图片
Mat grayImage = new Mat(); //创建图片
//参数 :输入图片、输出图片、灰度格式
CvInvoke.CvtColor(imageRead, grayImage, ColorConversion.Rgb2Gray); //转化为灰度图像
5、二值化(先将图片转化为灰度图像)
Mat image = new Mat(); //创建图片
//参数:输入图像,输出图像,阈值,灰度的最大值,阈值类型
CvInvoke.Threshold(grayImage, image, 70, 255, ThresholdType.BinaryInv);
6、图像差
Image<Bgr, Byte> result = image1.AbsDiff(image2); //image1像素减去image2像素
7、图像合成
//像素加起来255,所以大部分是白色
//合成图片 参数:输入图片1,输入图片2,输出图片
CvInvoke.Add(readImage1, readImage2, image1);
//合成图片 参数:输入图片1,权重,输入图片2,权重,伽马值(光的测量值),输出图片
CvInvoke.AddWeighted(readImage1, 0.1, readImage2, 0.5, 0, image1);
8、把图像通过直方图显示
Image<Bgr, byte> image = new Image<Bgr, byte>(fileName);
//1、通过UI的HistogramBox直接显示处理
//直方图
//删除所有控制
histogramBox1.ClearHistogram();
//获取直方图 参数:输入图片,箱子数量(灰度0-255)
histogramBox1.GenerateHistograms(image,256);
histogramBox1.Refresh();
histogramBox1.Show();
//2、直方图计算
Image<Bgr, byte> image1 = new Image<Bgr, byte>(300, 300, new Bgr(0, 0, 0));
Image<Gray, byte> grayImage = image.Convert<Gray, byte>();
//一种均匀的多维密集直方图 参数:箱子数量(多少不同像素值就有多少个箱子,例如灰度图像就是256个),像素范围值
DenseHistogram dense = new DenseHistogram(256,new RangeF(0,255));
//将图像投影到直方图箱 参数:需要计算的图像的数组,true(则直方图在开始时不会清除。此功能允许用户从多个图像中计算单个直方图,或在线更新直方图),有无掩模
dense.Calculate(new Image<Gray, byte>[] { grayImage }, true, null);
//获得数据。 返回 float[] 数组。
float[] data = dense.GetBinValues();
//获取最大值
float max = data[0];
for (int i =1;i<data.Length; i++)
{
if (data[i] > max)
{
max = data[i];
}
}
//计算
for (int i=0;i<data.Length;i++)
{
data[i] = data[i] * 256 / max;
image1.Draw(new LineSegment2DF(new PointF(i+20,255),new PointF(i+21,255-data[i])),new Bgr(255,255,255),2);
}
imageBox2.Image = image1; //通过ImageBox显示
9、把单通道图像提取处来
1、BGR提取
VectorOfMat channels = new VectorOfMat();//创建vectorOfmat类型存储分离后的图像(向量)
//将多通道阵列划分为单独的单通道阵列 参数:输入图像,输出图像
CvInvoke.Split(readImage, channels);
InputOutputArray channel = channels.GetInputOutputArray(); //获得数组
Mat B_channel = channel.GetMat(0); //获得第一通道
Mat G_channel = channel.GetMat(1); //获得第二通道
Mat R_channel = channel.GetMat(2); //获得第三通道
imageBox2.Image = B_channel; //显示
imageBox3.Image = G_channel;
imageBox4.Image = R_channel;
2、HSV转换:色相(Hue)、饱和度(Saturation)、明度(Value)
//加载图像
Image<Bgr, byte> readImage = new Image<Bgr, byte>(Application.StartupPath+"\\image\\5.jpg");
Image<Hsv, byte> hsvImage = readImage.Convert<Hsv, byte>();
VectorOfMat channels = new VectorOfMat(); //创建vectorOfmat类型存储分离后的图像
CvInvoke.Split(hsvImage, channels); //通道分离
InputOutputArray mix_channel = channels.GetInputOutputArray(); //获得数组
Mat H_channel = mix_channel.GetMat(0); //获得第一通道
Mat S_channel = mix_channel.GetMat(1); //获得第二通道
Mat V_channel = mix_channel.GetMat(2);//获得第一通道
imageBox2.Image = H_channel; //显示第一通道
imageBox3.Image = S_channel; //显示第二通道
imageBox4.Image = V_channel; //显示第三通道
二、加载图像
//打开加载图像
OpenFileDialog open = new OpenFileDialog();
if (open.ShowDialog() == DialogResult.OK)
{
filename = open.FileName;
pictureBox1.Load(filename);
img= new Image<Bgr, byte>(open.FileName);
}
展示