风机桨叶故障诊断(二) 获取图像几何主方向

昨天,我将视频资源按帧抽取并筛选得到了可以用来提取样本的图像库。今天还是进行项目的准备工作。当我们拿到一张图片,我们的软件要做的大致可以分为三个步骤:从原图中识别桨叶——从桨叶中寻找故障——诊断故障类型。

我们第一步要识别的核心物体是桨叶,首先桨叶的运动是有其特点的,它绕着一个轴在旋转,所以我们得到的图像中桨叶的方向是360°任意的。就如下图所示:

        

我考虑到由于样本数量并不庞大且多样,设计一个算法识别出一个物体是否为桨叶(且提供的桨叶图像方向任意)的方案并不理想。我感觉如果我们对于任意的桨叶图像,能够识别出桨叶所指的方向,然后将其统一旋转到水平方向来归一化样本,应该是个不错的选择!

现在的问题就是,如何将图像中物体的几何主方向提取出来。

首先我们想提取桨叶的几何轮廓信息,而要排除背景等因素的干扰。考虑使用边缘提取算法。下面我们均以下图所示桨叶为例,展示算法的结果

下图是采用不同算子进行边缘提取后的结果

注:上图所示结果在边缘提取前进行了高斯滤波,我在试验了批量样本后发现在边缘提取前进行滤波是必要的,可以排除背景中包括云层等因素的影响。下面是某个桨叶图像直接提取的结果(未滤波)

进行了大量的探索之后我们发现:

1.在边缘提取前有必要进行滤波,我使用的是高斯滤波

2.边缘提取时sobel算子和roberts算子表现比较好,所以后面的边缘提取我将采用sobel算子,我再赘述。

到这里,我们得到了桨叶的几何轮廓信息,就像下图所示,怎么从中得到桨叶的方向呢?

我们可以看到桨叶的几何轮廓非常具有特点,大致由两条角度近似的直线相交在一起。可以看出,这样的轮廓,其具有明显的像素值的梯度方向,也就是与两条角度近似直线方向的垂直方向。换个角度想,某个角度的梯度大小与频率域的某个方向的总能量大小时对应的。所以我们可以用二维傅里叶变换将图像变换到频率域,用结果求出对应的能量谱,将频率域沿原点上半平面分180份(因为下半平面与上半平面的角度是一一对应的,所以只考虑上半平面就可以了),分别计算每一份小扇形所包含的区域内的能量总和,也就代表着这个角度上所包含的能量大小。

上图边缘提取结果再进行二维傅里叶变换后的能量谱如下图所示(图像中心对应于0频率),可以明显看出能量主要集中在水平方向。

我们取180个角度中能量最大的那个作为我们的主方向输出,即可完成算法。算法输出的主方向角度和对应的桨叶图像示例如下:

           41°

                 1°

                     135°

由上面的结果可以看出,对于识别桨叶所指角度的问题,这个方法十分有效且可靠。这样,我们拿到一个桨叶图像后,即可调用算法识别主方向,然后将其旋转到水平方向,这样我们的样本就得到了归一化,相信之后的预测算法能够表现的更好。

不过我们还可以注意到一个问题,算法对于负角度的桨叶输出结果是与之对应的正角度,在后面的工作中,应该要再用一个方法区分一下正反。

识别图像中物体主方向算法的matlab实现如下:

function [mdex] = MainDirec(a)
%根据图像边缘信息估计纹理主方向%若是彩色图像,将其变换为灰度图像
if(size(a,3)~=1)a=rgb2gray(a);
end%使用sobel算子进行边缘提取
[w,h]=size(a);
edge_a=edge(a,'sobel');%注:fft2是2维离散傅立叶变换
% 傅里叶变换后,如果使用fftshift命令,0频率分量将会移到坐标中心
fedge_a=fftshift(fft2(edge_a));%求傅里叶变换的实部、虚部
realf=real(fedge_a);
imagf=imag(fedge_a);
%求傅里叶变换的能量
pfa=sqrt(realf.^2+imagf.^2);
%绘制出能量谱看下
imshow(pfa);%dhist用来记录每个角度上的能量
dhist=zeros(1,180);%0频率分量出的坐标(坐标中心)
x0=w/2; y0=h/2;for i=1:wfor j=1:h% 函数 theat=atan2(imagf,realf); 将 theat 归一化到 [0,pi]temp=atan2(j-y0,i-x0);if(temp<0)temp=temp+pi;end%round 向最近的整数取整%mod(a,b)就是求的是a除以b的余数%下面的一行代码将[0,pi]的角度换回[0,179],这样temp+1的范围就是[1,180]temp=mod(round(temp*180/pi),180);%dhist用来记录每个角度上的能量%将当前位置的能量累加到记录当前位置所属角度的能量的变量dhist中dhist(temp+1)=dhist(temp+1)+pfa(i,j);end
end% %将精确的能量谱简化成分段的形式
% dsp=[0:10:170;10:10:180];
% hist=zeros(1,18);
% for i=1:180
%     for k=1:18
%         if(i>dsp(1,k) && i<=dsp(2,k))
%             hist(k)=hist(k)+dhist(i);
%         end
%     end
% end
% [mhist,mdex]=max(hist);[mhist,mdex]=max(dhist);end

