APP下载

利用图像识别技术的积雪辅助判别

2017-01-16卢兴来胡利军李从初颜宗华徐振宇姚浩立

浙江气象 2016年4期
关键词:雪板图像识别图像处理

杨 豪 卢兴来 胡利军 李从初 颜宗华 徐振宇 姚浩立

(1.宁波市气象网络与装备保障中心,浙江 宁波 315012; 2.浙江省大气探测技术保障中心,浙江 杭州 310017)

利用图像识别技术的积雪辅助判别

杨 豪1卢兴来2胡利军1李从初1颜宗华1徐振宇1姚浩立1

(1.宁波市气象网络与装备保障中心,浙江 宁波 315012; 2.浙江省大气探测技术保障中心,浙江 杭州 310017)

提出了一种基于开源计算机视觉库OpenCV的圆形检测方法协助订正自动雪深仪的疑误数据。对测雪板上的图像识别区域依序进行平滑滤波处理、边缘检测、Hough变换圆检测,识别出积雪情况。利用该方法,提高了疑误数据的订正效率。

雪深;图像识别;OpenCV;Hough

0 引 言

近年来,浙江省先后建成了160余套自动雪深观测仪,在浙江省冰雪灾害监测中发挥了重要作用。然而,在实际应用中,发现存在一些错误数据。本文从图像处理的角度出发,对积雪深度图进行有效判别,从而剔除错误数据。

1 雪深监测原理

大部分雪深观测仪的基本原理是利用激光单点测距来测量积雪深度,主要传感器就是激光测距单元。安装时在立柱上固定好测距单元,在立柱前正对着测距单元的地面上安装栅格型测雪板,确保测雪面的水平。调整测距单元使红色激光点照在测雪板中心的圆形测雪点上,以便标定雪深观测基准面,保证雪深观测的准确性。

2 异常数据处理方法

在冬季下雨或是冻雨后,气温降低到了冰点附近,导致湿润的土壤出现结冰膨胀,土壤的冻胀使测雪板被土壤顶起,导致雪深测量出现错误数据。另外,在日常的维护或是标定过程中由于操作不当等原因也可能出现错误数据。

从雪深观测站的海拔高度、当时的气温、湿度条件来人工判断是否可能有降雪和积雪。最为直观的方法是通过采集测雪板上的图像信息直接判断是否确实有积雪。通过图像识别技术可自动从测雪板的图像上识别出是否有积雪现象,提高排查雪深疑误数据效率。

在自然背景条件下通过图像对测雪板上的圆形测雪点进行积雪自动识别具有一定的难度,照明、阴影遮挡、空气污染、气候条件(雨、雾等)都会直接影响到图像识别的准确性。为确保图像识别的准确性,可先截取图像需要识别的区域,过滤掉大部分无关背景,然后进行颜色过滤,转换为灰度图像并做图像平滑处理,减少图像的噪声以利于最终结果的检测。

使用Hough变换方法对预处理的图像进行边缘检测,其原理是利用两个坐标空间之间的变换将一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。使用Hough变换的优点是,检测到一个圆之后就能得到这个圆的位置和半径数据信息,有了这些数据信息就可以用来从测雪板图像上提取出圆形测雪点的区域,然后再针对这个圆形区域进行重点识别。

3 OpenCV辅助判别应用

OpenCV是英特尔公司为实时应用进行优化的C/C++计算机视觉库[1]。它开源、高效、便于移植和扩展,提供多种语言接口,实现了很多图像处理和计算机视觉的通用算法[2]。在其官方网站opencv.org上可以下载到针对不同操作系统的OpenCV。通过编译源代码,生成适合实际生产环境的库文件。

3.1 HoughCircles函数介绍

OpenCV中对圆的检测方法是HoughCircles函数,该方法就是利用Hough变换梯度算法检测出灰度图中的圆。其原函数为:

void cv::HoughCircles(InputArray _image, OutputArray _circles, int method, double dp, double min_dist, double param1, double param2, int minRadius, int maxRadius)

通常情况下,该函数检测圆的中心是有效的。然而,它可能无法找到正确半径。如果知道待测圆的大概半径,就可通过半径范围设置找到合适的圆。

在实际应用中,要注意参数的选择,选择合适的参数得到的圆位置和半径也就越准确。图1a图的边缘检测阈值25,图1b图的边缘检测阈值70,图1c图的边缘检测阈值105。图2a图是图1a的圆检测结果,图2b图是图1b和图1c的圆检测结果。

