蓝色天空等级状况识别(实验版本)--openCVsharp
本文基于OpenCvSharp与.net 4.0以及部分图形图像基础知识。
随着社会进步,人类对大自然的索取日益加剧,少儿时的蓝天碧水时常徘徊在回忆内,凭借着兴趣爱好以及对于图像识别(不涉及机器学习)的实验学习为目的,作此文以记录过程。
大气本身无色透明,当阳光穿过大气层(大气、云粒子)由于瑞利散射的强度与波长的四次方成反比,所以太阳光谱中波长比较短的蓝(450nm左右)紫光比波长较长的红色(650nm左右)散射更明显,而短波中又以蓝光能量最大,所以大气中较粗糙的微粒比较少以分子散射为主(排除近地面气溶胶影响),在大气分子的强烈散射作用下,蓝色光弥漫天空,天空呈现蔚蓝色。
依照“所见即所得”的原理,将摄像头设备(树莓派)定时采集到的图像文件推送至图片解析处理器,对图像文件数字化处理,以判断蓝天实况等级,同时结合地面气象站探测到的温湿风压雨以及能见度数据、四气两颗粒等数据进行分析对比,为以后的下一步计划提供数据理论支持(未接触过预报工作)。
用到的基本知识点(关于图形图像)
OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。16777216(256 * 256 * 256)种
![](https://img2018.cnblogs.com/blog/611831/201909/611831-20190902232809753-1596820131.png)
首先提取四个不同等级(图片背景来源:中国天气网)蔚蓝天、浅蓝天、蓝天、灰白天’蓝色H分量,分别获取四张图片蓝色分量最大最小值(4d.jpg为灰白天,蓝色分量小)
1 public void getSrcImage() 2 { 3 string FilePath = Path.Combine(Application.StartupPath, "src"); 4 Mat mat_srcA = new Mat(FilePath + "\\1a.jpg", ImreadModes.Color); 5 Mat mat_srcB = new Mat(FilePath + "\\2b.jpg", ImreadModes.Color); 6 Mat mat_srcC = new Mat(FilePath + "\\3c.jpg", ImreadModes.Color); 7 Mat mat_srcD = new Mat(FilePath + "\\4d.jpg", ImreadModes.Color); 8 List<int> list_A = GetMinHAndMaxH(mat_srcA);//获取图片1a中所有蓝色分量 9 List<int> list_B = GetMinHAndMaxH(mat_srcB); 10 List<int> list_C = GetMinHAndMaxH(mat_srcC); 11 List<int> list_D = GetMinHAndMaxH(mat_srcD); 12 this.textBox1.Text += (list_A.Max() + " " + list_A.Min() + "\r\n"); 13 this.textBox1.Text += (list_B.Max() + " " + list_B.Min() + "\r\n"); 14 this.textBox1.Text += (list_C.Max() + " " + list_C.Min() + "\r\n"); 15 this.textBox1.Text += (list_D.Max() + " " + list_D.Min() + "\r\n"); 16 } 17 18 /// <summary> 19 /// 转换像素点并且返回H分量所有值类 20 /// </summary> 21 /// <param name="marSrc"></param> 22 /// <returns></returns> 23 public List<int> GetMinHAndMaxH(Mat marSrc) 24 { 25 List<int> NewList = new List<int>(); 26 Mat[] changle = Cv2.Split(marSrc); 27 for (int i = 0; i < changle[0].Rows; i++) 28 { 29 for (int j = 0; j < changle[01].Cols; j++) 30 { 31 Vec3b color = marSrc.Get<Vec3b>(i, j); 32 int b = color.Item0; 33 int g = color.Item1; 34 int r = color.Item2; 35 NewList.Add(r); 36 } 37 } 38 return NewList; 39 }
首先根据HSV将采集到的图像进行分割处理(未完。。。。。。。)