• 图像特征提取

    2017-01-03 16:38:12
    从本节开始, 我们将逐步从数字图像处理向图像识别过渡。 严格地说, 图像特征提取属于图像分析的范畴, 是数字图像处理的高级阶段, 同时也是图像识别的开始。本文主要包括以下内容 常用的基本统计特征, 如周长、...

    从本节开始, 我们将逐步从数字图像处理向图像识别过渡。 严格地说, 图像特征提取属于图像分析的范畴, 是数字图像处理的高级阶段, 同时也是图像识别的开始。

    本文主要包括以下内容

    • 常用的基本统计特征, 如周长、面积、均值等区域描绘子, 以及直方图和灰度共现矩阵等纹理描绘子
    • 主成份分析(PCA, PrincipaJ Component Analysis)
    • 局部二进制模式(LBP, LocaJ Binary Pattern)
    • 本章的典型案例分析
      • 基于PCA技术的人脸数据集的降维处理

    图像特征概述

    众所周知,计算机不认识图像,只认识数字。为了使计算机能够“理解”图像,从而具有真正意义上的“视觉”,本章我们将研究如何从图像中提取有用的数据或信息,得到图像的“非图像” 的表示或描述,如数值、向量和符号等。这一过程就是特征提取,而提取出来的这些“非图像”的表示或描述就是特征。有了这些数值或向量形式的特征我们就可以通过训练过程教会计算机如何懂得这些特征, 从而使计算机具有识别图像的本领。

    什么是图像特征
    特征是某一类对象区别于其他类对象的相应(本质)特点或特性, 或是这些特点和特性的集合。特征是通过测量或处理能够抽取的数据。对于图像而言, 每一幅图像都具有能够区别于其他类图像的自身特征,有些是可以直观地感受到的自然特征,如亮度、边缘、纹理和色彩等;有些则是需要通过变换或处理才能得到的, 如矩、直方图以及主成份等。

    特征向量及其几何解释
    我们常常将某一类对象的多个或多种特性组合在一起, 形成一个特征向量来代表该类对象,如果只有单个数值特征,则特征向量为一个一维向量,如果是n个特性
    的组合,则为一个n维特征向量。该类特征向量常常作为识别系统的输入。实际上,一个n维特征就是位于n维空间中的点,而识别分类的任务就是找到对这个n维空
    间的一种划分。
    例如要区分3种不同的鸾尾属植物,可以选择其花瓣长度和花瓣宽度作为特征,这样就以1个2维特征代表1个植物对象,比如(5.1,3.5).如果再加上萼片长度和萼片宽度, 则每个鸾尾属植物对象由一个4维特征向置表示, 如(5.1, 3.5.1.4, 0.2)。

    特征提取的一般原则
    图像识别实际上是一个分类的过程,为了识别出某图像所属的类别,我们需要将它与其他不同类别的图像区分开来。这就要求选取的特征不仅要能够很好地描述图像, 更重要的是还要能够很好地区分不同类别的图像。
    我们希望选择那些在同类图像之间差异较小(较小的类内距),在不同类别的图像之间差异较大(较大的类间距)的图像特征, 我们称之为最具有区分能力(most discriminative)的特征。此外, 在特征提取中先验知识扮演着重要的角色, 如何依靠先验知识来帮助我们选择特征也是后面将持续关注的问题。

    特征的评价标准
    一般来说,特征提取应具体问题具体分析,其评价标准具有一定的主观性。然而,还是有一些可供遵循的普遍原则,能够作为我们在特征提取实践中的指导。总结如下。

    • 特征应当容易提取. 换言之, 为了得到这些特征我们付出的代价不能太大. 当然, 这还要与特征的分类能力权衡考虑.
    • 选取的特征应对噪声和不相关转换不敏感. 比如要识别车牌号码, 车牌照片可能是从各个角度拍摄的, 而我们关心的是车牌上字母和数字的内容, 因此就需要得到对几何失真变形等转换不敏感的描绘子, 从而得到旋转不变, 或是投影失真不变的特征.
    • 最重要的一点, 总是应试图寻找最具区分能力的特征.

    基本统计特征

    本节将主要介绍一些常用的基本统计特征, 包括一些简单的区域描绘子, 直方图及其统计特征, 以及灰度共现矩阵等.

    简单的区域描绘子及其Matlab实现

    在经过图像分割得到各种我们感兴趣的区域之后,可以利用下面介绍的一些简单区域描绘子作为代表该区域的特征。通常将这些区域特征组合成特征向量以供分类使用。

    常用的简单区域描绘子如下。

    • 周长:区域边界的长度, 即位于区域边界上的像素数目.
    • 面积:, 区域中的像素总数.
    • 致密性:(周长) 2/面积.
    • 区域的质心.
    • 灰度均值: 区域中所有像素的平均值.
    • 灰度中值: 区域中所有像素的排序中值.
    • 包含区域的最小矩形.
    • 最小或最大灰度级.
    • 大于或小于均值的像素数.
    • 欧拉数: 区域中的对象数减去这些对象的孔洞数。

    在Matlab中, 函数regionprops用于计算区域描绘子的有利工具, 其原型为:
    D = regionprops(L,properties)
    L是一个标记矩阵, 可通过8.3.4小节介绍的连通区标注函数bwlabel得到.
    properties可以是一个用逗号分割的字符串列表, 其一些常用取值如表10.1所示

    利用regionprops函数提取简单的区域特征

    I = imread('bw_mouth.bmp');
    I1 = bwlabel(I);
    D = regionprops(I1,'area','centroid');
    D.Area

    直方图及其统计特征

    首先来看纹理的概念。纹理是图像固有的特征之一,是灰度(对彩色图像而言是颜色)在空间以一定的形式变换而产生的图案(模式),有时具有一定的周期性。既然纹理区域的像素灰度级分布具有一定的形式,而直方图正是描述图像中像素灰度级分布的有力工具, 因此用直方图来描述纹理就顺理成章了。

    毫无疑问,相似的纹理具有相似的直方图;而由图10.2可见,3种不同特点的纹理对应3种不同的直方图。这说明直方图与纹理之间存在着一定的对应关系。因此,我们可以用直 方图或其统计特征作为图像纹理特征。直方图本身就是一个向量,向量的维数是直方图统计 的灰度级数,因此我们可以直接以此向量作为代表图像纹理的样本特征向量,从而交给分类器处理,对于LBP直方图就常常这样处理(见10.5节);另一种思路是进一步从直方图中提取出能够很好地描述直方图的统计特征,将直方图的这些统计特征组合成为样本特征向量, 这样做可以大大降低特征向量的维数。

    直方图的常用统计特征如下所述。


    一个由均值、标准差、平滑度和熵组合而成的特征向量如:v = (m,a, R, e)。
    应认识到直方图及其统计特征是一种区分能力相对较弱的特征,这主要因为直方图属于一阶统计特征,而它们的一阶统计特征是无法反映纹理结构的变化的。直方图与纹理的对应关系并不是一对一的:首先,不同的纹理可能具有相同或相似的直方图,如图10.3所示的两种截然不同的图案就具有完全相同的直方图;其次,即便是两个不同的直方m.也可能具有相同的统计特 征如均值、标准差等。因此,依靠直方图及其统计特征来作为分类特征时需要特别注意。

    灰度共现矩阵

    我们说灰度直方图是一种描述单个像素灰度分布的一阶统计量;而灰度共现矩阵描述的则是具有某种空间位置关系的两个像素的联合分布,可以看成是两个像素灰度对的联合直方图,是种二阶统计量。



    由于灰度共现矩阵总共含有LXL个元素,当灰度级L比较大时它将是一个庞大的方阵。如对于一般的256灰度图,凡就是一个256X256的矩阵,共216 个元素。如此庞大的矩阵将使后续的计算量剧增。因此普通灰度图像通常要经过处理以减少灰度级数,而后再计算灰度共现矩阵。可以通过分析纹理图像的直方图,在尽量不影响纹理质量的情况下.通过适当的灰度变换来达到灰度级压缩的目的。

    特征降维

    维度灾难

    最大值时,分类器的性能不是得到改善,而是退化。这种现象正是在模式识别中被称为“维度灾难”的一种表现形式。例如,我们要区分西瓜和冬瓜,表皮的纹理和长宽比例都是很好 的特征,还可以再加上瓜籽的颜色以辅助判断,然而继续加入重量、体积等特征可能是无益 的,甚至还会对分类造成干扰。
    基于以上所述原因,降维对我们产生了巨大的吸引力。在低维空间中计算和分类都将变 得简单很多,训练(教授分类器如何区分不同类样本的过程,详见第11章)所需的样本数目也会大大降低。通过选择好的特征,摒弃坏的特征(10.3.2特征选择),将有助于分类器性能的提升;在通过组合特征降维时,在绝大多数情况下,丢弃某些特征所损失的信息通过在低 维空间中更加精确的映射(10.3.3特征抽取)可以得到补偿。

    具体来说,降低维度又存在着两种方法:特征选择和特征抽取。如图10.8所示,特征选择是指选择全部特征的一个子集作为特征向量:特征抽取是指通过已有特征的组合建立一个 新的特征子集,10.3.2小节将要介绍的主成份分析方法(principa1component analysis, PCA)就是通过原特征的线性组合建立新的特征子集的一种特征抽取方法。

    特征选择简介

    重新回到10.1.3小节那个鸾尾属植物的问题。对于每一个莺尾属植物样本,总共有4个属性可以使用一一花瓣长度、花瓣宽度、萼片长度和萼片宽度。我们的目的是从中选择两个属性组成特征向量用于分类这3种鸾尾属植物。下面的Matlab程序选择了不同的特征子集,并给出了在对应特征空间中样本分布的可视化表示。

    load fisheriris;
    data = [meas(:,1),meas(:,2)];
    figure;
    scatter(data(1:50,1),data(1:50,2),'b+');
    hold on,scatter(data(51:100,1),data(51:100,2),'r*');
    hold on,scatter(data(101:150,1),data(101:150,2),'go');
    
    data = [meas(:,1),meas(:,3)];
    figure;
    scatter(data(1:50,1),data(1:50,2),'b+');
    hold on,scatter(data(51:100,1),data(51:100,2),'r*');
    hold on,scatter(data(101:150,1),data(101:150,2),'go');

    主成分分析(Princjpal Component Analysis, PCA)

    特征抽取是指通过已有特征的组合(变换)建立一个新的特征子集。在众多的组合方法当中,线性组合(变换)因其计算简单且便于解析分析的特点而显得颇具吸引力。下面就介绍一种通过特征的线性组合来实现降维的方法——主成分分析(principal conponent analysis.PCA)。PCA的实质就是在尽可能好地代表原始数据的前提下, 通过线性变换将高维空间中的样本数据投影到低维空间中

    具体可参见:降维算法学习
    为得到最小平方误差,应选取散布矩阵s的最大本征值所对应的本征向量作为投影直线e的方向。
    也就是说, 通过将全部n个样本向 以散布矩阵最大本征值对应的本征向量为方向的直线投影, 可以得到最小平方误差意义下这 n个样本的一维表示。

    PCA计算实例

    数据表示与数据分类
    通过PCA降维后的数据并不一定最有利于分类,因为PCA的目的是在低维空间中尽可能好地表示原数据,确切地说是在最小均方差意义下最能代表原始数据。而这一目的有时会和数据分类的初衷相违背。图10.13说明了这种情况,PCA投影后数据样本得到了最小均方意义 下的最好保留 , 但在降维后的一维空间中两类样本变得非常难以区分。图中还给出了一种适合于分类的投影方案,对应着另一种常用的降维方法-线性判别分析(linear discriminant analysis. LDA)。PCA寻找的是能够有效表示数据的主轴方向,而LDA则是寻找用来有效分类的投影方向。

    PCA的Matlab实现
    函数princomp实现了对PCA的封装, 其常见调用形式为:
    [COEFF,SCORE,latent]= princomp(X);
    X为原始样本组成n*d的矩阵,其每一行是一个样本特征向量,每一列表示样本特征向量的一维.如对于例10.2中的问题,X就是一个8*2的样本矩阵, 总共8个样本, 每个样本2维.
    COEFF: 主成份分量, 即变换空间中的那些基向量, 也是样本协方差矩阵的本征向量.
    SCORE: 主成份,X的低维表示, 即X中的数据在主成分分量上的投影(可根据需要取前面几列的).
    latent: 一个包含着样本协方差矩阵本征值的向量.

    快速PCA及其实现
    PCA的计算中最主要的工作量是计算样本协方差矩阵的本征值和本征向量。设样本矩阵 X大小为n*d (n个d维样本特征向量), 则样本散布矩阵(协方差矩阵) S将是一个dXd的方阵,故当维数d较大时计算复杂度会非常高。例如当维数d=1OOOO,S是一个10000*10000的矩阵,此时如果采用上面的princomp函数计算主成分,Matlab通常会出现内存耗尽的错误,即使有足够多的内存, 要得到S的全部本征值可能也要花费数小时的时间

    Matlab实现
    我们编写了fastPCA函数用来对样本矩阵A进行快速主成份分析和降维(降至k维),其输出pcaA为降维后的K维样本特征向量组成的矩阵, 每行一个样本, 列数K为降维后的样本特征维数,相当千princomp函数中的输出SCORE, 而输出V为主成份分量,好princomp函数中的COEFF

    function [pcaA V] = fastPCA( A, k )
    % 快速PCA
    %
    % 输入:A --- 样本矩阵,每行为一个样本
    %      k --- 降维至 k 维
    %
    % 输出:pcaA --- 降维后的 k 维样本特征向量组成的矩阵,每行一个样本,列数 k 为降维后的样本特征维数
    %      V --- 主成分向量
    
    [r c] = size(A);
    
    % 样本均值
    meanVec = mean(A);
    
    % 计算协方差矩阵的转置 covMatT
    Z = (A-repmat(meanVec, r, 1));
    covMatT = Z * Z';
    
    % 计算 covMatT 的前 k 个本征值和本征向量
    [V D] = eigs(covMatT, k);
    
    % 得到协方差矩阵 (covMatT)' 的本征向量
    V = Z' * V;
    
    % 本征向量归一化为单位本征向量
    for i=1:k
        V(:,i)=V(:,i)/norm(V(:,i));
    end
    
    % 线性变换(投影)降维至 k 维
    pcaA = Z * V;
    
    % 保存变换矩阵 V 和变换原点 meanVec
    save('Mat/PCA.mat', 'V', 'meanVec');


    在得到包含R的特征向量的矩阵V之后,为计算散布矩阵S的本征向量,只需计算Z*V。此外,还应注意PCA中需要的是具有单位长度的本征向量, 故最后要除以该向量的模从而将正交本征向量归一化为单位正交本征向量。

    局部二进制模式

    局部二进制模式(local binary patterns, LBP)最早是作为一种有效的纹理描述算子提出的,由于其对图像局部纹理特征的卓越描绘能力而获得了广泛的应用。LBP特征具有很强的
    分类能力(highly discriminative)、较高的计算效率, 并且对于单调的灰度变化具有不变性。

    基本LBP


    LBP的主要思想是以某一点与其邻域像素的相对灰度作为响应, 正是这种相对机制使 LBP算子对于单调的灰度变化具有不变性。 人脸图像常常会受到光照因素的影响而产生灰度变化,但在一个局部区域内,这种变化常常可以被视为是单调的,因此LBP在光照不均的人 脸识别应用中也取得了很好的效果.

    圆形邻域的LBPP,R算子

    基本LBP算子可以被进一步推广为使用不同大小和形状的邻域。采用圆形的邻域并结合双线性插值运算使我们能够获得任意半径和任意数目的邻域像素点。图10.18给出了一个半径为2的8邻域像素的圆形邻域, 图中每个方格对应一个像素,对于正好处于方格中心的邻
    域点(左、上、右、下四个黑点),直接以该点所在方格的像素值作为它的值;对于不在像素中心位置的邻域点(斜45度方向的4个黑点), 通过双线性插值确定其值。

    统一化LBP算子一一UnifomLBP

    由于LBP直方图大多都是针对图像中的各个分区分别计算的(详见10.5.5),对于一个普通大小的分块区域,标准LBP算子得到的二进模式数目(LBP直方图收集箱数目)较多,而实际位于该分块区域中的像素数目却相对较少, 这将会得到一个过于稀疏的直方图。从而
    使直方图失去统计意义。 因此应设法减少一些冗余的LBP模式, 同时又保留足够的具有重要描绘能力的模式。

    MB-LBP


    图像分区

    曾提到, 作为图像的一阶统计特征,直方图无法描述图像的结构信息。而图像各个区域的局部特征往往差异较大,如果仅对整个团像的生成一个LBP直方图,这些局部的差异信息就会丢失。分区LBP特征可有效解决这一问题。
    具体的方法是将一幅图像适当地划分为PXQ个分区(partition),然后分别计算每个图像分区的直方图特征,最后再将所有块的直方图特征连接成一个复合的特征向量(composite
    feature)作为代表整个图像的LBP直方图特征。

    分区大小的选择
    理论上, 越小越精细的分区意味着更好的局部描述能力,但同时会产生更高维数的复合特征。然而过小的分区会造成宜方图过于稀疏从而失去统计意义。人脸识别的应用中选择了18X21的分区大小,这可以作为对于一般问题的指导性标准,因为它是一个精确描述能力与特征复杂度的良好折中。在表情识别中更小一些(如1OX15)的分区被我们证明能够获得更好的分类能力。这里分区大小的单位是.MB-LBP的像素块(block)。如对于传统LBP, 每个
    分区大小取18像素X21像素, 则对于应MB-LBP分区大小应取18像素块X21像素块= 54像素X63像素口


    展开全文
  • 本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识...

           本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑、高斯平滑、不同算子的图像锐化知识。希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生。
           【数字图像处理】一.MFC详解显示BMP格式图片
           【数字图像处理】二.MFC单文档分割窗口显示图片
           【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
           【数字图像处理】四.MFC对话框绘制灰度直方图
           【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
           【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
            
    免费资源下载地址:
            http://download.csdn.net/detail/eastmount/8785591

     

    一. 图像增强简介

            图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)

     

    二. 图像平滑

            图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。

           1.简单平滑-邻域平均法
            图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
            但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。

            2.高斯平滑
           
    为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
            图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。
            在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。
            高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的3*3和5*5领域的高斯模板。

            模板越靠近邻域中心位置,其权值越高。在图像细节进行模糊时,可以更多的保留图像总体的灰度分布特征。下图是常用的四个模板和matlab代码实现:

            代码如下:

    I1 = imread('blood1.tif');
    I=imnoise(I1,‘salt & pepper’,0.04);                %对图像加椒盐噪声
    imshow(I);
    h1= [0.1 0.1 0.1; 0.1 0.2 0.1; 0.1 0.1 0.1];        %定义4种模板
    h2=1/16.*[1 2 1;2 4 2;1 2 1];
    h3=1/8.*[1 1 1;1 0 1;1 1 1];
    h4=1/2.*[0 1/4 0;1/4 1 1/4;0 1/4 0];
    I2=filter2(h1,I);                                   %用4种模板进行滤波处理
    I3=filter2(h2,I);
    I4=filter2(h3,I);
    I5=filter2(h4,I);
    figure,imshow(I2,[])                                %显示处理结果
    figure,imshow(I3,[])
    figure,imshow(I4,[])
    figure,imshow(I5,[])

            运行效果如下图所示:

            3.中值滤波
            在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。
            选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。

            例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:

            常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。

            中值滤波对于消除孤立点和线段的干扰十分有用,尤其是对于二进噪声,但对消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波。matlab实现参考:http://blog.csdn.net/timidsmile/article/details/6904381

            4.边界保持类滤波
            K近邻均值滤波器(KNNF)是指在m*m的窗口中,属于同一集合类的像素,它们的灰度值将高度相关。被处理的像素(对应于窗口中心的像素)可以用窗口内与中心像素灰度最接近的k个近邻像素的平均灰度来替代。步骤如下:
            (1).作一个m*m的作用模板
            (2).在其中选择K个与待处理像素的灰度差为最小的像素
            (3).用这K个像素的灰度均值替换掉原来的值

            在K近旁均值滤波器(KNNMF)中,不选K个邻近像素的平均灰度来替代,而选K个邻近像素的中值灰度来替代,上图中2,3,3中选择3即可。
            下面介绍具体MFC VC++6.0代码实现过程。

     

    三. 图像平滑代码实现

            第一步:在资源视图的Menu中添加子菜单“图像增强”,然后添加“图像平滑”四个选项如下图所示:

            第二步:打开类向导,在ImageProcessingView类中添加相应的四个实现函数:

            第三步:就是具体的平滑实现函数。
            1.普通平滑 模板一
            该算法采用的模板如下:

            代码如下:

    /**************************************************
      第九章--图像增强    
      图像平滑 普通平滑 模板
     
    float H1[3][3]={{1.0/10,1.0/10,1.0/10}, //模板一:系数1/10
    			   {1.0/10,2.0/10,1.0/10},
    			   {1.0/10,1.0/10,1.0/10}};
    		
    float H2[3][3]={{1.0/16,2.0/16,1.0/16}, //模板二:系数1/16
    			   {2.0/16,4.0/16,2.0/16},
    			   {1.0/16,2.0/16,1.0/16}};
    
    float H3[3][3]={{1.0/8,1.0/8,1.0/8},    //模板三:系数1/8,此种情况为把点转为空心矩形
    			   {1.0/8,0.0/8,1.0/8},
    			   {1.0/8,1.0/8,1.0/8}};
    
    float H4[3][3]={{0.0,1.0/8,0.0},        //模板四:系数乘数据后的矩阵
    			   {1.0/8,1.0/2,1.0/8},
    			   {0.0,1.0/8,0.0}};
    
    /**************************************************/
    
    
    void CImageProcessingView::OnTxzqPtph1() 
    {
    	if(numPicture==0) {
    		AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(平滑)!选取的模板为:普通平滑 模板一",MB_OK,0);
    
    	/******************************************************************/
    	/* 图想平滑的算法:                                               
    	/*   1.定义常用的四个模板,它们的维数均为3,矩阵的个数均为9个数据   
    	/*   2.它的思想是把一个点分散到这周围的9个点上,这样使图像更模糊   
    	/*   3.通过卷积计算围绕该点的矩阵像素和,计算其平均值(除9)赋值给点 
    	/*   4.模块不同,处理后的图像也各不相同                           
    	/******************************************************************/
    
    	/*第一步:先定义数据模板*/
    	int HWS=3;                                //模板维数:此四个模板均为3维的
    	float H1[3][3]={{1.0/10,1.0/10,1.0/10},   //模板一:系数1/10
    					{1.0/10,2.0/10,1.0/10},
    					{1.0/10,1.0/10,1.0/10}};
    	
    	//打开临时的图片
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
        fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	//new和delete有效的进行动态内存的分配和释放
        unsigned char *ImageSize;        
        ImageSize = new unsigned char[m_nImage];    
    	float red,green,blue;
    	int X,Y;               //一维坐标转换为二维坐标
    	int TR,TG,TB;          //记录红绿蓝坐标位置
    
    	//图像增强:平滑 它要获取源图像周围9个点的矩阵乘以模板9个点的矩阵,故一维图像转二维
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		//原图:一维矩阵转换为二维矩阵
    		X=(i/3)%m_nWidth;    //图像在X列
    		Y=(i/3)/m_nWidth;    //图像在Y行
    
    		//赋值为黑色,相当于清零
    		red=green=blue=0;
    
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )      //防止越界
    				{			
    					//模板一 进行模板平均,把该点像素分散到四周
    					TR=j*m_nWidth*3+k*3;	
    					red+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H1[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值
    		ImageSize[i]=(unsigned char)(red);
    		ImageSize[i+1]=(unsigned char)(green);
    		ImageSize[i+2]=(unsigned char)(blue);
    	}
    		
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;
    	Invalidate();
    }

            运行效果如图所示,图像平滑模糊了,但效果不是很好。

            其中实现的具体原理如下:
            首先将图像像素矩阵转换为(X,Y)的二维矩阵进行操作,同时获取(X,Y)坐标为中心的3*3矩阵,再通过它与3*3模板进行像素平均操作,就是两个3*3矩阵互乘。需要注意的是矩阵一个格子是RGB三字节(24位BMP),同时获取该中心点位置时,通过两层循环for(k=n-1;k<=n+1;k++)实现获取矩阵中九个点的像素。最后对该点(X,Y)的RGB进行赋值操作即可。


           2.普通平滑 模板二
            该算法采用的模板如下:

            代码如下:

    void CImageProcessingView::OnTxzqPtph2() 
    {
    	if(numPicture==0) {
    		AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(平滑)!选取的模板为:普通平滑 模板二",MB_OK,0);
    
    	/*第一步:先定义数据模板*/
    	int HWS=3;
    	float H2[3][3]={{1.0/8,1.0/8,1.0/8},    //模板三:系数1/8 此种情况为把点转为空心矩形
    					{1.0/8,0.0/8,1.0/8},
    					{1.0/8,1.0/8,1.0/8}};
    	
    	//打开临时的图片
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
        fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    	
    	//重点:图像的每行像素都必须是4的倍数:1*1的图像为 r g b 00H   
    	int num;            //记录每行多余的图像素数个数  
    	int sfSize;         //补齐后的图像大小  
        if(m_nWidth*3%4!=0) {  
            num=(4-m_nWidth*3%4);  
            sfSize=(m_nWidth*3+num)*m_nHeight; //每行多number个  
        }  
        else {  
            num=0;  
            sfSize=m_nWidth*m_nHeight*3;  
        }  
      
        /*更改文件头信息 定义临时文件头结构变量*/  
        BITMAPFILEHEADER bfhsf;  
        BITMAPINFOHEADER bihsf;         
        bfhsf=bfh;  
        bihsf=bih;  
        bfhsf.bfSize=sfSize+54;  
        fwrite(&bfhsf,sizeof(BITMAPFILEHEADER),1,fpw);  
        fwrite(&bihsf,sizeof(BITMAPINFOHEADER),1,fpw);  
        fread(m_pImage,m_nImage,1,fpo);  
    
    	//new和delete有效的进行动态内存的分配和释放
        unsigned char *ImageSize;        
        ImageSize = new unsigned char[sfSize];    
    	float red,green,blue;
    	int X,Y;               //一维坐标转换为二维坐标
    	int TR,TG,TB;          //记录红绿蓝坐标位置  
        int countWidth=0;      //记录每行的像素个数,满行时变回0  
    	int place=0;           //建立临时坐标 记录起始坐标(0,0)平移过来的位置 
    
    	//图像增强 平滑
    	for(int i=0; i<m_nImage; )
    	{
    		//原图一维矩阵转换为二维矩阵
    		X=(i/3)%m_nWidth;    //图像在X列
    		Y=(i/3)/m_nWidth;    //图像在Y行
    
    		//赋值为黑色,相当于清零
    		red=green=blue=0;
    
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )      //防止越界
    				{			
    					//模板二 进行模板平均,把该点像素分散到四周
    					TR=j*m_nWidth*3+k*3;	
    					red+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H2[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值
    		//通过变量place赋值变换后的图像 i始终指向原图3的倍数 为了补0而添加place变量
    		ImageSize[place]=(unsigned char)(red);
    		i++; place++;
    		ImageSize[place]=(unsigned char)(green);
    		i++; place++;
    		ImageSize[place]=(unsigned char)(blue);
    		i++; place++;
    		countWidth=countWidth+3;
    		
    		if(countWidth==m_nWidth*3)    
            {    
    			if(num==0)  
                {  
                    countWidth=0;    
                    place=Y*m_nWidth*3;
                }  
                else //num为补0  
                {  
                    for(int n=0;n<num;n++)  
                    {    
                        ImageSize[place]=0;  
    					place++;  
                    }  
                    countWidth=0;   
                    place=Y*(m_nWidth*3+num); //重点 添加Num  
                }  
    		} 
    	}
    		
    	fwrite(ImageSize,sfSize,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture=2;
    	level=400;
    	Invalidate();
    }

            你可能注意到了,在图像处理过程中,如果每行的字节数不是4的倍数,可能会出现斜线之类的处理BUG,所以需要手动补0筹齐4的倍数,代码中补0后运行效果如下图所示,我也一直没找到原因,可能是思想和深度还没有达到,以后有机会在解决吧!同时后面的算法都不准备再进行补0处理,主要讲述算法的思想!

             3.高斯平滑
             采用的模板如下:

            代码如下图所示:

    //高斯平滑
    void CImageProcessingView::OnTxzqGsph() 
    {
    	if(numPicture==0) {
    		AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(平滑)!选取的模板为:高斯平滑",MB_OK,0);
    
    	/*第一步:先定义数据模板*/
    	int HWS=3;                                //模板维数为3维
    	float H[3][3]={{1.0/16,2.0/16,1.0/16},    //高斯模板 系数1/16
    				   {2.0/16,4.0/16,2.0/16},
    				   {1.0/16,2.0/16,1.0/16}};
    	
    	//打开临时的图片
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
        fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	//new和delete有效的进行动态内存的分配和释放
        unsigned char *ImageSize;        
        ImageSize = new unsigned char[m_nImage];    
    	float red,green,blue;
    	int X,Y;               //一维坐标转换为二维坐标
    	int TR,TG,TB;          //记录红绿蓝坐标位置
    
    	//图像增强:平滑 
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		//原图:一维矩阵转换为二维矩阵
    		X=(i/3)%m_nWidth;    //图像在X列
    		Y=(i/3)/m_nWidth;    //图像在Y行
    
    		//赋值为黑色,相当于清零
    		red=green=blue=0;
    
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )      //防止越界
    				{			
    					//模板二 进行模板平均,把该点像素分散到四周
    					TR=j*m_nWidth*3+k*3;	
    					red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值
    		ImageSize[i]=(unsigned char)(red);
    		ImageSize[i+1]=(unsigned char)(green);
    		ImageSize[i+2]=(unsigned char)(blue);
    	}
    		
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;
    	Invalidate();
    }

            运行效果如下图所示:

            4.中值滤波
            中值滤波我的理解是:它不但可以去除孤点噪声,而且可以保持图像的边缘特性,不会产生显著的模糊;它的方法是把局部区域的像素按灰度等级进行排序,再取该邻域中灰度的中值作为当前像素的灰度值。其步骤如下:
            (1).将滤波模板(含若干个点的滑动窗口)在图像中漫游,并将模板中心与图像中的某个像素位置重合;
            (2).读取模板中各对应像素的灰度值;
            (3).将这些灰度值从小到大排序;
            (4).取这一列数据的中间数据,将其赋值给对应模板中心位置的像素。

            我采用的是3*3的模本,取矩阵中间位置像素替代原像素。代码如下:

    //中值滤波
    void CImageProcessingView::OnTxzqZzlb() 
    {
    	if(numPicture==0) {
    		AfxMessageBox("载入图片后才能图像增强(平滑)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(平滑)!选取的模板为:中值滤波",MB_OK,0);
    
    	//打开临时的图片
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
        fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	//new和delete有效的进行动态内存的分配和释放
        unsigned char *ImageSize;        
        ImageSize = new unsigned char[m_nImage];    
    	int X,Y;               //一维坐标转换为二维坐标
    	int TR,TG,TB;          //记录红绿蓝坐标位置
    
    	//选取它为中心的周围9个点像素(注意一个点为RGB)
    	int H[9]={0,0,0,0,0,0,0,0,0};    
    	int HWS=3;             //维数为三维
    
    	//图像增强:平滑 它要获取源图像周围9个点的矩阵乘以模板9个点的矩阵,故一维图像转二维
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		//原图:一维矩阵转换为二维矩阵
    		X=(i/3)%m_nWidth;    //图像在X列
    		Y=(i/3)/m_nWidth;    //图像在Y行
    		
    		//第一行 第一列 最后一行 最后一列 直接复制
    		if(X==0 || Y==0 || X==m_nWidth*3 || Y==m_nHeight) 
    		{
    			if(i+2>m_nImage) break;
    			ImageSize[i] = m_pImage[i];
    			ImageSize[i+1] = m_pImage[i+1];
    			ImageSize[i+2] = m_pImage[i+2];
    			continue;
    		}
    
    		//对图像进行像素求和并取平均值 HWS维数
    		int num=0;
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )      //防止越界
    				{			
    					//获取当前位置Red像素 k一次增加RGB三个像素 R=G=B
    					TR = j*m_nWidth*3+k*3;	
    					H[num] = m_pImage[TR];
    					num++;
    				}
    			}
    		}
    		//排序获取中间值
    		int temp=0;
    		for(int x=0;x<9;x++)
    		{
    			for(int y=x;y<9;y++)
    			{
    				if(H[x]>=H[y])
    				{
    					temp=H[x];
    					H[x]=H[y];
    					H[y]=temp;
    				}
    			}
    		}
    		//CString str;
    		//str.Format("矩阵:%d %d %d, %d %d %d, %d %d %d",H[0],H[1],H[2],H[3],H[4],H[5],H[6],H[7],H[8]);
    		//AfxMessageBox(str);
    
    		//对新图像赋值 灰度图像RGB相同
    		ImageSize[i]=H[4];
    		ImageSize[i+1]=H[4];
    		ImageSize[i+2]=H[4];
    	}
    		
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;
    	Invalidate();
    }

            运行效果如下图所示:

            PS:这部分总算讲述完成,算法都是根据自己的理解用底层代码实现的,而不是向其它的通过调用GDI+库实现。可能存在因为理解不够或其它的错误,欢迎提出修改~
            推荐资料:
            图像平滑处理——OpenCV         数字图像处理学习笔记——图像平滑锐化 
            中值滤波    

     

    四. 图像锐化

           有时还需要加强图像中景物的边缘和轮廓,边缘和轮廓通常位于图像中灰度突出的地方,因而可以直观的想到用灰度的差分对边缘和轮廓进行提取,通常可以通过梯度算子进行提取。图像锐化的目的是提高图像的对比度,从而使图像更清晰,通过提高邻域内像素的灰度差来提高图像的对比度。
           下面介绍图像锐化的几种算子及效果。
            1.拉普拉斯算子(Laplacian)
            拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该被进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
            在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
            一个连续的二元函数f(x,y),其拉普拉斯运算定义为:

            对于数字图像,拉普拉斯算子可以简化为:

            也可以表示为卷积的形式:

            其中K=1,I=1时H(r,s)取下式,四方向模板:

            通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积为负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。
            其中实现过程步骤如下:
            添加子菜单和类向导添加实现函数

            代码如下:

    /*****************************************/
    /* 图像锐化:我在menu中创建5个子的menu    */
    /* 防止出现平滑错误,一次只调用一个下拉单 */
    /* ID_RH_Laplacian Laplacian拉普拉斯算子 */
    /* ID_RH_Sobel Sobel算子                 */
    /* ID_RH_Prewitt Prewitt算子             */
    /* ID_RH_Isotropic Isotropic算子         */
    /* ID_RH_GTMB 高通模板H2                 */
    /*****************************************/
    
    void CImageProcessingView::OnRHLaplacian() 
    {
    	if(numPicture==0) 
    	{
    		AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(锐化):采用拉普拉斯(Laplacian)算子!");
    
    	//模板维数:此四个模板均为3维的
    	int HWS=3;  
    	int H[3][3]={{0,-1,0},    //模板为拉普拉斯算子(中心为4的Laplacian)
    				{-1,4,-1},
    				{0,-1,0}};
    
    	//读写文件
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	//new和delete有效的进行动态内存的分配和释放
    	unsigned char *ImageSize;      
    	ImageSize=new unsigned char[m_nImage];  
    	int red,green,blue;
    	int X,Y;       //一维坐标转换为二维坐标
    	int TR,TG,TB;  //记录红绿蓝坐标位置
    	
    	//图像增强 锐化
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		X=(i/3)%m_nWidth;    //X列
    		Y=(i/3)/m_nWidth;    //Y行
    		red=green=blue=0;
    		
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )
    				{			
    					
    					TR=j*m_nWidth*3+k*3;	
    					red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值
    		if(red>=0 && red<256) ImageSize[i]=red;
    		else if(red<0) ImageSize[i]=0;      //ImageSize[i]=-red;
    		else ImageSize[i]=0;
    		
    		if(green>=0 && green<256) ImageSize[i+1]=green;
    		else if(green<0) ImageSize[i+1]=0;  //ImageSize[i+1]=-green;
    		else ImageSize[i+1]=0;
    		
    		if(blue>=0 && blue<256) ImageSize[i+2]=blue;
    		else if(blue<0) ImageSize[i+2]=0;   //ImageSize[i+2]=-blue;
    		else ImageSize[i+2]=0;
    	}
    	
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;	
    	Invalidate();
    }

            运行效果如下图所示:


            2.高通滤波
            常用的高通模板如下所示,其中H2有的书又称为拉普拉斯八方向的锐化模板。

            选取H2模板,代码如下所示:

    //高通模板
    void CImageProcessingView::OnRhGtmb() 
    {
    	if(numPicture==0)
    	{
    		AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(锐化):采用高通模板!");
    
    	int HWS=3;                                
    	int H[3][3]={{-1,-1,-1},    
    				{-1,8,-1},
    				{-1,-1,-1}};
    
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	unsigned char *ImageSize;      
    	ImageSize=new unsigned char[m_nImage];  
    	int red,green,blue;
    	int X,Y;       
    	int TR,TG,TB; 
    	
    	//图像增强 锐化
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		X=(i/3)%m_nWidth;    //X列
    		Y=(i/3)/m_nWidth;    //Y行
    		red=green=blue=0;
    		
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )
    				{			
    					
    					TR=j*m_nWidth*3+k*3;	
    					red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);
    				}
    			}
    		}
    		
    		//对新图像赋值
    		if(red>=0 && red<256) ImageSize[i]=red;
    		else if(red<0) ImageSize[i]=0;      //ImageSize[i]=-red;
    		else ImageSize[i]=0;
    		
    		if(green>=0 && green<256) ImageSize[i+1]=green;
    		else if(green<0) ImageSize[i+1]=0;  //ImageSize[i+1]=-green;
    		else ImageSize[i+1]=0;
    		
    		if(blue>=0 && blue<256) ImageSize[i+2]=blue;
    		else if(blue<0) ImageSize[i+2]=0;   //ImageSize[i+2]=-blue;
    		else ImageSize[i+2]=0;
    	}
    	
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;	
    	Invalidate();	
    }

            运行效果如下图所示,该效果相对较好:

     


           3.Sobel算子

            代码如下所示,需要注意X和Y两个方向的模板处理:

    //Sobel算子采用PPT上的d(x)d(y)模板
    void CImageProcessingView::OnRHSobel() 
    {
    	if(numPicture==0)
    	{
    		AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(锐化):采用Sobel算子!");
    
    	int HWS=3;                                
    	//模板为Sobel算子
    	int HX[3][3]={{1,0,-1},{2,0,-2},{1,0,-1}};
    	int HY[3][3]={{-1,-2,-1},{0,0,0},{1,2,1}};
    
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);	
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	unsigned char *ImageSize;      
    	ImageSize=new unsigned char[m_nImage];  
    	int redX,greenX,blueX;
    	int redY,greenY,blueY;
    	int X,Y;       
    	int TR,TG,TB;  
    	
    	//图像增强 锐化
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		X=(i/3)%m_nWidth;    //X列
    		Y=(i/3)/m_nWidth;    //Y行
    		redX=greenX=blueX=0;
    		redY=greenY=blueY=0;
    		
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )
    				{			
    					
    					TR=j*m_nWidth*3+k*3;	
    					redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);
    					redY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);
    					greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);
    					blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);
    				}
    			}
    		}
    		//s=(d(x)*d(x)+d(y)*d(y))开根号
    		int R,G,B;
    		R=(int)(sqrt(redX*redX*1.0+redY*redY*1.0));
    		G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));
    		B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));
    
    		if(redX<0 && redY<0) ImageSize[i]=0;
    		else if(R>255) ImageSize[i]=255;
    		else ImageSize[i]=R;
    		
    		if(greenX<0 && greenY<0) ImageSize[i+1]=0;
    		else if(G>255) ImageSize[i+1]=255;
    		else ImageSize[i+1]=G;
    
    		if(blueX<0 && blueY<0) ImageSize[i+2]=0;
    		else if(B>255) ImageSize[i+2]=255;
    		else ImageSize[i+2]=B;
    	}
    	
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;	
    	Invalidate();
    }

            运行效果如下图所示:

            如果采用Sobel边缘细化,建议二值化(0和255阈值化)处理后再锐化,彩色图建议先灰度处理再进行其他处理。


          4.Isotropic算子
     

            代码实现如下:

    //Isotropic算子采用PPT上的d(x)模板 d(y)
    void CImageProcessingView::OnRHIsotropic() 
    {
    	if(numPicture==0)
    	{
    		AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);
    		return;
    	}
    
    	AfxMessageBox("图像增强(锐化):采用Isotropic算子!");
    
    	int HWS=3;                               
    	//模板为Isotropic算子
    	float HX[3][3]={{1,0,-1},
    					{sqrt(2.0),0,-sqrt(2.0)}, 
    					{1,0,-1} };
    	float HY[3][3]={{-1,-sqrt(2.0),-1},
    					{0,0,0}, 
    					{1,sqrt(2.0),1} };
    
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	unsigned char *ImageSize;      
    	ImageSize=new unsigned char[m_nImage];  
    	float redX,greenX,blueX;
    	float redY,greenY,blueY;
    	int X,Y;      
    	int TR,TG,TB;  
    	
    	//图像增强
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		X=(i/3)%m_nWidth;    //X列
    		Y=(i/3)/m_nWidth;    //Y行
    		redX=greenX=blueX=0;
    		redY=greenY=blueY=0;
    		
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )
    				{			
    					
    					TR=j*m_nWidth*3+k*3;	
    					redX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);
    					redY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					greenX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);
    					greenY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blueX+=HX[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);
    					blueY+=HY[(j-Y+HWS/2)][(k-X+HWS/2)]*(float)(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值 s=(d(x)*d(x)+d(y)*d(y))开根号
    		int R,G,B;
    		R=(int)(sqrt(redX*redX*1.0+redY*redY*1.0));
    		G=(int)(sqrt(greenX*greenX*1.0+greenY*greenY*1.0));
    		B=(int)(sqrt(blueX*blueX*1.0+blueY*blueY*1.0));
    
    		if(redX<0 && redY<0) ImageSize[i]=0;
    		else if(R>255) ImageSize[i]=255;
    		else ImageSize[i]=R;
    		
    		if(greenX<0 && greenY<0) ImageSize[i+1]=0;
    		else if(G>255) ImageSize[i+1]=255;
    		else ImageSize[i+1]=G;
    
    		if(blueX<0 && blueY<0) ImageSize[i+2]=0;
    		else if(B>255) ImageSize[i+2]=255;
    		else ImageSize[i+2]=B;
    	}
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;	
    	Invalidate();
    }

            运行效果如下图所示,效果与上面的Sobel类似:


           5.Prewitt算子

            代码如下图所示:

    //Prewitt算子采用PPT上的d(x)模板,不是d(y)
    void CImageProcessingView::OnRHPrewitt() 
    {
    	
    	if(numPicture==0)
    	{
    		AfxMessageBox("载入图片后才能图像增强(锐化)!",MB_OK,0);
    		return;
    	}
    	AfxMessageBox("图像增强(锐化):采用Prewitt算子!");
    
    	int HWS=3;                               
    	int H[3][3]={{1,0,-1},    //模板为Prewitt算子
    				{1,0,-1},
    				{1,0,-1}};
    
    	FILE *fpo = fopen(BmpName,"rb");
    	FILE *fpw = fopen(BmpNameLin,"wb+");
    	fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
    	fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
    	fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
    	fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);
    	fread(m_pImage,m_nImage,1,fpo);
    
    	unsigned char *ImageSize;      
    	ImageSize=new unsigned char[m_nImage];  
    	int red,green,blue;
    	int X,Y;      
    	int TR,TG,TB; 
    	
    	//图像增强:平滑
    	for(int i=0; i<m_nImage ; i=i+3 )
    	{
    		X=(i/3)%m_nWidth;    //X列
    		Y=(i/3)/m_nWidth;    //Y行
    		red=green=blue=0;
    		
    		//对图像进行像素求和并取平均值 HWS维数
    		for(int j=Y-HWS/2 ; j<Y+HWS/2+1 ; j++ )                      //第j行
    		{
    			for(int k=X-HWS/2 ; k<X+HWS/2+1 ; k++ )                  //第k列
    			{
    				if( j>=0 && k>=0 && k<m_nWidth && j<m_nHeight )
    				{			
    					
    					TR=j*m_nWidth*3+k*3;	
    					red+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TR]);
    					TG=j*m_nWidth*3+k*3+1;
    					green+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TG]);
    					TB=j*m_nWidth*3+k*3+2;
    					blue+=H[(j-Y+HWS/2)][(k-X+HWS/2)]*(m_pImage[TB]);
    				}
    			}
    		}
    		//对新图像赋值
    		if(red>=0 && red<256) ImageSize[i]=red;
    		else if(red<0) ImageSize[i]=0;      //ImageSize[i]=-red;
    		else ImageSize[i]=0;
    		
    		if(green>=0 && green<256) ImageSize[i+1]=green;
    		else if(green<0) ImageSize[i+1]=0;  //ImageSize[i+1]=-green;
    		else ImageSize[i+1]=0;
    		
    		if(blue>=0 && blue<256) ImageSize[i+2]=blue;
    		else if(blue<0) ImageSize[i+2]=0;   //ImageSize[i+2]=-blue;
    		else ImageSize[i+2]=0;	
    	}
    	fwrite(ImageSize,m_nImage,1,fpw);  
    	fclose(fpo);
    	fclose(fpw);
    	numPicture = 2;
    	level=400;	
    	Invalidate();
    }

            运行效果如下图所示,只选取了X分量:

            最后还是希望文章对你有所帮助,如果文章有不足或错误之处,请海涵。自己给自己点个赞,挺不容易的,但还会继续写完~同时后面的图像处理准备研究些感兴趣的东西,而不是这样的长篇大论了,例如怎样实现验证码提取、如何实现图像恢复、DICOM图像等知识吧!

          (By:Eastmount 2015-06-08 下午6点   http://blog.csdn.net/eastmount/

    展开全文
  • 本博文主要介绍了图像处理的一些基础知识 一. 图像存储原理 图像存储原理主要分为5种 1. RGB颜色空间,使用最为广泛的颜色空间。 2. CMY(K)颜色空间,主要用于印刷行业。 3. HSV/HSL(I)颜色空间,人类视觉,和...

    本博文主要介绍了图像处理的一些基础知识

    一. 图像存储原理

    图像存储原理主要分为5种

    1. RGB颜色空间,使用最为广泛的颜色空间。

    2. CMY(K)颜色空间,主要用于印刷行业。

    3. HSV/HSL(I)颜色空间,人类视觉,和画家配色领域。

    4. CIE-XYZ颜色空间,国际照明协会应用。

    5. CIE-Lab对色空间,接近人类视觉。

     

    二. 空域分析及变换

    滤波/卷积的计算过程:

    滤波/卷积  边界补充问题:

    1. 补零:

    2. 边界复制

    3. 镜像

    4.块复制

     

    滤波/卷积的类别有哪些:

    1. 平缓均值滤波:卷积核里面数字的大小一直,并且卷积核的尺寸是奇数尺寸。

     

    2.平滑中值滤波:对卷积像素区域的数值大小排序,选取中间的数值作为结果。卷积核尺寸大小是奇数尺寸。

    平滑中值滤波可以有效地去除椒盐噪声。

    去除椒盐噪声

     

    3. 平滑高斯滤波/卷积:模拟人眼效果,关注中心区域,中心区域的以外的像素点逐渐变小,距离越远数值越小。

    高斯滤波的特性:分解特性。

    可以将2D卷积拆分成另个相同的1D卷积,减少了计算量。

    2D卷积计算量是:K*K。1D卷积的计算量是2*K。

     

     

    4. 用来提取图像边缘信息的滤波/卷积

    1)梯度Prewitt滤波/卷积:

    提取水平信息的滤波/卷积

    提取处置信息的滤波/卷积:

     

    2)Sobel滤波/卷积:相当于Prewitt加权,或这是加入高斯平滑。

    水平方向的:

    垂直方向的:

     

    3)梯度Laplacian滤波/卷积

    可以用来做:团块检测(周边像素高于或者低于中心像素)和边缘检测(像素值变化快速的区域)。

     

    4)其他滤波和卷积

    左移位:

    锐化:(高斯滤波+均值滤波)

     

    三. 频域分析及变换

    1. 傅里叶变换:一个信号可以由足够多个不同频率和振幅的正余弦波组成。

    傅里叶变换的主要性质就是:可以将空域的卷积操作转换成频域的乘积操作。这样大大减少了计算量,增加了运行速度。下图就是傅里叶变换的一个流程图。

    傅里叶变换:如下图所示,我们的图像是一个M*N大小的图片。左上角为像素的起始坐标(0,0)。经过傅里叶变化之后起始点移动到中心位置。

    下图详细介绍了经过傅里叶变化之后的图片。下图的起始位置是(0,0)点。起始点水平往右频率越来越高,振幅越来越低。起始点垂直往下开始频率越来越高,振幅越来越低。起始点斜下开始也是程相同的变化。

    下图是傅里叶变化:

    空域卷积=频域乘积

     

    2. 高斯金字塔:

    高斯卷积+下采样  n次

    金字塔加入高斯滤波的必要性,为什么不直接使用下采样来做成金字塔模型。如下图所示,如果只用下采样会造成更多的信息丢失。

     

    3. 拉普拉斯金字塔:图像信息会在卷积和下采样的过程中丢失,为了保留这些丢失的信息恢复图像,从而引入了拉普拉斯金字塔。

    Gi表示当前层卷积图像信息,UP(Gi+1)表示下一层卷积图上采样。g5*5表示5*5卷积。

    下图就是图像恢复的流程图:

    从左边开始第一列是高斯金字塔,第二列是拉普拉斯金字塔,第三列是原图像金字塔。左边的两列是为了提取拉普拉斯特征图,右边的两列是通过拉普拉斯金字塔来恢复原来的图片。

     

    4. 模板匹配

    作用是用来同尺度的目标检测。

    目标相似度检测方法有:欧氏距离,相关,去均值相关。

     

     

    展开全文
  • 本文介绍了 25 个深度学习开放数据集,包括图像处理、自然语言处理、语音识别和实际问题数据集。介绍深度学习(或生活中大部分领域)的关键在于实践。你需要练习解决各种问题,包括图像处理、语音识别等。每个问题都...

    选自Analytics Vidhya,作者:Pranav Dar,机器之心编译。

    本文介绍了 25 个深度学习开放数据集,包括图像处理、自然语言处理、语音识别和实际问题数据集。

    介绍

    深度学习(或生活中大部分领域)的关键在于实践。你需要练习解决各种问题,包括图像处理、语音识别等。每个问题都有其独特的细微差别和解决方法。

    但是,从哪里获得数据呢?现在许多论文都使用专有数据集,这些数据集通常并不对公众开放。如果你想学习并应用技能,那么无法获取合适数据集是个问题。

    如果你面临着这个问题,本文可以为你提供解决方案。本文介绍了一系列公开可用的高质量数据集,每个深度学习爱好者都应该试试这些数据集从而提升自己的能力。在这些数据集上进行工作将让你成为一名更好的数据科学家,你在其中学到的知识将成为你职业生涯中的无价之宝。我们同样介绍了具备当前最优结果的论文,供读者阅读,改善自己的模型。


    如何使用这些数据集?

    首先,你得明白这些数据集的规模非常大!因此,请确保你的网络连接顺畅,在下载时数据量没有或几乎没有限制。

    使用这些数据集的方法多种多样,你可以应用各种深度学习技术。你可以用它们磨炼技能、了解如何识别和构建各个问题、思考独特的使用案例,也可以将你的发现公开给大家!

    数据集分为三类——图像处理、自然语言处理和音频/语音处理。

    让我们一起看看吧!


    图像处理数据集

    MNIST

    链接:datahack.analyticsvidhya.com

    MNIST 是最流行的深度学习数据集之一。这是一个手写数字数据集,包含一个有着 60000 样本的训练集和一个有着 10000 样本的测试集。对于在现实世界数据上尝试学习技术和深度识别模式而言,这是一个非常好的数据库,且无需花费过多时间和精力进行数据预处理。


    大小:约 50 MB

    数量:70000 张图像,共分为 10 个类别。

    SOTA:《Dynamic Routing Between Capsules》


    参考阅读:


    MS-COCO

    链接:cocodataset.org/#

    COCO 是一个大型数据集,用于目标检测、分割和标题生成。它有以下几个特征:

    • 目标分割
    • 在语境中识别
    • 超像素物品分割
    • 33 万张图像(其中超过 20 万张是标注图像)
    • 150 万个目标实例
    • 80 个目标类别
    • 91 个物品分类
    • 每张图像有 5 个标题
    • 25 万张带有关键点的人像


    大小:约 25 GB(压缩后)

    数量:33 万张图像、80 个目标类别、每张图像 5 个标题、25 万张带有关键点的人像

    SOTA:《Mask R-CNN》


    参考阅读:

    学界 | Facebook 新论文提出通用目标分割框架 Mask R-CNN:更简单更灵活表现更好

    深度 | 用于图像分割的卷积神经网络:从 R-CNN 到 Mask R-CNN

    资源 | Mask R-CNN 神应用:像英剧《黑镜》一样屏蔽人像


    ImageNet

    链接:image-net.org/

    ImageNet 是根据 WordNet 层次来组织的图像数据集。WordNet 包含大约 10 万个短语,而 ImageNet 为每个短语提供平均约 1000 张描述图像。


    大小:约 150 GB

    数量:图像的总数约为 1,500,000;每一张图像都具备多个边界框和各自的类别标签。

    SOTA:《Aggregated Residual Transformations for Deep Neural Networks》(arxiv.org/pdf/1611.0543


    Open Images 数据集

    链接:github.com/openimages/d

    Open Images 是一个包含近 900 万个图像 URL 的数据集。这些图像使用包含数千个类别的图像级标签边界框进行了标注。该数据集的训练集包含 9,011,219 张图像,验证集包含 41,260 张图像,测试集包含 125,436 张图像。


    大小:500GB(压缩后)

    数量:9,011,219 张图像,带有超过 5000 个标签

    SOTA:Resnet 101 image classification model (trained on V2 data):


    VisualQA

    链接:visualqa.org/

    VQA 是一个包含图像开放式问题的数据集。这些问题的解答需要视觉和语言的理解。该数据集拥有下列有趣的特征:

    • 265,016 张图像(COCO 和抽象场景)
    • 每张图像至少包含 3 个问题(平均有 5.4 个问题)
    • 每个问题有 10 个正确答案
    • 每个问题有 3 个看似合理(却不太正确)的答案
    • 自动评估指标


    大小:25GB(压缩后)

    数量:265,016 张图像,每张图像至少 3 个问题,每个问题 10 个正确答案

    SOTA:《Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge》(arxiv.org/abs/1708.0271


    街景门牌号数据集(SVHN)

    链接:ufldl.stanford.edu/hous

    这是一个现实世界数据集,用于开发目标检测算法。它需要最少的数据预处理过程。它与 MNIST 数据集有些类似,但是有着更多的标注数据(超过 600,000 张图像)。这些数据是从谷歌街景中的房屋门牌号中收集而来的。


    大小:2.5GB

    数量:6,30,420 张图像,共 10 类

    SOTA:《Distributional Smoothing With Virtual Adversarial Training》(arxiv.org/pdf/1507.0067


    这篇论文中,日本京都大学提出了局部分布式平滑度(LDS),一个关于统计模型平滑度的新理念。它可被用作正则化从而提升模型分布的平滑度。该方法不仅在 MNIST 数据集上解决有监督和半监督学习任务时表现优异,而且在 SVHN 和 NORB 数据上,Test Error 分别取得了 24.63 和 9.88 的分值。以上证明了该方法在半监督学习任务上的表现明显优于当前最佳结果。


    CIFAR-10

    链接:cs.toronto.edu/~kriz/ci

    该数据集也用于图像分类。它由 10 个类别共计 60,000 张图像组成(每个类在上图中表示为一行)。该数据集共有 50,000 张训练集图像和 10,000 个测试集图像。数据集分为 6 个部分——5 个训练批和 1 个测试批。每批含有 10,000 张图像。


    大小:170MB

    数量:60,000 张图像,共 10 类

    SOTA:《ShakeDrop regularization》(openreview.net/pdf?


    Fashion-MNIST

    链接:github.com/zalandoresea

    Fashion-MNIST 包含 60,000 个训练集图像和 10,000 个测试集图像。它是一个类似 MNIST 的时尚产品数据库。开发人员认为 MNIST 的使用次数太多了,因此他们把这个数据集用作 MNIST 的直接替代品。每张图像都以灰度显示,并具备一个标签(10 个类别之一)。


    大小:30MB

    数量:70,000 张图像,共 10 类

    SOTA:《Random Erasing Data Augmentation》(arxiv.org/abs/1708.0489


    自然语言处理


    IMDB 电影评论数据集

    链接:ai.stanford.edu/~amaas/

    该数据集对于电影爱好者而言非常赞。它用于二元情感分类,目前所含数据超过该领域其他数据集。除了训练集评论样本和测试集评论样本之外,还有一些未标注数据可供使用。此外,该数据集还包括原始文本和预处理词袋格式。


    大小:80 MB

    数量:训练集和测试集各包含 25,000 个高度两极化的电影评论

    SOTA:《Learning Structured Text Representations》(arxiv.org/abs/1705.0920


    Twenty Newsgroups 数据集

    链接:https://archive.ics.uci.edu/ml/datasets/Twenty+Newsgroups

    顾名思义,该数据集涵盖新闻组相关信息,包含从 20 个不同新闻组获取的 20000 篇新闻组文档汇编(每个新闻组选取 1000 篇)。这些文章有着典型的特征,例如标题、导语。


    大小:20MB

    数量:来自 20 个新闻组的 20,000 篇报道

    SOTA:《Very Deep Convolutional Networks for Text Classification》(arxiv.org/abs/1606.0178


    Sentiment140

    链接:help.sentiment140.com/f

    Sentiment140 是一个用于情感分析的数据集。这个流行的数据集能让你完美地开启自然语言处理之旅。数据中的情绪已经被预先清空。最终的数据集具备以下六个特征:

    • 推文的情绪极性
    • 推文的 ID
    • 推文的日期
    • 查询
    • 推特的用户名
    • 推文的文本


    大小:80MB(压缩后)

    数量: 1,60,000 篇推文

    SOTA:《Assessing State-of-the-Art Sentiment Models on State-of-the-Art Sentiment Datasets》(aclweb.org/anthology/W1


    WordNet

    链接:wordnet.princeton.edu/

    上文介绍 ImageNet 数据集时提到,WordNet 是一个大型英语 synset 数据库。Synset 也就是同义词组,每组描述的概念不同。WordNet 的结构让它成为 NLP 中非常有用的工具。


    大小:10 MB

    数量:117,000 个同义词集,它们通过少量的「概念关系」与其他同义词集相互关联

    SOTA:《Wordnets: State of the Art and Perspectives》(aclanthology.info/pdf/R


    Yelp 数据集

    链接:yelp.com/dataset

    这是 Yelp 出于学习目的而发布的开放数据集。它包含数百万个用户评论、商业属性(businesses attribute)和来自多个大都市地区的超过 20 万张照片。该数据集是全球范围内非常常用的 NLP 挑战赛数据集。


    大小:2.66 GB JSON、2.9 GB SQL 和 7.5 GB 的照片(全部压缩后)

    数量:5,200,000 个评论、174,000 份商业属性、200,000 张照片和 11 个大都市地区

    SOTA:《Attentive Convolution》(arxiv.org/pdf/1710.0051


    Wikipedia Corpus

    链接:nlp.cs.nyu.edu/wikipedi

    该数据集是维基百科全文的集合,包含来自超过 400 万篇文章的将近 19 亿单词。你能逐单词、逐短语、逐段地对其进行检索,这使它成为强大的 NLP 数据集。


    大小:20 MB

    数量:4,400,000 篇文章,包含 19 亿单词

    SOTA:《Breaking The Softmax Bottelneck: A High-Rank RNN language Model》(arxiv.org/pdf/1711.0395


    Blog Authorship Corpus

    链接:u.cs.biu.ac.il/~koppel/

    该数据集包含从数千名博主那里收集到的博客文章,这些数据从 blogger.com 中收集而来。每篇博客都以一个单独的文件形式提供。每篇博客至少出现 200 个常用的英语单词。


    大小:300 MB

    数量:681,288 篇博文,共计超过 1.4 亿单词。

    SOTA:《Character-level and Multi-channel Convolutional Neural Networks for Large-scale Authorship Attribution》(arxiv.org/pdf/1609.0668


    欧洲语言机器翻译数据集

    链接:statmt.org/wmt18/index.


    该数据集包含四种欧洲语言的训练数据,旨在改进当前的翻译方法。你可以使用以下任意语言对:

    • 法语 - 英语
    • 西班牙语 - 英语
    • 德语 - 英语
    • 捷克语 - 英语


    大小: 约 15 GB

    数量:约 30,000,000 个句子及对应的译文

    SOTA:《Attention Is All You Need》


    参考阅读:

    学界 | 机器翻译新突破:谷歌实现完全基于 attention 的翻译架构

    资源 | 谷歌全 attention 机器翻译模型 Transformer 的 TensorFlow 实现


    音频/语音数据集


    Free Spoken Digit 数据集

    链接:github.com/Jakobovski/f

    这是本文又一个受 MNIST 数据集启发而创建的数据集!该数据集旨在解决识别音频样本中口述数字的任务。这是一个公开数据集,所以希望随着人们继续提供数据,它会不断发展。目前,它具备以下特点:

    • 3 种人声
    • 1500 段录音(每个人口述 0- 9 各 50 次)
    • 英语发音

    大小: 10 MB

    数量: 1500 个音频样本

    SOTA:《Raw Waveform-based Audio Classification Using Sample-level CNN Architectures》(arxiv.org/pdf/1712.0086


    Free Music Archive (FMA)

    链接:github.com/mdeff/fma

    FMA 是音乐分析数据集,由整首 HQ 音频、预计算的特征,以及音轨和用户级元数据组成。它是一个公开数据集,用于评估 MIR 中的多项任务。以下是该数据集包含的 csv 文件及其内容:

    • tracks.csv:记录每首歌每个音轨的元数据,例如 ID、歌名、演唱者、流派、标签和播放次数,共计 106,574 首歌。
    • genres.csv:记录所有 163 种流派的 ID 与名称及上层风格名(用于推断流派层次和上层流派)。
    • features.csv:记录用 librosa 提取的常见特征。
    • echonest.csv:由 Echonest(现在的 Spotify)为 13,129 首音轨的子集提供的音频功能。


    大小:约 1000 GB

    数量:约 100,000 个音轨

    SOTA:《Learning to Recognize Musical Genre from Audio》(arxiv.org/pdf/1803.0533


    Ballroom

    链接:mtg.upf.edu/ismir2004/c

    该数据集包含舞厅的舞曲音频文件。它以真实音频格式提供了许多舞蹈风格的一些特征片段。以下是该数据集的一些特点:

    • 实例总数:698
    • 单段时长:约 30 秒
    • 总时长:约 20940 秒


    大小:14 GB(压缩后)

    数量:约 700 个音频样本

    SOTA:《A Multi-Model Approach To Beat Tracking Considering Heterogeneous Music Styles》(pdfs.semanticscholar.org


    Million Song 数据集

    链接:labrosa.ee.columbia.edu

    Million Song 数据集包含一百万首当代流行音乐的音频特征和元数据,可免费获取。其目的是:

    • 鼓励研究商业规模的算法
    • 为评估研究提供参考数据集
    • 作为使用 API 创建大型数据集的捷径(例如 The Echo Nest API)
    • 帮助入门级研究人员在 MIR 领域展开工作

    数据集的核心是一百万首歌曲的特征分析和元数据。该数据集不包含任何音频,只包含导出要素。示例音频可通过哥伦比亚大学提供的代码(github.com/tb2332/MSong)从 7digital 等服务中获取。


    大小:280 GB

    数量:一百万首歌曲!

    SOTA:《Preliminary Study on a Recommender System for the Million Songs Dataset Challenge》(ke.tu-darmstadt.de/even


    LibriSpeech

    链接:openslr.org/12/

    该数据集是一个包含约 1000 小时英语语音的大型语料库。数据来源为 LibriVox 项目的音频书籍。该数据集已经得到了合理地分割和对齐。如果你还在寻找起始点,那么点击 kaldi-asr.org/downloads查看在该数据集上训练好的声学模型,点击 openslr.org/11/查看适合评估的语言模型。


    大小:约 60 GB

    数量:1000 小时的语音

    SOTA:《Letter-Based Speech Recognition with Gated ConvNets》(arxiv.org/abs/1712.0944


    VoxCeleb

    链接:robots.ox.ac.uk/~vgg/da

    VoxCeleb 是一个大型人声识别数据集。它包含来自 YouTube 视频的 1251 位名人的约 10 万段语音。数据基本上是性别平衡的(男性占 55%)。这些名人有不同的口音、职业和年龄。开发集和测试集之间没有重叠。对大明星所说的话进行分类并识别——这是一项有趣的工作。


    大小:150 MB

    数量:1251 位名人的 100,000 条语音

    SOTA:《VoxCeleb: a large-scale speaker identification dataset》(robots.ox.ac.uk/~vgg/pu

    为了帮助你练习,我们还提供了一些真实生活问题和数据集,供读者上手操作。这一部分,我们列举了 DataHack 平台上关于深度学习的问题。


    推特情感分析数据集

    链接:datahack.analyticsvidhya.com

    涉及种族主义和性别歧视的偏激言论已成为 Twitter 的难题,因此将这类推文与其它推文分开已十分重要。在这个实际问题中,我们提供的 Twitter 数据包含普通言论和偏激言论。作为数据科学家,你的任务是确定哪些推文是偏激型推文,哪些不是。


    大小: 3 MB

    数量: 31,962 篇推文


    印度演员年龄检测数据集

    链接:datahack.analyticsvidhya.com

    对于深度学习爱好者来说,这是一个令人着迷的挑战。该数据集包含数千名印度演员的图像,你的任务是确定他们的年龄。所有图像都由人工从视频帧中挑选和剪切而来,这导致规模、姿势、表情、亮度、年龄、分辨率、遮挡和妆容具有高度可变性。


    大小:48 MB(压缩后)

    数量:训练集中有 19,906 幅图像,测试集中有 6636 幅图像


    城市声音分类数据集

    链接:datahack.analyticsvidhya.com

    该数据集包含超过 8000 个来自 10 个类别的城市声音片段。这个实际问题旨在向你介绍常见分类场景中的音频处理。


    大小:训练集 - 3 GB(压缩后)、测试集 - 2 GB(压缩后)

    数量:来自 10 个类别的 8732 个标注城市声音片段(单个片段音频时长 <= 4s)


    原文链接:analyticsvidhya.com/blo

    展开全文
  • 在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样...

    图像的二值化的基本原理

    图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。
    --------------------- 
     

    展开全文
  • 图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 图像处理算法工程师

    2017-09-11 15:09:04
    整理了一下网上各个公司图像处理算法工程师的招聘要求:  图像处理算法工程师 职位要求 编程技能: 1、 具有较强的编程能力和良好的编程习惯, 精通c/c++编程,并熟练使用VS 或matlab开发环境; 2、 在计算机...
  • 表 1-1 列出了 MATLAB 和图像处理工具箱为描述像素值而支持的各种类。 表中的前 8 项是数值型的数据类,第 9 项称为字符类, 最后一项称为逻辑类。 uint8 和 logical 类广泛用于图像处理, 当以 TIFF 或 JPEG 图像...
  • 数字图像处理[M]. 电子工业出版社, 2014.第一章 绪论1 数字图像处理的主要内容(基本步骤)是什么?主要内容:图像获取、图像增强、图像复原、彩色图像处理、(小波变换)、形态学处理、分 割、识别、压缩编码。 ...
  • 图像处理与识别

    2017-03-23 09:45:57
    数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,...
  • 数字图像处理第九章数字图像处理---形态学图像处理(一)预备知识1.1 预备知识1.1.1 集合理论中的基本概念1.2 二值图像、集合及逻辑算子(二)膨胀和腐蚀2.1 膨胀2.2 结构元的分解2.3 strel函数2.4 腐蚀(三) 膨胀...
  • 图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理...
  • 图像处理中常见变换

    2006-05-09 17:13:00
    图像处理中常见变换 (1)KL变换 KL变换是遥感图像增强和信息提取中用得最多的线性变换,是对原波段图像进行波谱信息的线性投影变换,在尽可能不减少信息量的前提下,将原图像的高维多光谱空间的像元亮度值投影到新...
  • 选取图像局部区域 Mat 类提供了多种方便的方法来选择图像的局部区域。 使用这些方法时需要注意,这些方法并不进行内存的复制操作。如果将局部区域赋值给新的 Mat 对象,新对象与原始对象共用相同的数据区域,不新...
  • 一,前言卷积神经网络(Constitutional Neural Networks, CNN)是在多层神经网络的基础上发展起来的针对图像分类和识别而特别设计的一种深度学习方法。先回顾一下多层神经网络: 多层神经网络包括一个输入层和一个...
  • 原文...传统图像处理部分 图像处理基础知识 彩色图像、灰度图像、二...
  • 数字图像处理是近年来电子、通讯和计算机等领域的热门研究领域,其在科研、经济、军事、娱乐等等国计民生的各个领域都具有非常广阔的应用前景。数字图像处理处是一门交叉学科,涉及数学、计算机、电子、通讯、物理...
  • 数字图像处理中的形态学 (摘自某文献,因为贴图的数目有限制,后面的公式图片没有能够上,电脑重装后文档已经找不到了,囧) 一 引言  数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力...
1 2 3 4 5 ... 20
收藏数 43,552
精华内容 17,420