(a图的边缘检测阈值25、b图的边缘检测阈值70、c图的边缘检测阈值105)图1 不同边缘检测阈值的检测结果

(a图是图1a的圆检测结果、b图是图1b和图1c的圆检测结果)图2 不同边缘检测阈值的圆检测结果

3.2 开发环境搭建

开发环境的搭建工具下载、编译器配置、建立解决方案等。

下载OpenCV源代码和cmake-gui工具,运行cmake-gui.exe,选择OpenCV源代码路径和生成路径。

配置编译器,考虑到图像处理需要大量耗费CPU、GPU和内存资源建议选择Win64。

解决方案生成,点击Finish按钮,CMake开始自动配置,配置结束后显示Configuring done。接着建立解决方案,通过点击Generate按钮自动在x64build下建立解决方案。

启动Visual Studio 2015,打开x64build下的OpenCV解决方案,重新生成解决方案。在解决方案资源管理器中,展开CMakeTarget目录,右键其中的INSTALL工程,选择“仅用于项目”中的“仅生成INSTALL”,在x64build/install/x64/vc14下就可以看到有很多64位环境下的OpenCV库文件。

4 图像处理编程实例

建立基于.Net Framework 4.0的Windows Forms解决方案,在解决方案中添加所需的OpenCV库文件。OpenCV有很多强大的功能,本文叙述利用Hough变换来检测圆形的功能,因此只需要添加opencv_core.dll、opencv_imgproc.dll、opencv_highgui.dll这几个类库文件。引入的64位OpenCV类库,将解决方案生成目标平台修改为x64。

分辨率、宽度、高度、像素位深度、颜色空间是处理图像最基本几个要素。像素位深度、颜色空间很常用,因此将像素位深度和颜色空间转换定义为枚举类型,如:

public enum IplImageDepth :int {U8=8,…}

public enum ColorConversion :int{...Bgr2Gray=6,Gray2Bgr=8,…}

需要用到OpenCV库的函数有下面这些,使用DllImport引入这些函数,并自主扩展成C#的方法:

颜色空间转换代码:

[DllImport("opencv_imgproc248", CallingConvention=CallingConvention.Cdecl)]

internal static extern void cvCvtColor(ArrayLike src, ArrayLike dst, ColorConversion colorCode);

图像高斯平滑代码:

[DllImport("opencv_imgproc248", CallingConvention=CallingConvention.Cdecl)]

internal static extern void cvSmooth(ArrayLike src,ArrayLike dst,SmoothMethod method,int size1,int size2,double sigma1,double sigma2);

图像边缘检测代码:

[DllImport("opencv_imgproc248", CallingConvention=CallingConvention.Cdecl)]

internal static extern void cvCanny(ArrayLike image, ArrayLike edges, double threshold1, double threshold2, int apertureSize);

Hough变换圆形检测代码:

[DllImport("opencv_imgproc248", CallingConvention=CallingConvention.Cdecl)]

internal static extern Seq cvHoughCircles(ArrayLike image, CVHandle circle_storage, HoughCirclesMethod method, double dp, double min_dist, double param1, double param2, int min_radius, int max_radius);

如图3是一张测雪板实景照片,这张受太阳光影响的图像出现了明显的明亮和阴影分界,加大圆检测的难度。

图3 测雪板实景原始照片

因此先截取圆形测雪点附近区域,然后进行图像平滑处理,为后面的圆检测排除无关干扰,同时缩小处理范围以利于节省系统资源开支。图像高斯平滑处理关键代码:

private IplImage SmoothImage(IplImage originalImage)

{

IplImage image=originalImage.GetSubRect(new Rect(190, 150, 200, 200));

∥截取测雪点附近200×200像素区域

Size resolution=image.Size;

IplImage ret=new IplImage(resolution, IplImageDepth.U8, 1);

CvtColor(image, ret, ColorConversion.Bgr2Gray);

int passes=Passes;

∥平滑重复次数,此处的Passes为来自指定参数配置

int x=XKernel;

∥一般为卷积核的水平方向直径(选择高斯平滑时必须为奇数),此处的Xkernel来自实际应用的指定参数配置

int y=YKernel;

∥在简单/非尺度变换的高斯模糊的情况下,如果y的值为零,则表示其被设定为x,此处的YKernel为来自指定参数配置

for (int i=0; i < passes; i++)

{OpenCV.Smooth(ret, ret, SmoothMethod.Gaussian, x, y, 0, 0); }

return ret;

}

实际平滑后的输出图像如图4。

图4 高斯平滑处理好的图像

