精华内容
下载资源
问答
  • IMG_W = 64 # resize图像,太大的话训练时间久 IMG_H = 64 BATCH_SIZE = 20 CAPACITY = 200 MAX_STEP = 10000 # 一般大于10K learning_rate = 0.00005 # 一般小于0.0001 # 获取批次batch train_dir = 'D:/...
  • 前言 ...获取图像包括一下四步: 浏览器从服务器获取html文件。 读取html文件,发现需要获取图像。 浏览器依次获取并显示一个图像。 对页面上每一个图像重复这个过程。 <img>元素 元素介绍

    前言

    这是HTML基础知识的最后一章了。一起来看看有哪些内容吧。

    浏览器处理图像

    浏览器对<img>元素的处理与其他元素稍有不同。在处理如<h1>或<p>元素时,只需要把它们显示出来。不过,浏览器看到一个<img>元素,在显示这个图像之前,必须先获取图像。

    获取图像包括一下四步:

    1. 浏览器从服务器获取html文件。
    2. 读取html文件,发现需要获取的图像。
    3. 浏览器依次获取并显示一个图像。
    4. 对页面上每一个图像重复这个过程。

    <img>元素

    元素介绍
    在这里插入图片描述
    <img>元素中的src属性不仅可以放入相对或绝对路径,也可以放入URL,比如放入一个网站上的某张图片:在这里插入图片描述

    一定要提供候选格式

    <img>元素有一个alt属性,当浏览器无法显示图像时,可以为访问者提供一些提示,告诉它们图像里有什么信息,比如:
    在这里插入图片描述

    调整图像大小

    <img>元素还有一对属性用来调整图像大小:width和height。可以用这些属性提前告诉浏览器你的页面中一个图像的大小,比如:
    在这里插入图片描述

    • 可以提供比图像实际尺寸更大或更小的宽度和高度值,这样浏览器会缩放图像来满足指定大小。
    • 可以只指定width和height中的一个属性。
    • 如果页面中有很大的图像,则这个页面会很难使用,访问者没有办法一次看到完整的图像,滚动也会很麻烦。
    • 剋有通过软件编辑图像大小以适合浏览器。

    使用缩略图
    在这里插入图片描述
    把缩略图变成链接
    在这里插入图片描述

    总结

    在这里插入图片描述

    展开全文
  • 一、简介 根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征...像素级融合一般分为四步完成:预处理、变换、合成

    一、简介

    根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征提取并直接使用。也正是得益于其对信息最大程度上的保留,使其在准确性和鲁棒性上优于其他两级。相比之下,像素级融合获取的细节信息更丰富,是最常用的融合方式。因此,它同样是图像融合领域研究的热点。与此同时,由于其需要的配准精度高,必须达到像素级别。所以像素级图像融合技术对设备要求较高,而且融合过程耗时,不易于实时处理。像素级融合一般分为四步完成:预处理、变换、合成和逆变换。
    在这里插入图片描述
    像素级图像融合主要包括:

    1 基于非多尺度变换的图像融合方法
    1)平均与加权平均方法
    加权平均方法将原图像对应像素的灰度值进行加权平均,生成新的图像,它是最直接的融合方法。其中平均方法是加权平均的特例。使用平均方法进行图像融合,提高了融合图像的信噪比,但削弱了图像的对比度,尤其对于只出现在其中一幅图像上的有用信号。
    2)像素灰度值选大(或小)的图像融合方法
    假设参加融合的两幅原图像分别为A、B,图像大小分别为M*N,融合图像为F,则针对原图像A、B的像素灰度值选大(或小)图像融合方法可表示为
    在这里插入图片描述
    其中:m、n分别为图像中像素的行号和列号。在融合处理时,比较原图像A、B中对应位置(m、n)处像素灰度值的大小,以其中灰度值大(或小)的像素作为融合图像F在位置(m、n)处的像素。这种融合方法只是简单地选择原图像中灰度值大(或小)的像素作为融合后的像素,对待融合后的像素进行灰度增强(或减弱),因此该方法的实用场合非常有限。
    3)基于PCA的图像融合方法
    PCA图像融合方法首先用三个或以上波段数据求得图像间的相关系数矩阵,由相关系数矩阵计算特征值和特征向量,再求得各主分量图像;然后将高空间分辨率图像数据进行对比度拉伸,使之与第一主分量图像数据集具有相同的均值和方差;最后拉伸后的高空间分辨率图像代替第一主分量,将它与其他主分量经PCA逆变换得到融合图像。
    PCA融合算法的优点在于它适用于多光谱图像的所有波段;不足之处是在PCA融合算法中只用高分辨率图像来简单替换低分辨率图像的第一主成分,故会损失低分辨率图像第一主成分中的一些反应光谱特性的信息,不考虑图像各波段的特点是PCA融合算法的致命缺点。
    4)基于调制的图像融合方法
    借助通信技术的思想,调制技术在图像融合领域也得到了一定的应用,并在某些方面具有较好的效果。用于图像融合上的调制手段一般使用于两幅图像的融合处理,具体操作一般是将一幅图像进行归一化处理;然后将归一化的结果与另一图像相乘;最后重新量化后进行显示。用于图像融合上的调制技术一般可分为对比度调制技术和灰度调制技术。、
    5)非线性方法
    将配准后的原图像分为低通和高通两部分,自适应地修改每一部分,然后再把他们融合成符合图像。
    6)逻辑滤波方法
    逻辑滤波方法是一种利用逻辑运算将两个像素的数据合成为一个像素的直观方法,例如当两个像素的值都大于某一阈值时,“与”滤波器输出为“1”(为“真”)。图像通过“与”滤波器而获得特征可认为是图像中十分显著的成分。
    7)颜色空间融合方法
    颜色空间融合法的原理是利用图像数据表示成不同的颜色通道。简单的做法是把来自不同传感器的每幅原图像分别映射到一个专门的颜色通道,合并这些通道得到-一幅假彩色融合图像。该类方法的关键是如何使产生的融合图像更符合人眼视觉特性及获得更多有用信息。Toet等人将前视红外图像和微光夜视图像通过非线性处理映射到一个彩色空间中,增强了图像的可视性。文献研究表明,通过彩色映射进行可见光和红外图像的融合,能够提高融合结果的信息量,有助于提高检测性能。
    8)最优化方法
    最优化方法为场景建立一个先验模型,把融合任务表达成一个优化问题,包括贝叶斯最优化方法和马尔可夫随机场方法。贝叶斯最优化方法的目标是找到使先验概率最大的融合图像。文献提出了一个简单的自适应算法估计传感器的特性与传感器之间的关系,以进行传感器图像的融合;另一文献提出了基于图像信息模型的概率图像融合方法。马尔可夫随机场方法把融合任务表示成适当的代价函数,该函数反映了融合的目标,模拟退火算法被用来搜索全局最优解。
    9)人工神经网络方法
    受生物界多传感器融合的启发,人工神经网络也被应用于图像融合技术中。神经网络的输入向量经过一个非线性变换可得到一个输出向量,这样的变换能够产生从输入数据到输出数据的映射模型,从而使神经网络能够把多个传感器数据变换为一个数据来表示。由此可见,神经网络以其特有的并行性和学习方式,提供了一种完全不同的数据融合方法。然而,要将神经网络方法应用到实际的融合系统中,无论是网络结构设计还是算法规则方面,都有许多基础工作有待解决,如网络模型、;网络的层次和每一层的节点数、网络学习策略、神经网络方法与传统的分类方法的关系和综合应用等。目前应用于图像融合有三种网络: a)双模态神经元网络。b)多层感知器。c) 脉冲耦合神经网络(PCNN)。Broussard等 人借助该网络实现图像融合来提高目标的识别率,并证实了PCNN用于图像融合的可行性。

    2、基于多尺度变换的图像融合方法
    基于多尺度变换的图像融合方法是像素级图像融合方法研究中的一类重要方法。基于多尺度变换的融合方法的主要步骤[5]为:对原图像分别进行多尺度分解,得到变换域的一系列子图像;采用一定的融合规则,提取变换域中每个尺度上最有效的特征,得到复合的多尺度表示;对复合的多尺度表示进行多尺度逆变换,得到融合后的图像。
    1)基于金字塔变换的图像融合方法
    Burt最早提出基于拉普拉斯金字塔变换的融合方法。该方法使用拉普拉斯金字塔和基于像素最大值的融合规则进行人眼立体视觉的双目融合,实际上该方法是选取了局部亮度差异较大的点。这一过程粗略地模拟了人眼双目观察事物的过程。用拉普拉斯金字塔得到的融合图像不能很好地满足人类的视觉心理。在文献中,比率低通金字塔和最大值原则被用于可见光和红外图像的融合。比率低通金字塔虽然符合人眼的视觉特征,但由于噪声的局部对比度一般都较大,基于比率低通金字塔的融合算法对噪声比较敏感,且不稳定。为;了解决这一问题,Burt等人提出了基于梯度金字塔变换的融合方法,该方法采用了匹配与显著性测度的融合规则。R ichard等人给出了以上三种金字塔用于图像融合的定性和定量的结果。另外, Baron和Thomas提出一种基于纹理单元的金字塔算法它在每层图像中采用24个纹理滤波器以获取不同方向的细节信息。与梯度金字塔算法相比,它能够提取出更多的细节信息。文献提出了一种基于形态学金字塔变换的图像融合方法。
    基于金字塔变换融合方法的优点是可以在不同空间分辨率上有针对性地突出各图像的重要特征和细节信息,相对于简单图像融合方法,融合效果有明显的改善。其缺点是图像的金字塔分解均是图像的冗余分解,即分解后各层间数据有冗余;同时在图像融合中高频信息损失大,在金字塔重建时可能出现模糊、不稳点现象;图像的拉普拉斯、比率低通、形态学金字塔、分解均无方向性。
    2)基于小波变换的图像融合方法
    小波变换技术具有许多其他时(空)频域所不具有的优良,特性,如方向选择性、正交性、可变的时频域分辨率、可调整的局部支持以及分析数据量小等。这些优良特性使小波变换成为图像融合的一-种强有力的工具。而且,小波变换的多尺度变换特性更加符合人类的视觉机制,与计算机视觉中由粗到细的认知过程更加相似,更适于图像融合。
    基于小波变换的图像融合方法的基本步骤为:对每一幅原图像分别进行小波变换,建立图像的小波金字塔分解;对各分解层从高到低分别进行融合处理,各分解层上的不同频率分量可采用不同的融合规则进行融合处理,最终得到融合后的小波金字塔;对融合后所得的小波金字塔进行小波逆变换,所得重构图像即为融合图像。下图给出了基于小波变换的图像融合方法的结构示意图。
    在这里插入图片描述
    目前,基于小波变换的图像融合方法的研究主要集中在以下几个方面:
    a)融合规则及融合算子的选择。在小波图像融合过程中,融合规则及融合算子的选择对融合质量至关重要,这直接影响到图像质量的好坏。针对不同类型和特征的图像,目前已经提出了大量的高、低频融合规则。高频融合规则主要包括简单和加权平均准则、取系数绝对值较大准则、基于小波模极大值的融合准则、基于区域能量的融合准则、局部方差准则、局部平均梯度准则、局部均方差准则、消除高频噪声法等。通常情况下,低频部分融合一般采 用平均的线性融合规则,但在许多情况下,这种取平均的线性融合方法会影响最终的融合效果。文献(一种基于小波变换的图像融合算法)提出了平均与选择相结合的低频融合规则。该方法考虑了两幅图像的相关性,在一一定程度上符合人眼对较显著的点比较敏感这一-事实,融合效果相对平均法有一定的改善,但无显著的提高。燕文浩等人提出了基于Canny边缘检测算子的低频融合规则,有效地改善了融合图像边缘细节的准确度,提高了融合图像的分辨率。
    b)小波分解与重构的形式。LiMing等人将离散小波变换应用于遥感图像融合中,取得了很好的融合效果。在进行小波变换时,由于采用了行列降采样,图像的大小发生了变化,每层图像的大小均为上一-层图像的1/4。 这种变化在图像融合处理过程中有时是不利的,特别是在图像配准精度不高的情况下,容易产生分块效应。为此,Zhang Zhong和Blum提出了基于小波框架的图像融合算法,这种算法经变换后的图像大小不发生变化,克服了上述缺点,但计算量相对较大。多小波是近几年刚刚发展起来的小波理论的-一个新的组成部分,它提供了更加广泛的小波基选择范围,能够找到具有更好性质的优于二进制小波的小波函数。Wang HaiHhuf提出了基于多小波变换的图像融合方法,使图像的融合效果得到了进一b步改善。 1994年Svelens不依赖于傅里叶,提出了一种基于提升机制的小波变换新方法。基于提升机制方法能够实现小波变换的快速算法,可以提高融合速度,节省内存和存储空间,所以基于提升机制的小波变换开始被应用于许多图像融合之中。根据小波分解与重构的形式不同,基于小波的图像融合方法大致可分为塔形小波变换(PDWT)、塔形小波帧变换(PDWFT)、树状小波帧变换(TDWFT)、小波框架、多小波变换、基于提升机制小波变换( FILWT)的融合方法。
    c)小波融合方法与其他融合方法的结合。目前,针对某类特定的融合原图像和某种特殊的融合目的,出现了许多小波方法与其他融合方法相结合的算法。唐国良等人提出了基于IHS变换和小波变换的昼夜彩色图像融合算法; Zhang Yun等人将HIS与小波技术结合起来用于遥感图像融合中,明显降低了融合结果中的颜色扭曲现象;蒋年德等人提出–种新的基于主分量变换与小波变换的图像融合方法,该方法使融合图像在较好地保留光谱信息的同时,增强了空间细节信息。
    基于小波变换的图像融合方法进一步的研究方向主要包括:新的融合量测指标;新的高、低频融合规则;分解层数对融合图像的影响及层数优化;新的小波分解与重构方法;小波融合方法与其他融合方法新的结合。
    3)基于Ridgelet变换的图像融合方法
    当小波变换推广到二维或更高维时,由一维小波张成的可分离小波只有有限的方向,不能最优表示含线或者面奇异的高维函数。因此,小波只能反映信号的点奇异性(零维),而对诸如二维图像中的边缘以及线状特征等线、面奇异性(一维或更高维),小波则难以表达其特征。针对小波变换的不足,Candes提出了一种适合分析一维或更高维奇异性的脊波( Ridgelet)变换。脊波变换用于图像融合的意义在于: a)脊波变换通过Radon变换把图像中线特征转换成点特征,然后通过小波变换将点的奇异性检测出来。其处理过程克服了小波仅仅能反映“过”边缘的特征,而无法表达“沿”边缘的特征。b)脊波变换继承了小波变换的空域和频域局部特性。e)脊波变换具有很强的方向性,可以有效地表示信号中具有方向性的奇异性特征,如图像的线性轮廓等,为融合图像提供更多的信息。d)脊波变换较小波变换具有更好的稀疏性,克服了小波变换中传播重要特征在多个尺度上的缺点,变换后能量更加集中,所以在融合过程中抑制噪声的能力也比小波变换更强。因此将脊波变换引入图像融合,能够更好地提取原始图像的特征,为融合图像提供更多的信息。文献(R idgelet: theory and app lications)提出了一种基于脊波变换的SAR与可见光图像融合方法。该方法在保留合成孔径雷达SAR与可见光图像重要信息、抑制噪声能力方面均优于小波变换。
    由于脊波理论建立时间不长,还有许多值得研究的课题,例如,如何能够减轻甚至消除在重构图像过程中出现的轻微划痕、如何简化脊波的复杂计算、寻求快速算法等。
    4)基于Curvelet变换的图像融合方法
    Curvelet变换是由Candes提 出的Ridgelet变换演变而来的。Ridgelet变换对含有直线奇异的多变量函数有很好的逼近效果,能稀疏地表示包含直线边缘的分片平滑图像。但是对于含有曲线奇异的图像, Ridgelet变换的逼近性能只与小波变换相当。由于多尺度Ridgelet分析冗余度很大,Candes和Donoho于1999年提出了曲线波( Curveleb)变换理论,即第一代Cuvelet变换。其基本思想是:首先对图像进行子带分解;然后对不同尺度的子带图像采用不同大小的分块;最后对每个块进行Ridgelet分析。由于Curvelt结合了Ridgelet变换的各向异性和小波变换的多尺度特点,它的出现对于二维信号分析具有里程碑式的意义,也开始被应用于图像融合。Choi等人首次将Curvelet应用于多光谱图像和全景图像的融合,结果具有更丰富的空间和光谱信息以及更佳的视觉效果。文献(一种基于 Curvelet变换多传感器图像融合算法)提出了一种基于Cuvelet变换 多传感器图像融合算法,该方法相比传统的基于小波变换的图像融合算法。能够有效避免人为效应或高频噪声的引入,得到具有更好视觉效果和更优量化指标的融合图像。
    由于第一代Curvelet变换的数字实现比较复杂,需要子带分解、平滑分块、正规化和Ridgelet分析等系列步骤,且Curvelet金字塔的分解也带来了巨大的数据冗余量,Candes等人又提出了实现更简单、更便于理解的快速Cuvelet变 换算法,即第二代Curvelet变换。第二代Cuvelet与第一代在构造上已经完全不同:第一代的构造思想是通过足够小的分块将曲线近似到每个分块中的直线来看待,然后利用局部的Ridgelet分析其特性;第二代Curvelet与Ridgelet理论并没有关系,实现过程也无须用到Ridgelet两者之间的相同点仅在于紧支撑、框架等抽象的数学意义。文献(基于二代 Cu rvelet变换的图像融合研究)提出了一种基于第二代Curvelet变换的图像融合方法,并应用于多聚焦图像的融合。该方法可以更好地提取原始图像的特征,为融合提供更多的信息,相比第一代Curvelet变换更易于实现。

    5)后面还有NSCT、NSST、稀疏表示、CNN等方法

    二、源代码

    function varargout = gui(varargin)
    % GUI M-file for gui.fig
    %      GUI, by itself, creates a new GUI or raises the existing
    %      singleton*.
    %
    %      H = GUI returns the handle to a new GUI or the handle to
    %      the existing singleton*.
    %
    %      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in GUI.M with the given input arguments.
    %
    %      GUI('Property','Value',...) creates a new GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before gui_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to gui_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help gui
    
    % Last Modified by GUIDE v2.5 27-May-2011 17:39:18
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @gui_OpeningFcn, ...
                       'gui_OutputFcn',  @gui_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before gui is made visible.
    function gui_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to gui (see VARARGIN)
    
    % Choose default command line output for gui
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes gui wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = gui_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --------------------------------------------------------------------
    function Open_Callback(hObject, eventdata, handles)
    [name,path]=uigetfile( ...
        {'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
        '*.*','All Files' },...
        '请选择要融合的低分辨率图片');
    fullpath=strcat(path,name);
    [name2,path2]=uigetfile( ...
        {'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
        '*.*','All Files' },...
        '请选择要融合的高分辨率图片(');
    fullpath2=strcat(path2,name2);
    save path.mat fullpath fullpath2
    % hObject    handle to Open (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes during object creation, after setting all properties.
    function axes1_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to axes1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: place code in OpeningFcn to populate axes1
    
    
    % --- Executes on button press in add_fu_button.
    function add_fu_button_Callback(hObject, eventdata, handles)
    axes(handles.axes1);
    cla;
    axes(handles.axes2);
    cla;
    axes(handles.axes3);
    cla;
    a=get(handles.radiobutton5,'value');
    b=get(handles.radiobutton6,'value');
    c=get(handles.radiobutton7,'value');
    if a==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        addfusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    if b==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        sel_h_fusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    if c==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        sel_l_fusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    
    
    
    %axes(handles.axes4);
    %cla;
    %load path.mat
    %axes(handles.axes1);
    %low=imread(fullpath);
    %imshow(low);
    %axes(handles.axes2);
    %high=imread(fullpath2);
    %imshow(high);
    %addfusion;
    %load image.mat
    %axes(handles.axes3);
    
    %imshow(fusionresult);
    % hObject    handle to add_fu_button (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes on button press in pretreat_button.
    function pretreat_button_Callback(hObject, eventdata, handles)
    load path.mat
    axes(handles.axes4);
    low=imread(fullpath);
    imshow(low);
    axes(handles.axes5);
    high=imread(fullpath2);
    imshow(high);
    pretreat;
    load image.mat
    NbColors=255;
    map=gray(NbColors);
    axes(handles.axes6);
    image(pretreat_result_low);
    colormap(map);
    axes(handles.axes7);
    image(pretreat_result_high);
    colormap(map);
    
    
    
    
    % hObject    handle to pretreat_button (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    

    三、运行结果

    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 一、简介 根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征...像素级融合一般分为四步完成:预处理、变换、合成

    一、简介

    根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征提取并直接使用。也正是得益于其对信息最大程度上的保留,使其在准确性和鲁棒性上优于其他两级。相比之下,像素级融合获取的细节信息更丰富,是最常用的融合方式。因此,它同样是图像融合领域研究的热点。与此同时,由于其需要的配准精度高,必须达到像素级别。所以像素级图像融合技术对设备要求较高,而且融合过程耗时,不易于实时处理。像素级融合一般分为四步完成:预处理、变换、合成和逆变换。
    在这里插入图片描述
    像素级图像融合主要包括:

    1 基于非多尺度变换的图像融合方法
    1)平均与加权平均方法
    加权平均方法将原图像对应像素的灰度值进行加权平均,生成新的图像,它是最直接的融合方法。其中平均方法是加权平均的特例。使用平均方法进行图像融合,提高了融合图像的信噪比,但削弱了图像的对比度,尤其对于只出现在其中一幅图像上的有用信号。
    2)像素灰度值选大(或小)的图像融合方法
    假设参加融合的两幅原图像分别为A、B,图像大小分别为M*N,融合图像为F,则针对原图像A、B的像素灰度值选大(或小)图像融合方法可表示为
    在这里插入图片描述
    其中:m、n分别为图像中像素的行号和列号。在融合处理时,比较原图像A、B中对应位置(m、n)处像素灰度值的大小,以其中灰度值大(或小)的像素作为融合图像F在位置(m、n)处的像素。这种融合方法只是简单地选择原图像中灰度值大(或小)的像素作为融合后的像素,对待融合后的像素进行灰度增强(或减弱),因此该方法的实用场合非常有限。
    3)基于PCA的图像融合方法
    PCA图像融合方法首先用三个或以上波段数据求得图像间的相关系数矩阵,由相关系数矩阵计算特征值和特征向量,再求得各主分量图像;然后将高空间分辨率图像数据进行对比度拉伸,使之与第一主分量图像数据集具有相同的均值和方差;最后拉伸后的高空间分辨率图像代替第一主分量,将它与其他主分量经PCA逆变换得到融合图像。
    PCA融合算法的优点在于它适用于多光谱图像的所有波段;不足之处是在PCA融合算法中只用高分辨率图像来简单替换低分辨率图像的第一主成分,故会损失低分辨率图像第一主成分中的一些反应光谱特性的信息,不考虑图像各波段的特点是PCA融合算法的致命缺点。
    4)基于调制的图像融合方法
    借助通信技术的思想,调制技术在图像融合领域也得到了一定的应用,并在某些方面具有较好的效果。用于图像融合上的调制手段一般使用于两幅图像的融合处理,具体操作一般是将一幅图像进行归一化处理;然后将归一化的结果与另一图像相乘;最后重新量化后进行显示。用于图像融合上的调制技术一般可分为对比度调制技术和灰度调制技术。、
    5)非线性方法
    将配准后的原图像分为低通和高通两部分,自适应地修改每一部分,然后再把他们融合成符合图像。
    6)逻辑滤波方法
    逻辑滤波方法是一种利用逻辑运算将两个像素的数据合成为一个像素的直观方法,例如当两个像素的值都大于某一阈值时,“与”滤波器输出为“1”(为“真”)。图像通过“与”滤波器而获得特征可认为是图像中十分显著的成分。
    7)颜色空间融合方法
    颜色空间融合法的原理是利用图像数据表示成不同的颜色通道。简单的做法是把来自不同传感器的每幅原图像分别映射到一个专门的颜色通道,合并这些通道得到-一幅假彩色融合图像。该类方法的关键是如何使产生的融合图像更符合人眼视觉特性及获得更多有用信息。Toet等人将前视红外图像和微光夜视图像通过非线性处理映射到一个彩色空间中,增强了图像的可视性。文献研究表明,通过彩色映射进行可见光和红外图像的融合,能够提高融合结果的信息量,有助于提高检测性能。
    8)最优化方法
    最优化方法为场景建立一个先验模型,把融合任务表达成一个优化问题,包括贝叶斯最优化方法和马尔可夫随机场方法。贝叶斯最优化方法的目标是找到使先验概率最大的融合图像。文献提出了一个简单的自适应算法估计传感器的特性与传感器之间的关系,以进行传感器图像的融合;另一文献提出了基于图像信息模型的概率图像融合方法。马尔可夫随机场方法把融合任务表示成适当的代价函数,该函数反映了融合的目标,模拟退火算法被用来搜索全局最优解。
    9)人工神经网络方法
    受生物界多传感器融合的启发,人工神经网络也被应用于图像融合技术中。神经网络的输入向量经过一个非线性变换可得到一个输出向量,这样的变换能够产生从输入数据到输出数据的映射模型,从而使神经网络能够把多个传感器数据变换为一个数据来表示。由此可见,神经网络以其特有的并行性和学习方式,提供了一种完全不同的数据融合方法。然而,要将神经网络方法应用到实际的融合系统中,无论是网络结构设计还是算法规则方面,都有许多基础工作有待解决,如网络模型、;网络的层次和每一层的节点数、网络学习策略、神经网络方法与传统的分类方法的关系和综合应用等。目前应用于图像融合有三种网络: a)双模态神经元网络。b)多层感知器。c) 脉冲耦合神经网络(PCNN)。Broussard等 人借助该网络实现图像融合来提高目标的识别率,并证实了PCNN用于图像融合的可行性。

    2、基于多尺度变换的图像融合方法
    基于多尺度变换的图像融合方法是像素级图像融合方法研究中的一类重要方法。基于多尺度变换的融合方法的主要步骤[5]为:对原图像分别进行多尺度分解,得到变换域的一系列子图像;采用一定的融合规则,提取变换域中每个尺度上最有效的特征,得到复合的多尺度表示;对复合的多尺度表示进行多尺度逆变换,得到融合后的图像。
    1)基于金字塔变换的图像融合方法
    Burt最早提出基于拉普拉斯金字塔变换的融合方法。该方法使用拉普拉斯金字塔和基于像素最大值的融合规则进行人眼立体视觉的双目融合,实际上该方法是选取了局部亮度差异较大的点。这一过程粗略地模拟了人眼双目观察事物的过程。用拉普拉斯金字塔得到的融合图像不能很好地满足人类的视觉心理。在文献中,比率低通金字塔和最大值原则被用于可见光和红外图像的融合。比率低通金字塔虽然符合人眼的视觉特征,但由于噪声的局部对比度一般都较大,基于比率低通金字塔的融合算法对噪声比较敏感,且不稳定。为;了解决这一问题,Burt等人提出了基于梯度金字塔变换的融合方法,该方法采用了匹配与显著性测度的融合规则。R ichard等人给出了以上三种金字塔用于图像融合的定性和定量的结果。另外, Baron和Thomas提出一种基于纹理单元的金字塔算法它在每层图像中采用24个纹理滤波器以获取不同方向的细节信息。与梯度金字塔算法相比,它能够提取出更多的细节信息。文献提出了一种基于形态学金字塔变换的图像融合方法。
    基于金字塔变换融合方法的优点是可以在不同空间分辨率上有针对性地突出各图像的重要特征和细节信息,相对于简单图像融合方法,融合效果有明显的改善。其缺点是图像的金字塔分解均是图像的冗余分解,即分解后各层间数据有冗余;同时在图像融合中高频信息损失大,在金字塔重建时可能出现模糊、不稳点现象;图像的拉普拉斯、比率低通、形态学金字塔、分解均无方向性。
    2)基于小波变换的图像融合方法
    小波变换技术具有许多其他时(空)频域所不具有的优良,特性,如方向选择性、正交性、可变的时频域分辨率、可调整的局部支持以及分析数据量小等。这些优良特性使小波变换成为图像融合的一-种强有力的工具。而且,小波变换的多尺度变换特性更加符合人类的视觉机制,与计算机视觉中由粗到细的认知过程更加相似,更适于图像融合。
    基于小波变换的图像融合方法的基本步骤为:对每一幅原图像分别进行小波变换,建立图像的小波金字塔分解;对各分解层从高到低分别进行融合处理,各分解层上的不同频率分量可采用不同的融合规则进行融合处理,最终得到融合后的小波金字塔;对融合后所得的小波金字塔进行小波逆变换,所得重构图像即为融合图像。下图给出了基于小波变换的图像融合方法的结构示意图。
    在这里插入图片描述
    目前,基于小波变换的图像融合方法的研究主要集中在以下几个方面:
    a)融合规则及融合算子的选择。在小波图像融合过程中,融合规则及融合算子的选择对融合质量至关重要,这直接影响到图像质量的好坏。针对不同类型和特征的图像,目前已经提出了大量的高、低频融合规则。高频融合规则主要包括简单和加权平均准则、取系数绝对值较大准则、基于小波模极大值的融合准则、基于区域能量的融合准则、局部方差准则、局部平均梯度准则、局部均方差准则、消除高频噪声法等。通常情况下,低频部分融合一般采 用平均的线性融合规则,但在许多情况下,这种取平均的线性融合方法会影响最终的融合效果。文献(一种基于小波变换的图像融合算法)提出了平均与选择相结合的低频融合规则。该方法考虑了两幅图像的相关性,在一一定程度上符合人眼对较显著的点比较敏感这一-事实,融合效果相对平均法有一定的改善,但无显著的提高。燕文浩等人提出了基于Canny边缘检测算子的低频融合规则,有效地改善了融合图像边缘细节的准确度,提高了融合图像的分辨率。
    b)小波分解与重构的形式。LiMing等人将离散小波变换应用于遥感图像融合中,取得了很好的融合效果。在进行小波变换时,由于采用了行列降采样,图像的大小发生了变化,每层图像的大小均为上一-层图像的1/4。 这种变化在图像融合处理过程中有时是不利的,特别是在图像配准精度不高的情况下,容易产生分块效应。为此,Zhang Zhong和Blum提出了基于小波框架的图像融合算法,这种算法经变换后的图像大小不发生变化,克服了上述缺点,但计算量相对较大。多小波是近几年刚刚发展起来的小波理论的-一个新的组成部分,它提供了更加广泛的小波基选择范围,能够找到具有更好性质的优于二进制小波的小波函数。Wang HaiHhuf提出了基于多小波变换的图像融合方法,使图像的融合效果得到了进一b步改善。 1994年Svelens不依赖于傅里叶,提出了一种基于提升机制的小波变换新方法。基于提升机制方法能够实现小波变换的快速算法,可以提高融合速度,节省内存和存储空间,所以基于提升机制的小波变换开始被应用于许多图像融合之中。根据小波分解与重构的形式不同,基于小波的图像融合方法大致可分为塔形小波变换(PDWT)、塔形小波帧变换(PDWFT)、树状小波帧变换(TDWFT)、小波框架、多小波变换、基于提升机制小波变换( FILWT)的融合方法。
    c)小波融合方法与其他融合方法的结合。目前,针对某类特定的融合原图像和某种特殊的融合目的,出现了许多小波方法与其他融合方法相结合的算法。唐国良等人提出了基于IHS变换和小波变换的昼夜彩色图像融合算法; Zhang Yun等人将HIS与小波技术结合起来用于遥感图像融合中,明显降低了融合结果中的颜色扭曲现象;蒋年德等人提出–种新的基于主分量变换与小波变换的图像融合方法,该方法使融合图像在较好地保留光谱信息的同时,增强了空间细节信息。
    基于小波变换的图像融合方法进一步的研究方向主要包括:新的融合量测指标;新的高、低频融合规则;分解层数对融合图像的影响及层数优化;新的小波分解与重构方法;小波融合方法与其他融合方法新的结合。
    3)基于Ridgelet变换的图像融合方法
    当小波变换推广到二维或更高维时,由一维小波张成的可分离小波只有有限的方向,不能最优表示含线或者面奇异的高维函数。因此,小波只能反映信号的点奇异性(零维),而对诸如二维图像中的边缘以及线状特征等线、面奇异性(一维或更高维),小波则难以表达其特征。针对小波变换的不足,Candes提出了一种适合分析一维或更高维奇异性的脊波( Ridgelet)变换。脊波变换用于图像融合的意义在于: a)脊波变换通过Radon变换把图像中线特征转换成点特征,然后通过小波变换将点的奇异性检测出来。其处理过程克服了小波仅仅能反映“过”边缘的特征,而无法表达“沿”边缘的特征。b)脊波变换继承了小波变换的空域和频域局部特性。e)脊波变换具有很强的方向性,可以有效地表示信号中具有方向性的奇异性特征,如图像的线性轮廓等,为融合图像提供更多的信息。d)脊波变换较小波变换具有更好的稀疏性,克服了小波变换中传播重要特征在多个尺度上的缺点,变换后能量更加集中,所以在融合过程中抑制噪声的能力也比小波变换更强。因此将脊波变换引入图像融合,能够更好地提取原始图像的特征,为融合图像提供更多的信息。文献(R idgelet: theory and app lications)提出了一种基于脊波变换的SAR与可见光图像融合方法。该方法在保留合成孔径雷达SAR与可见光图像重要信息、抑制噪声能力方面均优于小波变换。
    由于脊波理论建立时间不长,还有许多值得研究的课题,例如,如何能够减轻甚至消除在重构图像过程中出现的轻微划痕、如何简化脊波的复杂计算、寻求快速算法等。
    4)基于Curvelet变换的图像融合方法
    Curvelet变换是由Candes提 出的Ridgelet变换演变而来的。Ridgelet变换对含有直线奇异的多变量函数有很好的逼近效果,能稀疏地表示包含直线边缘的分片平滑图像。但是对于含有曲线奇异的图像, Ridgelet变换的逼近性能只与小波变换相当。由于多尺度Ridgelet分析冗余度很大,Candes和Donoho于1999年提出了曲线波( Curveleb)变换理论,即第一代Cuvelet变换。其基本思想是:首先对图像进行子带分解;然后对不同尺度的子带图像采用不同大小的分块;最后对每个块进行Ridgelet分析。由于Curvelt结合了Ridgelet变换的各向异性和小波变换的多尺度特点,它的出现对于二维信号分析具有里程碑式的意义,也开始被应用于图像融合。Choi等人首次将Curvelet应用于多光谱图像和全景图像的融合,结果具有更丰富的空间和光谱信息以及更佳的视觉效果。文献(一种基于 Curvelet变换多传感器图像融合算法)提出了一种基于Cuvelet变换 多传感器图像融合算法,该方法相比传统的基于小波变换的图像融合算法。能够有效避免人为效应或高频噪声的引入,得到具有更好视觉效果和更优量化指标的融合图像。
    由于第一代Curvelet变换的数字实现比较复杂,需要子带分解、平滑分块、正规化和Ridgelet分析等系列步骤,且Curvelet金字塔的分解也带来了巨大的数据冗余量,Candes等人又提出了实现更简单、更便于理解的快速Cuvelet变 换算法,即第二代Curvelet变换。第二代Cuvelet与第一代在构造上已经完全不同:第一代的构造思想是通过足够小的分块将曲线近似到每个分块中的直线来看待,然后利用局部的Ridgelet分析其特性;第二代Curvelet与Ridgelet理论并没有关系,实现过程也无须用到Ridgelet两者之间的相同点仅在于紧支撑、框架等抽象的数学意义。文献(基于二代 Cu rvelet变换的图像融合研究)提出了一种基于第二代Curvelet变换的图像融合方法,并应用于多聚焦图像的融合。该方法可以更好地提取原始图像的特征,为融合提供更多的信息,相比第一代Curvelet变换更易于实现。

    5)后面还有NSCT、NSST、稀疏表示、CNN等方法

    二、源代码

    function varargout = gui(varargin)
    % GUI M-file for gui.fig
    %      GUI, by itself, creates a new GUI or raises the existing
    %      singleton*.
    %
    %      H = GUI returns the handle to a new GUI or the handle to
    %      the existing singleton*.
    %
    %      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in GUI.M with the given input arguments.
    %
    %      GUI('Property','Value',...) creates a new GUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before gui_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to gui_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
    
    % Edit the above text to modify the response to help gui
    
    % Last Modified by GUIDE v2.5 27-May-2011 17:39:18
    
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @gui_OpeningFcn, ...
                       'gui_OutputFcn',  @gui_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
    
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
    
    
    % --- Executes just before gui is made visible.
    function gui_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to gui (see VARARGIN)
    
    % Choose default command line output for gui
    handles.output = hObject;
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes gui wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    
    % --- Outputs from this function are returned to the command line.
    function varargout = gui_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get default command line output from handles structure
    varargout{1} = handles.output;
    
    
    % --------------------------------------------------------------------
    function Open_Callback(hObject, eventdata, handles)
    [name,path]=uigetfile( ...
        {'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
        '*.*','All Files' },...
        '请选择要融合的低分辨率图片');
    fullpath=strcat(path,name);
    [name2,path2]=uigetfile( ...
        {'*.jpg;*.tif;*.png;*.gif;*.bmp','All Image Files';...
        '*.*','All Files' },...
        '请选择要融合的高分辨率图片(');
    fullpath2=strcat(path2,name2);
    save path.mat fullpath fullpath2
    % hObject    handle to Open (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes during object creation, after setting all properties.
    function axes1_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to axes1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
    
    % Hint: place code in OpeningFcn to populate axes1
    
    
    % --- Executes on button press in add_fu_button.
    function add_fu_button_Callback(hObject, eventdata, handles)
    axes(handles.axes1);
    cla;
    axes(handles.axes2);
    cla;
    axes(handles.axes3);
    cla;
    a=get(handles.radiobutton5,'value');
    b=get(handles.radiobutton6,'value');
    c=get(handles.radiobutton7,'value');
    if a==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        addfusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    if b==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        sel_h_fusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    if c==1
        load path.mat
        axes(handles.axes1);
        low=imread(fullpath);
        imshow(low);
        axes(handles.axes2);
        high=imread(fullpath2);
        imshow(high);
        sel_l_fusion;
        load image.mat
        axes(handles.axes3);
        imshow(fusionresult);
        %
    end
    
    
    
    %axes(handles.axes4);
    %cla;
    %load path.mat
    %axes(handles.axes1);
    %low=imread(fullpath);
    %imshow(low);
    %axes(handles.axes2);
    %high=imread(fullpath2);
    %imshow(high);
    %addfusion;
    %load image.mat
    %axes(handles.axes3);
    
    %imshow(fusionresult);
    % hObject    handle to add_fu_button (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    
    % --- Executes on button press in pretreat_button.
    function pretreat_button_Callback(hObject, eventdata, handles)
    load path.mat
    axes(handles.axes4);
    low=imread(fullpath);
    imshow(low);
    axes(handles.axes5);
    high=imread(fullpath2);
    imshow(high);
    pretreat;
    load image.mat
    NbColors=255;
    map=gray(NbColors);
    axes(handles.axes6);
    image(pretreat_result_low);
    colormap(map);
    axes(handles.axes7);
    image(pretreat_result_high);
    colormap(map);
    
    
    
    
    % hObject    handle to pretreat_button (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    

    三、运行结果

    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 车牌识别的过程可分为四步:1)车牌图像切割;2)车牌图像分类;3)车牌字符切割;4)车牌字符分类;1)车牌图像切割: a.将原图转化为灰度图,可去除多通道产生的外界噪声;b. sobel滤波 ,车牌分割的一个重要...

    本文和下文用于开源项目OpenCV的车牌识别的学习!!!

    车牌识别的过程可分为四步:1)车牌图像切割;2)车牌图像分类;3)车牌字符切割;4)车牌字符分类;

    1)车牌图像切割: 

    a.将原图转化为灰度图,可去除多通道产生的外界噪声;

    b. sobel滤波 ,车牌分割的一个重要特征是车牌中的垂直边缘比较多,为了提取垂直边缘,采用sobel一阶垂直方向导数;

    c. 阈值化处理,应用一个OSTU法自动获取阈值滤波器来获得一个二值图像;

    d. 闭运算形态学 ,连接含有边缘数量很多的所有区域,删除边缘之间的空白区域,将车牌区域连接起来;

    e. 漫水填充, 所有的车牌都有统一的背景颜色。使用漫水填充算法来获取旋转矩阵的精确修剪。漫水填充函数用颜色把连通区域填充到掩码图像,填充从种子开始。填充的像素点都是与种子点进行比较,如果像素值为x,seed-low<=x<=seed+up,则该位置将被填充。一旦得到了用来剪切的掩码图像,进而可得到掩码图像点的最小外接矩形,再次检查矩形大小。对于每一个掩码,白色像素获得位置用minAreaRect函数重新得到最相近的修剪区域;

    f. 仿射变换,用来去掉检测矩形区域的旋转;

    g. 提取矩形;

    h. 调整为统一大小,直方图均衡化,提取的矩形图像不能很好的在训练和分类中使用,因为他们没有相同的大小。并且,每个图像包含不同的光照条件,增加了他们之间的差别。

    /* imageSlicer.cpp */
    
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <time.h>
    
    using namespace std;
    using namespace cv;
    
    //筛选旋转矩形的面积和宽高比
    bool areaDetection(RotatedRect rectArea)
    {
    	float error = 0.4;//允许错误率
    	const float width_height = 4.7272;//获得西班牙车牌的宽高比 57200
    
    	int min_area = 25 * 25 * width_height;//获得允许矩形的最大最小面积
    	int max_area = 100 * 100 * width_height;
    
    	float min_value = width_height*(1 - error);//获得允许矩形的最大最小宽高比 1.890-6.6180
    	float max_value = width_height*(1 + error);
    
    	int rect_area = rectArea.size.width*rectArea.size.height;//计算可旋转矩形的包围面积和宽高比
    	float rect_value = rectArea.size.width / rectArea.size.height;
    
    	rect_value = rect_value<1 ? 1 / rect_value : rect_value;
    
    	return rect_area>min_area && rect_area<max_area && rect_value>min_value && rect_value<max_value;
    }
    
    void imgProcess(Mat carImg)
    {
    	//1.获得灰度图
    	Mat grayImg, blurImg, sobelImg, threshImg, mopImg;
    	cvtColor(carImg, grayImg, COLOR_BGR2GRAY);
    	//imshow("灰度图", grayImg);
    
    	//2.均值滤波
    	/*void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1),
    	int borderType=BORDER_DEFAULT )*/
    	blur(grayImg, blurImg, Size(5, 5));//均值滤波
    	//imshow("均值滤波", blurImg);
    
    	//3.sobel边缘检测
    	/*void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1,
    	double delta=0, int borderType=BORDER_DEFAULT )*/
    	Sobel(blurImg, sobelImg, CV_8U, 1, 0);//sobel算子边缘检测 只对x方向求一阶导
    	//imshow("sobel边缘检测", sobelImg);
    
    	//4.二值化,OTSU算法自动获取阈值获得二值化图像
    	/*double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)*/
    	threshold(sobelImg, threshImg, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
    	//imshow("图像二值化", threshImg);
    
    	//5.闭运算,删除边缘之间的空白区域,将车牌区域连接起来
    	/*Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))*/
    	Mat element = getStructuringElement(MORPH_RECT, Size(17, 3));//定义结构元素
    	/*void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1),
    	int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )*/
    	morphologyEx(threshImg, mopImg, CV_MOP_CLOSE, element);
    	//imshow("闭运算", mopImg);
    
    	//6.寻找所有轮廓,然后用面积和宽高比筛选
    	vector<vector<Point>> contours;//定义轮廓,每个轮廓是一个点集
    	/*void findContours(InputOutputArray Img, OutputArrayOfArrays contours, OutputArray hierarchy,
    	int mode, int method, Point offset=Point())*/
    	findContours(mopImg, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//检测最外层轮廓
    	map<int, RotatedRect> mapCounter;//定义map容器,存储筛选后的矩形轮廓
    	for (int i = 0; i < contours.size(); ++i)
    	{
    		/*void drawContours(InputOutputArray Img, InputArrayOfArrays contours, int contourIdx, const Scalar& color,
    		int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )*/
    		drawContours(mopImg, contours, i, Scalar(255), 1);//绘制图像轮廓
    
    		/*RotatedRect minAreaRect(InputArray points)*/
    		RotatedRect contourRect = minAreaRect(contours[i]);//给定2D点集,寻找最小面积点集的包围矩形
    		Point2f vertices[4];//定义矩形的四个顶点
    		contourRect.points(vertices);
    		for (int j = 0; j < 4; ++j)
    		{
    			line(mopImg, vertices[j], vertices[(j + 1) % 4], Scalar(255), 2);//绘制包围轮廓的矩形
    		}
    		if (areaDetection(contourRect))
    			mapCounter[i] = contourRect;
    	}
    
    	//imshow("矩形包围所有轮廓", mopImg);
    	cout << "轮廓总数: " << contours.size() << endl;
    	cout << "筛选后的轮廓数量:" << mapCounter.size() << endl;
    
    	//获得map存储筛选后矩形轮廓的起始地址用于遍历,继续筛选
    	map<int, RotatedRect>::iterator it = mapCounter.begin();
    	while (it != mapCounter.end())
    	{
    		//7.绘制通过面积和宽高比筛选的矩形
    		//RotatedRect contourRect = it->second;//获得键对应的值
    		//Point2f vertices[4];//定义四个顶点
    		//contourRect.points(vertices);
    		//for (int j = 0; j < 4; ++j)
    		//{
    		//	line(mopImg, vertices[j], vertices[(j + 1) % 4], Scalar(255), 5);
    		//}
    		//++it;
    
    		//8.漫水填充矩形轮廓
    		RotatedRect contourRect = it->second;//获得键对应的值
    		/*void circle(Mat& img, Point center, int radius, const Scalar& color,
    		int thickness=1, int lineType=8, int shift=0)*/
    		circle(mopImg, contourRect.center, 3, Scalar(255), -1);//绘制矩形中心
    
    		float minSize = (contourRect.size.width < contourRect.size.height) ? contourRect.size.width : contourRect.size.height;
    		minSize = minSize*0.5;//设置随机种子的范围
    
    		srand(time(NULL));
    		int seedNum = 10;//设置每个掩码图像的随机种子数
    		Mat mask;//绘制新的掩码图像
    		mask.create(carImg.rows + 2, carImg.cols + 2, CV_8UC1);
    		mask = Scalar::all(0);
    		Scalar newVal = Scalar::all(255);//填充颜色
    		Rect ccomp;//重绘最小矩形区域
    		Scalar loDiff(30, 30, 30);//亮度或颜色负差的最大值
    		Scalar upDiff(30, 30, 30);//亮度或颜色正差的最大值
    		//只考虑当前像素水平和垂直方向的像素+白色填充值为255(忽略newVal)+考虑当前像素与种子像素的差+填充掩码图像
    		int flags = 4 + (255 << 8) + FLOODFILL_FIXED_RANGE + FLOODFILL_MASK_ONLY;
    		for (int j = 0; j < seedNum; ++j)
    		{
    			/*int floodFill(InputOutputArray Img, InputOutputArray mask, Point seedPoint, Scalar newVal,
    			Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )*/
    			Point point;
    			point.x = contourRect.center.x + rand() % (int)minSize - (int)(minSize / 2);//获得矩形区域中心附近的点作为种子(黄色)
    			point.y = contourRect.center.y + rand() % (int)minSize - (int)(minSize / 2);
    			circle(mopImg, point, 1, Scalar(255), -1);//绘制种子
    			int area = floodFill(carImg, mask, point, newVal, &ccomp, loDiff, upDiff, flags);
    		}
    		//imshow("漫水填充图像", mopImg);
    		//imshow("掩码图像", mask);
    
    		//9.通过每个图像掩码获得最小面积的包围矩形
    		vector<Point> pointInterest;
    		Mat_<uchar>::iterator itMask = mask.begin<uchar>();//Mat的轻量级数据类型Mat_,需指定类型
    		for (; itMask != mask.end<uchar>(); ++itMask)
    		{
    			if (*itMask == 255)
    				pointInterest.push_back(itMask.pos());//保存白点的坐标
    		}
    		RotatedRect minRect = minAreaRect(pointInterest);//给定2D点集,寻找最小面积的包围矩形
    
    		if (areaDetection(minRect))
    		{
    			//10.绘制通过继续筛选的矩形
    			Point2f minRectPoints[4];
    			minRect.points(minRectPoints);
    			for (int k = 0; k < 4; k++)
    				line(mopImg, minRectPoints[k], minRectPoints[(k + 1) % 4], Scalar(255));
    
    			//11.对原图仿射变换
    			float width_height = (float)minRect.size.width / (float)minRect.size.height;
    			float angle = minRect.angle;
    			if (width_height < 1)//处理图像中旋转角度大于90度的车牌
    				angle = angle + 90;
    			Mat rotMat = getRotationMatrix2D(minRect.center, angle, 1);//获得矩形的旋转矩阵
    			Mat warpImg;
    			/*void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize,
    			int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())*/
    			warpAffine(carImg, warpImg, rotMat, carImg.size(), INTER_CUBIC);
    			//imshow("原图仿射变换", warpImg);
    
    			//12.图像切割
    			Size minRectSize = minRect.size;
    			if (width_height < 1)
    				swap(minRectSize.width, minRectSize.height);
    			Mat plateImg;
    			/*void getRectSubPix(InputArray Img, Size patchSize, Point2f center,
    			OutputArray patch, int patchType=-1 )*/
    			getRectSubPix(warpImg, minRectSize, minRect.center, plateImg);
    			//imshow("原图车牌", plateImg);
    
    			//13.调整车牌图像大小为标准33*144
    			Mat resizeImg;
    			resizeImg.create(33, 144, CV_8UC3);
    			/*void resize(InputArray src, OutputArray dst, Size dsize, double fx=0,
    			double fy=0, int interpolation=INTER_LINEAR )*/
    			resize(plateImg, resizeImg, resizeImg.size(), 0, 0, INTER_CUBIC);
    			imshow("33*144车牌", resizeImg);
    			imwrite("plateOri.jpg", resizeImg);
    
    			//14.直方图均衡化
    			Mat histImg;
    			cvtColor(resizeImg, histImg, COLOR_BGR2GRAY);
    			blur(histImg, histImg, Size(3, 3));
    			equalizeHist(histImg, histImg);
    			imshow("直方图均衡化车牌", histImg);
    			imwrite("plate.jpg", histImg);
    		}
    		++it;
    	}
    }

    2)车牌图像分类

    a. SVM

    /* imageClassification.cpp */
    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    using namespace ml;
    
    void SVMClassifier(Mat srcImg)
    {
    	Mat plateImg;
    	srcImg.convertTo(plateImg, CV_32FC1);
    	plateImg = plateImg.reshape(1, 1);//将图像转换为1行m列特征,自动计算列数
    
    	FileStorage fs;
    	fs.open("SVM.xml", FileStorage::READ);//打开xml文件
    
    	//1.获得训练数据
    	Mat trainMat, classesMat;
    	fs["TrainingData"] >> trainMat;//读取训练数据集和类标签
    	fs["classes"] >> classesMat;
    	Ptr<TrainData> trainData = TrainData::create(trainMat,ROW_SAMPLE,classesMat);
    
    	//2.创建分类器,设置参数
    	SVM::ParamTypes param;//设置SVM参数
    	SVM::KernelTypes kernel = SVM::LINEAR;
    	Ptr<SVM> svm = SVM::create();
    	svm->setKernel(kernel);
    
    	//3.训练分类器
    	svm->trainAuto(trainData);
    
    	//4.预测
    	int result = svm->predict(plateImg);
    	cout << "预测结果: " << result << endl;
    }


    展开全文
  • 双频率相位展开法

    千次阅读 2020-02-17 13:08:36
    为了高速的获取物体相位就必须减少 光栅图像数量。因此双频的四步相 移一共投射8副图片,或者采用双频率三步相移一共投射6副图片,在增加相机的帧率的情况下可以 获得比较高的测量速度。 实验结果如下,拍摄一组...
  •  计算机视觉的是特征提取,即检测图像中的关键点并获取有关这些关键点的有意义信息。特征提取过程本身包含个基本阶段:图像准备、关键点检测、描述符生成和分类。实际上,这个过程会检查每个像素,以查看是否有...
  •  计算机视觉的第一是特征提取,即检测图像中的关键点并获取有关这些关键点的有意义信息。特征提取过程本身包含个基本阶段:图像准备、关键点检测、描述符生成和分类。实际上,这个过程会检查每个像素,以查看...
  • 这个过程四步:检测脸部标记。旋转、缩放、平移和第二张图片,以配合第一步。调整第二张图片的色彩平衡,以适配第一张图片。把第二张图像的特性混合在第一张图像中。公众号后台回复:"换脸”,获取程序完整...
  • 第*套获取数字图像过程大体分为四步:扫描、分色、取样、量化基于客户机/服务器体系结构 不属于单内核系统的特点,单内核系统的特点:执行效率高、性能好、占用资源较多用户通过接入互联网需要配置一个 ADSL MODEM...
  • php给图片添加文字水印

    千次阅读 2015-07-30 13:59:28
    大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 下面我们上代码来具体讲解每步的实现过程: /*打开图片*/ //1.配置图片路径 $src = "bg.jpg"; //2.获取图片信息 $info = getimagesize($src); ...
  • 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: &lt;?php /*打开图片*/ //1.配置图片路径 $src = "bg.jpg"; //2.获取图片信息 $info ...
  • 从无线电望远镜数据中创建天空图像过程的第一是以高速率对电磁频谱进行采样的天线对。 这样的样本的积分产品称为可见性,并具有相关的( u,v,w )坐标,具体取决于天线的位置,被观测源的位置,被观测信号的...
  • 文章大纲 ...采集是整个视频推流过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音频采集和图像采集,它们分别对应两种完全...
  • Excel_VBA教程

    2014-09-22 11:36:34
    章 VBA过程:子程序和函数 91 1.关于函数过程 91 2.创建函数过程 91 3.执行函数过程 92 4.从工作表里运行函数过程 93 5.从另外一个VBA过程里运行函数过程 94 6.传递参数 95 7.明确参数类型 96 8.按地址和按值...
  • ExcelVBA程序设计.doc

    2011-04-05 21:32:51
    章 VBA过程:子程序和函数 91 1.关于函数过程 91 2.创建函数过程 91 3.执行函数过程 92 4.从工作表里运行函数过程 93 5.从另外一个VBA过程里运行函数过程 94 6.传递参数 95 7.明确参数类型 96 8.按地址和按值...
  • 对于图x中的获取人脸特征向量,其过程如图所示: 图.获取人脸特征向量过程 2、采用百度api人脸比对,将摄像头所拍摄的照片与数据库中黑名单人员进行人脸比对,缩短检测运行时间。 两张人脸图片相似度对比:比对两...
  • ASP200问.EXE

    2010-05-20 13:25:08
    102.如何验证字符串为空 (示例) 103.如何验证字符串包含有效字符 106.如何验证整数或长整数 108.如何验证电子邮件地址 第7章 文件处理 113.读取驱动器信息 113.浏览文件夹下所有文件信息 113.文件夹的复制 113...
  • 尹成Python27天入门到项目实战

    千人学习 2020-12-05 17:04:22
    面向对象数据搜索实战输入处理文本编辑器表格数据树状显示数据搜索可视化第一步实现查询窗体数据搜索可视化第二步实现搜索数据数据搜索可视化第三步实现显示窗体数据可视化第四步显示与搜索串联数据可视化终结作业...
  • C++网络爬虫项目

    2018-07-04 00:59:17
    以上个事件流,需要平行且独立地并发运行,并在共享资源和执行步调上保 持适度的同步。 4. 目录结构 本项目的目录结构如下所示: WebCrawler/ ├── bin/ │ ├── WebCrawler │ ├── WebCrawler.cfg │ └─...
  • 支持种监控模式,设备面板监控+地图监控+表格数据监控+曲线数据监控,可自由切换,种同步应用。 支持报警继电器联动,一个位号可以跨串口联动多个模块和继电器号,支持多对多。 本地数据存储支持sqlite+mysql,...
  • flash shiti

    2014-03-14 10:32:41
    12. 如果导入的是图像序列中的一个picture001.bmp 文件,并且序列中的其他文件位于相同的 文件夹中,则将被识别为图像序列将是下面哪些: □ A. picture001.bmp □ B. picture002.bmp □ C. picture003.bmp □ D. ...
  • asp.net知识库

    2015-06-18 08:45:45
    体验.net2.0的优雅():Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——性能和灵活性兼备的方法 泛型技巧系列:用泛型...
  • HG526破解设置

    2013-09-13 00:40:24
    四步:对IPTV机顶盒进行配置(自行购买支持自己机顶盒型号的无线网卡,可去X宝上面搜索,购买) 1、保证机顶盒视频线、电源线连线正确,将无线网卡插入IPTV机顶盒后置的USB接口中,并按照说明将连接线把机顶盒和...
  • PowerPoint.2007宝典 8/10

    2012-04-01 18:39:23
    2.2.4 第四步:选择适合所选媒介的主题 37 2.2.5 第五步:开发内容 38 2.2.6 第六步:树立直观印象 39 2.2.7 第七步:添加多媒体效果 39 2.2.8 第八步:创建讲义和备注 40 2.2.9 第九步:排练演示文稿 ...

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

图像获取过程四步