风机桨叶故障诊断(二) 获取图像几何主方向相关推荐

  1. 风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS

    风机桨叶故障诊断(七)滑动窗与非极大值一直NMS 到目前为止,我已经利用自编码神经网络提取特征后训练得到了BP神经网络(参见:点击打开链接),且在测试样本集上表现不错.下面我们就要应用到实际中来检验算 ...

  2. 风机桨叶故障诊断(六) 利用自编码器进行特征学习

    风机桨叶故障诊断(六) 利用自编码器进行特征学习 在之前的工作中,我已经初步构建了三层的BP神经网络,并已经从样本集的选取,模型的选择(隐含层神经元个数),和输出层神经元阈值选择这几个方面对桨叶的识别 ...

  3. 风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试

    风机桨叶故障诊断(五) 修改隐含层神经元个数的尝试 我们已经为训练一个更为稳健的神经网络做好了样本的准备工作,那么我们开始下一步的工作吧! 我们已经有了样本集,目前我筛选出来了247个正样本,652个 ...

  4. 风机桨叶故障诊断(四) 正负样本准备——从图像中随机扣图

    风机桨叶故障诊断(四)                                             正负样本准备--从图像中随机扣图 在之前的工作中,我们已经训练了一个400×25×2的三 ...

  5. 风机桨叶故障诊断(三) 识别桨叶——初步构建BP神经网络

    风机桨叶故障诊断(三)  识别桨叶--初步构建BP神经网络 新的一天,希望有好的运气.今天开始着手系统的第一个模块,从一幅图像中寻找到桨叶所在的位置.第一直觉我们的识别任务属于难度比较大,干扰因素多的 ...

  6. 风机桨叶故障诊断(一) 样本的获取

    风机桨叶故障诊断(一) 样本的获取      今天团队接了个新项目,做一个风机桨叶故障诊断系统.虽然马上就是准备考研的关键期了,可是一想到这是我学习了机器学习后遇到的第一个实际项目,我觉得参与进来,也 ...

  7. OpenCASCADE:Modeling Data之二维几何

    OpenCASCADE:Modeling Data之二维几何 Geom2d包定义了 2dspace 中的几何对象.所有几何实体都经过 STEP 处理.对象通过引用处理. 特别是,Geom2d包提供了以 ...

  8. #第六章 曲率二维表达的拟合应用 ​一、四维时空曲率的二维几何表达

    这又是一个麻烦的研究方向,四维影响的曲率一般都是通过函数计算出来的结果,如何在二维的几何平面直接用几何的方法表达这个曲率影响呢?不知道有多少人想过这么"无聊"的问题.笔者利用波的向 ...

  9. java定义一个接口shape_java声明一个接口Shape2D用来实现二维几何形状类Circle和Rectangle。...

    java声明一个接口Shape2D用来实现二维几何形状类Circle和Rectangle.10 匿名网友2015.05.20浏览371次分享举报 1.声明一个接口Shape2D用来实现二维几何形状类C ...

最新文章

  1. Bleve:来自Couchbase、基于Go语言的全文索引与检索库
  2. Fragment之间的通信
  3. java学习类的笔记
  4. 软考考前注意事项及答题技巧
  5. QT中的事件传递顺序小论
  6. linux之file命令总结
  7. 将十进制数转为N进制的方法
  8. 【LeetCode】24. Swap Nodes in Pairs
  9. [人工智能]隔墙有眼,吓屎了
  10. php pcre回溯攻击,PHP利用PCRE回溯次数限制绕过某些安全限制 | 码农网
  11. 专访世纪互联:公共云才是真正云计算
  12. 蓝桥杯 ALGO-112 算法训练 暗恋
  13. Access入门之索引查询
  14. mongodb 日期分组聚合_MongoDB基于时间段的聚合查询
  15. 数据库自定义聚合函数(求和、标准差、平均值、几何平均值、几何标准差、偏度系数、峰度系数)
  16. python输入某年某月某日是一年的第几天_Python小例子——输入某年某月某日,判断这一天是这一年的第几天...
  17. scrapy介绍及使用
  18. 回归中的相关度和R平方值
  19. 史上最全的Nokia3250参数
  20. nodejs npm报错 重装 解决方法

热门文章

  1. 编译过程中的链接地址对最终编译镜像文件的影响
  2. ConcurrentHashMap源码剖析(1.8版本)
  3. SQL Server数据库大型应用解决方案总结【转】
  4. (相当全面)node.js 初体验
  5. 开源的关系型数据持久化组件
  6. 免费 Flash 留言板 -Powered by Kong
  7. Bmp格式与编程读取解析
  8. 7-2 是否完全二叉搜索树 (30分)
  9. python匿名函数里用for_请问这段Python代码如何用匿名函数简化?
  10. TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'