接着对高斯平滑后的图像进行边缘检测,图像边缘检测的关键代码如下:

IplImage canny=new IplImage(resolution, IplImageDepth.U8, 1);

OpenCV.Canny(smoothResult, canny, Math.Max(cannyThreshold/2, 1), cannyThreshold, 3);

∥其中smoothResult为图像平滑处理返回的结果,cannyThreshold为来自指定参数的边缘检测阈值

图5a为对指定区域进行边缘检测的结果,图5b图为整幅图像进行边缘检测的结果,在这一步中可以很明显可以看出,图5b中的一些无光边缘会为后面的圆检测带来很大的干扰。因此,在这个实际应用中截取指定区域的图像显得尤为重要。

(a)指定区域的边缘检测结果;(b)整幅图像的边缘检测结果图5 不同区域的边缘检测结果

将OpenCV中的圆检测C++代码实现成C#代码:

public static Seq HoughCircles(ArrayLike image, CVHandle circleStorage, HoughCirclesMethod method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)

{

var circles=cvHoughCircles(image, circleStorage, method, dp, minDist, param1, param2, minRadius, maxRadius);

if (circles.IsInvalid) return null;

circles.SetOwnerStorage((MemoryStorage)circleStorage);

return circles;

}

然后就可以在.Net Framework框架下轻松调用这个函数检测图像中的圆:

public static Seq DetectCircles(IplImage pImage, HoughDetectionSettings pSettings)

{

Seq ret;

try{

MemStorage storage=new MemStorage(0);

ret=OpenCV.HoughCircles(pImage, storage, HoughCirclesMethod.Gradient,dp,minDistance,cannyThreshold,accuThreshold,minRadius,maxRadius);

}catch{throw;}

return ret;

}

最后,把这些圆从原图中标识出来:

public static void DrawCircles(IplImage pImage, Seq circles)

{

try{

int count=circles.Count;

for (int i=0; i < count; i++)

{

float[] p=new float[3];

Marshal.Copy(pCircles.GetElement(i), p, 0, 3);

CV.Circle(pImage,new Point((int)Math.Round(p[0]), (int)Math.Round(p[1])), 3, new Scalar(0, 255, 0),-1,LineFlags.Connected8, 0);

CV.Circle(pImage, new Point((int)Math.Round(p[0]), (int)Math.Round(p[1])), (int)Math.Round(p[2]), new Scalar(255, 0, 0), 3, LineFlags.Connected8, 0);

}

}catch{throw;}

}

如图6所示,为最终实际测雪点的圆检测结果。

图6 实际的圆检测结果

有了这个圆形关键区域,一般就可以认为不存在积雪。但是也可能下了薄薄的一层雪却还保留着这个圆,因此还要进一步对这个圆形区

域进行色彩识别等。进行色彩识别需要对图像进行色彩空间转换、二值化处理、膨胀腐蚀处理等[3]。最终明确测雪点上是否覆盖了雪,从而协助辅助判断自动雪深观测仪当前实时数据是否为疑误数据。

5 结 语

随着自动雪深观测站和雪深实景监控的大量部署,应当充分发挥雪深实景监控的作用从而确保雪深数据准确可靠。为了达到这个目的,本文对基于OpenCV实现对测雪点的智能识别的关键方法进行了详细分析,利用OpenCV中的多种图像处理功能辅助协助处理雪深观测站的疑误数据。但现有的图像处理算法仍有不足之处,在较为复杂的自然环境下,由于光线、遮挡等复杂情况都会对图像处理结果产生影响。因此,提高识别的准确率是应用中的难点,需要对OpenCV中算法做进一步研究和扩展。

[1] 于仕琪,刘瑞祯.学习OpenCV(中文版)[M].北京:清华大学出版社,2009.

[2] 方玫,喻擎苍,李华强,等.C++Builder下基于OpenCV的数字图像的处理[J].计算机工程与设计,2008,29(4):882-884.

[3] 刘洁,冯贵玉,张汗灵.一种图像处理和计算机视觉的开发工具[J].计算机仿真,2006,23(11):305-307.

2016-03-28

猜你喜欢

雪板图像识别图像处理
人工智能辅助冠状动脉CTA图像处理和诊断的研究进展
和雪人一起玩
基于Resnet-50的猫狗图像识别
基于ARM嵌入式的关于图像处理的交通信号灯识别
高速公路图像识别技术应用探讨
基于图像处理的机器人精确抓取的设计与实现
图像识别在物联网上的应用
机器学习在图像处理中的应用
图像识别在水质检测中的应用
新型推雪板