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

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

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

    我们第一步要识别的核心物体是桨叶,首先桨叶的运动是有其特点的,它绕着一个轴在旋转,所以我们得到的图像中桨叶的方向是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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

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

风机桨叶故障诊断&#xff08;四&#xff09; 正负样本准备——从图像中随机扣图 在之前的工作中&#xff0c;我们已经训练了一个400252的三层BP神经网络&#xff0c;通过这个基础的神经网络进行了误差分析&#xff0c;对我们的问题有了更深刻的认识。现在我们要开始不断完善我…

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

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

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

风机桨叶故障诊断&#xff08;六&#xff09; 利用自编码器进行特征学习 在之前的工作中&#xff0c;我已经初步构建了三层的BP神经网络&#xff0c;并已经从样本集的选取&#xff0c;模型的选择&#xff08;隐含层神经元个数&#xff09;&#xff0c;和输出层神经元阈值选择这…

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

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

Distinctive Image Features from Scale-Invariant Keypoints-SIFT算法译文

本文全篇转载自如下博客&#xff0c;感谢博主的无私分享 http://www.cnblogs.com/cuteshongshong/archive/2012/05/25/2506374.html ------------------------------------------------------------------------------------------------------ 从尺度不变的关键点选择可区分的…

将图像绘制成3维立体散点图

matlab源代码&#xff1a; Iimread(F:\绝缘子识别\绝缘子红外test图片\test (50).jpg); Irgb2gray(I); [wd,len]size(I); interval10; %设置绘制散点图的间隔&#xff0c;全部绘出会很卡 x[]; y[]; z[]; numfloor((len-1)/interval)1;%计算在当前间隔下图像的每一行…

二叉树的非递归遍历|前中后序遍历

二叉树的非递归遍历 文章目录 二叉树的非递归遍历前序遍历-栈层序遍历-队列中序遍历-栈后序遍历-栈 前序遍历-栈 首先我们应该创建一个Stack 用来存放节点&#xff0c;首先我们想要打印根节点的数据&#xff0c;此时Stack里面的内容为空&#xff0c;所以我们优先将头结点加入S…

C#灰度图转伪彩色图

/// <summary>/// 伪彩色图像构造器/// </summary>public class PseudoColorImageBuilder{/// <summary>/// 铁红色带映射表/// 每一行代表一个彩色分类&#xff0c;存放顺序是RGB/// </summary>public static byte[,] ironTable new byte[128, 3] {{…

砥志研思SVM(二) 拉格朗日乘子法与KKT条件

[1]最优化问题中的对偶性理论 [2]拉格朗日乘子法(上) [3]拉格朗日乘子法(下)

VS2015上配置opencv2.4.11

VS2015上配置opencv2.4.11版方法总结 最近给电脑重装了系统&#xff0c;需要的软件各种装。今天阅读了很多网上的博客&#xff0c;几经波折完成了opencv的配置。配置opencv与其他函数包或者软件相比算是麻烦的了&#xff0c;可能出现的问题也是五花八门&#xff0c;所以针对我的…

热传导方程的差分格式原理与matlab实现

function [ ] ParabolicEquation( h,k ) %求解抛物型方程中的一种&#xff1a;热传导方程 %h:x轴步长 %k:t轴步长rk/(h*h);%网格比 Mxfloor(1.0/h)1;%网格在x轴上的节点个数&#xff08;算上0&#xff09; Ntfloor(1.0/k)1;%网格在t轴上的节点个数&#xff08;算上0&#xff…

如何开发一个扫雷小游戏?

如何用C#开发一个扫雷小游戏&#xff1f; 十分自豪的说&#xff0c;计算机编程就是变魔术&#xff0c;每一个coder都是一个魔术师。 初学C#的时候&#xff0c;我相信很多人都和我一样&#xff0c;学会了基本语法&#xff0c;掌握了基本的数据结构&#xff0c;也见过了不少微软…

在emIDE中创建STM32项目

&#xfeff;emIDE是一个开源的嵌入式集成开发环境&#xff0c;基于Code::Blocks开发&#xff0c;能够支持多个平台和多个厂家的嵌入式硬件&#xff0c;继承了Code::Blocks的优点。 下载emIDE并安装&#xff0c;也可选择绿色版。若需要调试则需安装J-Link GDB Server。 1、打…