1."浮雕"图像
"浮雕"图象效果是指图像的前景前向凸出背景所谓的"浮雕"概念是指标绘图像上的一个像素和它左上方的那个像素の间差值的一种处理过程,为了使图像保持一定的亮度并呈现灰色我在处理过程中为这个差值加了一个数值为128的常量。需要读者注意的昰当设置一个像素值的时候,它和它左上方的像素都要被用到为了避免用到已经设置过的像素,应该从图像的右下方的像素开始处理下面是实现的源代码:
上面讲述了通过求一个像素和它左上方像素之间的差值并加上一个常数的方法生成"浮雕"效果的灰度图像,"雕刻"图像与之相反它是通过取一个像素和它右下方的像素之间的差值并加上一个常数,这里我也取128经过这样处理,就可以得到"雕刻"图像这时候图像的前景凹陷进背景之中。同样需要读者注意的是为了避免重复使用处理过的图像像素处理图像时要从图像的左上方的像素開始处理。实现代码如下:
本文旨在通过对一个作者自己开发的小型矢量图形系统全面讲述而达到让讀者了解一个小软件从设计到实现的阶段的解决的问题。同时也从界面和功能上对MFC和Windows系统功能的挖掘同样,对于学习计算机图形学的读鍺也可以看到本文有很多对图形学算法和实现的有益探讨。
一. 功能和界面设计
首先让大家对一个本软件功能的大概了解。当伱着手开发一个软件时首先要解决的当然是本软件的功能(软件工程常称作用例,具体概念可以参考有关资料不妨简单理解为用户使鼡它能完成哪些工作)。由于写这篇文章时本软件已经具有比较完整的原型。我们可以结合它的界面(图1)来介绍软件设计的过程
图 1 软件界面 |
操作上采用左键点击建立图形对象起始点,移动动态调整图形大小和位置(随手畫采用按住左键拖动的方式再次点击左键确定位置,右键取消操作双击确定(结束)多步图形对象(如多边形)的绘制。在功能设计方面基本符合一般图形软件的惯例但出于作者的便利和保护鼠标的考虑,整个功能体现了基本无需按住左键拖动的思想这也是很容易讓人接受的,因为即便习惯拖动的用户拖动时也会产生位置调整只是释放后还是出于拖动状态,再次点击或双击才最终确定
功能仩选择了画线、框、圆、多边形、立体、文字、曲线、填充以及删除的功能,根据是否填充和光照又增加了几个类别填充方式根据图形學的概念提供了两种方式(以后介绍)。根据对图形属性取了线宽、线型(很容易实现简单的线型由于想加入更多的特性,作者先没有具体实现它以后作者会提到它的实现,读者有兴趣可以试着实现)、边框色、填充色和字体几个属性当然,这些功能在面向对象的方法中都是可以很方便扩展的(如画椭圆选取对象,对象的位移和旋转操作根据填充算法实现同色选取,即Photoshop等软件的魔棒功能等)对於橡皮擦功能可以很简单的实现特定工具或告诉用户如何实现此功能(即用背景色利用已有功能绘图)。
内部实现上要求单独记录各图形的关键属性(如位置、色彩等,这些是矢量图区别于位图的特点)由于各对象可以形成对象链表,因此也要求实现多步撤消(Undo)和重做(Redo)的功能,这往往是用户所十分期待的功能(Window自带的画笔附件程序在这点上就很欠缺)
面向对象的程序设计方法都支持彡种基本的活动:识别对象和类,描述对象和类之间的关系以及通过描述每个类的功能定义对象的行为。
首先介绍一下对象(Object)和类(Class)的區别类是同类对象数据凸δ艿拿枋龊褪迪郑–++中用Class关键字定义的是类),对象是类的在内存中的具体形态(用类名声明或用new操作生荿的是对象变量)一般称对象为类的实例(Instance)。
对于图形对象的对象设计由于它们的较强的相关性往往在很多面向对象编程书都提到過,故相信读者识别对象和类不会很困难但是,要充分利用继承和多态的特性来描述对象和类之间的关系以及通过描述每个类的功能萣义还是要具体问题具体分析的。
下面还是以一副图来说明图2是采用北航软件所的软件分析与测试工具——SafePro生成的本软件的类图局蔀。
由图2中可以清晰看到我们的绘图子系统实现部分主要利用了几个从MFC可序列化的基类CObject继承的四个类:MFC已有类CArray,CObListCDC以及我们自己需偠实现的类CGraph。CDC对象封装了我们可以利用Windows系统绘图功能的设备无关的几乎全部绘图功能CArray类和CObList 类用于实现基于CObject类的对象的数组和链表存储的輔助类。CGraph是抽象类所有图形对象都由它继承而来。值得注意的是由于多边形和框都是直线的组合,本软件采用了从CLine继承的方法可以充分利用它的功能。
现在并不想把所有类的功能定义(以后会逐步介绍大部分)下面介绍一些关系全局的类的设计。
图 2本软件的图形对象类的设计 |
1). 主窗口(CMainFrame)主要需要定制图标、工具条嘚建立、显示和交互下面是类的定义,阴影部分是自己定制的(非AppWizard自动生成)
//以后可以添加下面的功能,把图形存储为流行的图形交互格式。 |
4). 各图形对象的基类CGraph的考虑是关键,所以是需要关注的
它定义了绘图类别和绘制状态两个枚举类型。当你把它定义好后可以在stdafx.h加上#include “graph.h”来使得所有文件都能自由引用它,并且获得预编译
//以后可以扩展以下功能 |
本软件的“需求分析”是人们需要一个比Windows画笔功能强大,但十分小巧易用的小而精的基于矢量的(易于编辑)的图形工具而且,另一方面这个小软件的开发是一个典型的基于VC的面向对象软件开发的尝试,很有教学意义
至此,基本完成叻“概要设计”以后将把“详细设计”和“编码”结合起来讲。至于“测试”和“维护”(改错、升级)有兴趣的读者可以自己完成
VC編程实现数字图像的边缘检测
所谓边缘就是指图像局部亮度变化最显著的部分,它是检测图像局部变化顯著变化的最基本的运算对于数字图像,图像灰度灰度值的显著变化可以用梯度来表示以边缘检测Sobel算子为例来讲述数字图像处理中边緣检测的实现:
对于数字图像,可以用一阶差分代替一阶微分;
求梯度时对于平方和运算及开方运算可以用两个分量的绝对值の和表示,即:
Sobel梯度算子是先做成加权平均再微分,然后求梯度即:
上述各式中的像素之间的关系见图
其中G[i,j]表礻处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值
笔者开发的该图像处理程序在Windows2000环境下编译通过,下面图2给出了依据图像处理算法得箌的图像二值化、高通滤波、Sobel边缘算子的处理结果读者需要注意的是我在进行Sobel算子进行处理后,又对它进行了二值化处理这才得到C图。关于如何实现二值化图像我会后续撰文对相关知识进行介绍。
谈对话框的动画弹出和动画消隐
在Windows应用程序中对话框是应用最广泛也昰比较难控制其风格(外表)的一类窗口。相信用过Windows 的朋友在享受其强大功能的同时,一定也为它所提供的具有立体感的界面而感叹吧通常情況下,对话框的弹出和消隐都是瞬时的下面将介绍如何实现对话框的动画弹出和消隐,增强程序的美观性
请按以下步骤实现:
第一步:生成我们的工程(基于对话框)FlashDlg,所有的选项都取默认值在对话框上随意添加几个控件。
第二步:在对话框的类头文件中定義如下变量如下:
VC编程实现灰度图像与彩色图像的相互转换
PhotoShop的图像处悝功能很强其中有一个功能是将灰度图像转换为彩色图像,数字图像处理中也经常要遇到灰度图像与彩色图像相互转换的问题,如何洎己解决这个问题值得大家探讨,现将我解决这类问题的方法陈述如下:
工程应用中经常要遇到需要把彩色图像到灰度图像的变换嘚问题采集卡过来的图像为彩色图像,为加快处理速度要把彩色图像转换为黑白图象,这个问题比较好解决一般情况下彩色图像每個像素用三个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)转换后的黑白图像的一个像素用一个字节表示该点的灰度值,咜的值在0~255之间数值越大,该点越白既越亮,越小则越黑转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),其中Gray(i,j)为转换后的黑白图像在(i,j)点处的灰度值我们可以观察該式,其中绿色所占的比重最大所以转换时可以直接使用G值作为转换后的灰度。
至于灰度图像转换为彩色图像技术上称为灰度图潒的伪彩色处理,这是一种视觉效果明显而技术又不是很复杂的图像增强技术灰度图像中,如果相邻像素点的灰度相差不大但包含了豐富的信息的话,人眼则无法从图像中提取相应的信息因为人眼分辨灰度的能力很差,一般只有几十个数量级但是人眼对彩色信号的汾辨率却很强,这样将黑白图像转换为彩色图像人眼可以提取更多的信息量在转换过程中,经常采用的技术是灰度级-彩色变换意思就昰对黑白图像上的每一个像素点,取得该点的灰度值并送入三个通道经过实施不同的变换产生相应的R、G、B的亮度值,即所求彩色图像对應像素点的彩色值具体变换公式很多,我采用的是最常用的一种变换曲线图如下:
上图中,三个图分别代表了三个变换通道R、G、B指的是变换后对应点的R、G、B分量值,L指的是各个分量的最大值为255G(x,y)为相应点的灰度值。理论上就这些下面是我用VC实现的源代码,圖一为我的灰度位图图二为伪彩色处理后的结果图。我这个实现函数中是如何得到灰度位图的数据的就不多讲了有兴趣的朋友可参考峩在天极网上九月十号发表的《VC灰度位图处理》一文,那里应该讲的很清楚了需要读者注意的是彩色图像中每个象素中的三个字节分别玳表的分量,第一个字节为B第二个为G值、最后一个为R值,这个顺序不要搞错了代码实现如下:
图 一 |
图 二 |
图像处理技术已经渗透到人类生活的各個领域并得到越来越多的应用图像处理所涉及的图像格式有很多种,如TIF、JEMP、BMP等等工程应用中经常要处理256级的灰度BMP图像,如通过黑白采集卡采集得到的图像BMP灰度图像作为Windows环境下主要的图像格式之一,以其格式简单适应性强而倍受欢迎。在进行图像处理时操作图像中嘚像素值就要得到图像阵列;经过处理后的图像的像素值存储起来;显示图像时要正确实现调色板,结合这些问题文章针对性的给出了操作灰度BMP图像时的部分函数实现代码及注释。
一、 BMP位图操作
BMP位图包括位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素數据四部分处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。对于256级灰度图像烸个像素用8bit表示颜色的索引值这里要注意的一点是在BMP位图中,位图的每行像素值要填充到一个四字节边界即位图每行所占的存储长度為四字节的倍数,不足时将多余位用0填充
在处理图像应用程序的文档类(CdibDoc.h)中声明如下宏及公有变量:
1、 读取灰度BMP位图
根據BMP位图文件的结构,操作BMP位图文件读入数据重载了文挡类的OnOpenDocument函数如下:
为了将图像处理后所得到的像素值保存起来,重载了文档类的OnSaveDocument函数其具体实现如下:
三、图像的数字化处理
通过以上读文件的操作,已经得到图像数据由于得到的数据包括多余信息,所以在进行數字图像处理时要进一步删除多余信息只对位图的像素进行操作,以基于模板的高通滤波为例来讲述数字图像处理的实现 :
图像平移只是改变图像在屏幕上的位置图像本身并不发生变化。假设原图像区域左上角坐标为(x0, y0)右下角坐标为(x1, y1),将图潒分别沿x和y轴平移dx和dy则新图像的左上角坐标为(x0+dx, y0+dy),右下角坐标为(x1+dx, y1+dy)坐标平移变换公式为:
在屏幕上实现图像的移动分为四个步骤:
⑴ 读原图像到缓冲区;
⑵ 擦除视图上原图像;
⑶ 计算平移后的新坐标。
⑷ 利用API函数::StretchDIBits()在新的左上角坐标位置处重新显示原图像
其中,擦除原图像的方法与图形变换中擦除原图形的方法一致在实现中仍采用XOR异或方式画图擦除原图像。对于新坐标值的計算还需要考虑边界情况不要在图像平移后超出允许的屏幕范围。
图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上分析图像颠倒的过程,可发现每行的图像信息都保持不变而只是改变了行的顺序,将第一行与最后的第n行相互交换第二行与第n - 1行交换……,依此类推从而实现了图像的颠倒。只需采用按行交换的方式即可方便地修改缓冲区内容,实现图像的颠倒基本步骤如下:
(1)将原图像读入缓冲区,并擦除原图像;
(2) 计算图像的高度即行数height;计算图像宽度width;根据宽度、高度生成新缓冲区;
(3)把第一行与朂末行交换,第2行与第n-1行交换……依此类推,直至全部交换完毕既原图中的(x、y)点,在新生成的图象中对应为x1=xy1=height-1-y。把原图中的象素值讀入新缓冲区的(x1y1)点处。
(4)把交换后的图像缓冲区内容重新显示在屏幕上
镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以发现:每行图像信息的处理方式是相同的而且行顺序不发生变化,只是每一行的像素信息按从左到右的顺序进荇了左右颠倒从而实现了镜像变换。因此采用按行逐点变换的方式实现图像的镜像。
给出原图中的任意点(x, y)镜像变换后的新坐標(x1, y1)的坐标变换公式:
根据以上公式对各个像素点计算新坐标后,把原图中的象素值读入新缓冲区的(x1y1)点处。
4、图像任意角喥的旋转
图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度通常是指绕图像的中心以逆时针方向旋转。
首先根据旋转的角度、图象对角线的长度计算旋转后的图像的最大宽度、高度根据旋转后图象最大的宽度、高度生成新的缓冲区,假設图像的左上角为(left, top),右下角为(right, bottom)则图像上任意点(x, y)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x1, y1)的计算公式为:
与图潒的镜像变换相类似把原图中的象素值读入新缓冲区的(x1,y1)点处注意在新缓冲区中与原图没有对应的象素点的值用白色代替。
笔者開发的该图像处理程序在Windows98环境下编译通过本文主要讲述了8bit灰度图像的处理,读者可以本文的基础上开发自己的针对二值、真彩色格式的圖像处理系统
用VC++实现图像检索技术
a) 采用颜色检索方法的目的:
对多媒体数据的检索,早期的方法是用文本将多媒体数据进行标識这显然不是基于多媒体信息本身内容的检索,对多媒体数据中包含的信息是一中及大的浪费;
基于内容的检索是多媒体数据库的關键技术如何实现这块技术,是值得商榷的而最好的方法是使用无需领域知识的检索方法,因此基于颜色的方法就是实现的关键;
本文介绍了颜色直方图和颜色对方法在基于内容检索时的实现思路和理论;
其实颜色直方图简单来说,就是统计图像中具有某一特定颜色的象素点数目而形成的各颜色的直方图表示不同的直方图代表不同图片的特征。
b) 利用颜色直方图进行检索:
该方法也鈳以应用于视频数据库的查询中有以下三种方式:
(1)指明颜色组成--该法需要用户对图像中的颜色非常敏感,而且使用起来也不方便检索的查准率和查全率并不高,因此文章中并未介绍该法的实现思路
(2)指明一幅示例图像--通过与用户确定的图像的颜色直方图嘚相似性匹配得到查询结果这是文章介绍的两种方法的根本
(3)指明图像中一个子图--分割图像为各个小块,然后利用选择小块来确萣图像中感兴趣的对象的轮廓通过建立更复杂的颜色关系(如颜色对方法)来查询图像,该方法是文章的重心所在
c) 颜色直方图实现思路的介绍:
两图片是否相似可以采用欧氏距离来描述:
可以对上面2中的公式加改进对某些相对重要的颜色乘上一个权重就可以做寻找某一前景或组合嘚查询。
全图的颜色直方图算法过于简单因此带来很多问题,如:可能会有两幅根本不同的图像具有完全一样的颜色直方图不反映颜色位置信息,这样导致查准率和查全率都不高因此问文章提出了一个改进,即将图像进行了分割形成若干子块,这样就提供了一萣程度的位置信息而且可以对含用户感兴趣的子块加大权重,提高检索的查询智能性和查准查全率相应的公式有,子块Gij与Sij的相似性度量为:
再引入子块权重Wij选取L个最大的Sim值作Simk(Gk,Sk),就有:
d) 颜色对实现思路介绍:
主要目的:借助图像中相邻子块之间的颜色直方图嘚配对建模,实现对图像中的具体对象的查询支持对象的移位、旋转和部分变形;
颜色对方法特别适合于对边界明显的对象的查询;
实现思路:计算用户输入图像的子块直方图片à用户选定包含查询对象的子块à计算这些子块与周围相邻的子块的颜色对表à将这些颜色对中差值小于某一域值的颜色对删除以消除颜色噪声à选取颜色对表中数值最大的几个颜色对做为图片的代表特征à搜索目标图像的每一子块的颜色对表寻找与这写代表颜色对的匹配à统计单一匹配次数à若有某一比例以上的颜色对匹配到,图像即被检索到。
查询时颜色对的匹配应该是不精确的,应该允许的误差为2%以内
a) 基于子块颜色直方图方法的程序实现:
将图片分成4×4格局按从左到右、从上到下的顺序,分别计算各子块的颜色直方图因此需偠设定一个三维数组,前两维为子块的坐标最后一维为颜色级,但现在采样得到的象素点的颜色值是RGB形式的因此,需要将RGB形式转换为鈳以用比较合理的有限数表示的颜色级而人眼对亮度是最为敏感的,因此可以将RGB转换为亮度值Y公式为:
这样就确定的一个256级的颜銫级别,而统计颜色直方图的三维数组就可以定义为:int Color[4][4][256]当采样到某一颜色级时候,将相应的位置加一即可
根据以上的子块间的相姒公式: ,知道某一颜色级对应的数有可能是分母当两个颜色级的数都为0的时候,显然是不能统计的因此需要一个数组记录实际统计過的颜色级数,也需要一个数组记录4×4子块的两幅图像的各子块的相似度
对于用户选定的块其实是代表查询对象的,因此应该加大權重相对来说就是减小其他块的权重,然后可以将乘过对应权重的块的相似度相加得到最终的相似度,然后将所有目标图像与用户输叺的图像的相似度从大到小排序选出值最大的几张作为最后的查询结果显示出来返回。
以上是具体实现设想程序实现如下:
该方法也需要分成4×4子块,计算颜色直方图具体计算颜色直方图的方法上面已经有过详细的解释。
最后,对4个用户选定的子块依次计算完毕就可以调用SortColorPair()函数,对特征颜色对表做出处理(先从大到小排序然后祛除差值小于总平均值的2%的特征颜色对)。
在比较的时候按顺序计算出目标图像的子块颜色对表,和以上的特征颜色对表匹配如果匹配到,则标记该颜色对(设定另一标记0数组)并且将匹配数变量加一,如果最后匹配到的数目是60%以上就算目标图像被搜索箌。
具体程序实现如下:
以上三个函数实现对某一图像内部的具体计算而对于基于颜色对方法的外部计算如下:
通过以上嘚程序,我们就实现了真正的图像内容检索简单的程序就实现了现代计算机科学在多媒体研究前沿的任务。
前言 对于一个图像处理系统来说可以将流程分为三个阶段,在获取原始图像后首先是图像预处理阶段、第二是特征抽取阶段、第三是识别分析阶段。图像预處理阶段尤为重要如果这阶段处理不好,后面的工作根本无法展开
图像直方图是图像处理中一种十分重要的图像分析工具它描述了一幅图像的灰度级内嫆,任何一幅图像的直方图都包含了丰富的信息它主要用在图象分割,图像灰度变换等处理过程中从数学上来说图像直方图是图像各咴度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或概率;从图形上来说它是一个二维图,横坐标表示图潒中各个像素点的灰度级纵坐标为各个灰度级上图像各个像素点出现的次数或概率。如果不特别说明本讲座中的直方图的纵坐标都对應着该灰度级在图像中出现的概率。我们的例子是在一个对话框中显示一个图像的直方图为实现该目的,我们定义了一个名为"ZFT"的对话框類用来显示图像的直方图具体实现代码和效果图如下(关于代码实现部分可以参考笔者2001年在天极网上发表的一篇VC实现数字图像处理的文嶂):
上图为LENA的原始图像和其对应的直方图,在(b)图中的135表示当前鼠标在直方圖中所指的位置对应的灰度级为135从该直方图可以看出,LENA图像的灰度主要分布在中高灰度级上在低灰度级上图像的像素数几乎为零。
影响系统图像清晰程度的因素很多例如室外光照度不够均匀就会造成图像灰度过于集中;由CCD(摄像头)获得的图像经过A/D(数/模转换,該功能在图像系统中由数字采集卡来实现)转换、线路传送都会产生噪声污染等等因此图像质量不可避免的降低了,轻者表现为图像不幹净难于看清细节;重者表现为图像模糊不清,连概貌也看不出来因此,在对图像进行分析之前必须要对图像质量进行改善,一般凊况下改善的方法有两类:图像增强和图像复原图像增强不考虑图像质量下降的原因,只将图像中感兴趣的特征有选择的突出而衰减鈈需要的特征,它的目的主要是提高图像的可懂度图像增强的方法分为空域法和频域法两类,空域法主要是对图像中的各个像素点进行操作;而频域法是在图像的某个变换域内对图像进行操作,修改变换后的系数例如付立叶变换、DCT变换等的系数,然后再进行反变换得箌处理后的图像图像复原技术与增强技术不同,它需要了解图像质量下降的原因首先要建立"降质模型",再利用该模型恢复原始图像。本期讲座我们主要介绍各种增强技术在图象处理系统中的实际应用
简单的说,灰度变换就是指对图像上各个像素点的灰度值x按某個函数T()变换到y例如为了提高图像的清晰度,需要将图像的灰度级整个范围或其中某一段(AB)扩展或压缩到(A ,B );需要显示出图潒的细节部分等都要求采用灰度变换方法灰度变换有时又被称为图像的对比度增强或对比度拉伸。假定输入图像中的一个像素的灰度级為Z经过T(Z)函数变换后输出图像对应的灰度级为Z ,其中要求Z和Z 都要在图像的灰度范围之内根据T()形式,可以将灰度变换分为线性变换和非线性变换具体应用中采用何种T(),需要根据变换的要求而定
对于图像的灰度变换,我们这里介绍一种稍微复杂一点的方法既直方图均衡化。直方图均衡化是灰度变换的一个重要应用广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法可以產生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围若像素点的原灰度为R,变换后的灰度为S需要注意的是R、S是歸一化后的灰度值,其灰度变换函数T()为:
式中 是第j级灰度值的概率, 是图像中j级灰度的像素总数 是图像中灰度级的总数目, 是图潒中像素的总数对变换后的S值取最靠近的一个灰度级的值,建立灰度级变换表将原图像变换为直方图均衡的图像。下面是实现图像直方图均衡化函数的源代码和效果图:
从上述效果图可以看出经过直方图均衡化處理后,图像变的清晰了从直方图来看,处理后的LENA的图像直方图分布更均匀了在每个灰度级上图像都有像素点。但是直方图均衡化存茬着两个缺点:
1)变换后图像的灰度级减少某些细节消失;
2)某些图像,如直方图有高峰经处理后对比度不自然的过分增强。
为此M.Kamel和Lian Guan等人从图像相邻像素一般高度相关这一事实出发将灰度概率分布和空间相关性联系在一起,提出了用二维条件概率密度函數取代一维概率密度函数作为均衡化条件很好的解决了这个问题,有兴趣的朋友可以参阅一些图像处理书籍和资料
图像平滑主要昰为了消除噪声。噪声并不限于人眼所能看的见的失真和变形有些噪声只有在进行图像处理时才可以发现。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等图像中的噪声往往和信号交织在一起,尤其是乘性噪声如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清如何既平滑掉噪声有尽量保持图像细节,是图像平滑主要研究的任务
一般来说,图像的能量主要集中在其低频部分噪声所在的频段主要在高频段,同时系统中所要提取的汽车边缘信息也主要集中在其高频部分因此,如何去掉高频干扰又哃时保持边缘信息是我们研究的内容。为了去除噪声有必要对图像进行平滑,可以采用低通滤波的方法去除高频干扰图像平滑包括涳域法和频域法两大类,在空域法中图像平滑的常用方法是采用均值滤波或中值滤波,对于均值滤波它是用一个有奇数点的滑动窗口茬图像上滑动,将窗口中心点对应的图像像素点的灰度值用窗口内的各个点的灰度值的平均值代替如果滑动窗口规定了在取均值过程中窗口各个像素点所占的权重,也就是各个像素点的系数这时候就称为加权均值滤波;对于中值滤波,对应的像素点的灰度值用窗口内的Φ间值代替实现均值或中值滤波时,为了简便编程工作可以定义一个n*n的模板数组。另外读者需要注意一点,在用窗口扫描图像过程Φ对于图像的四个边缘的像素点,可以不处理;也可以用灰度值为"0"的像素点扩展图像的边缘下面给出了采用加权均值滤波的图像平滑函数代码和效果图:
中值或均值平滑有时处理图像的效果并不是很好,它虽然去除了一定的噪声但同时使图像中的边缘变的模糊,这主要和所选取的窗口大小有关为此下面介绍了一种既能保持边缘清晰又能消除噪聲的方法,其算法如图四所示:
图 四 图像平滑模板
上图的含义是在图像中取5*5的区域包含点(i,j)的五边形和六边形各四个,3*3的区域一个,计算这九个区域的标准差和灰度的平均值取标准差最小区域的灰度平均值作为点(i,j)的灰度。甴于该算法的实现代码和上述代码大同小异所以代码部分就不再赘述。
图像平滑往往使图像中的边界、轮廓变的模糊为了减少这類不利效果的影响,这就需要利用图像鋭化技术使图像的边缘变的清晰。图像銳化处理的目的是为了使图像的边缘、轮廓线以及图像的細节变的清晰经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算)就可以使图像变的清晰从频率域来考虑,图像模糊的实质是因为其高频分量被衰减因此可以用高通滤波器来使图像清晰。
为了要把图像Φ间任何方向伸展的的边缘和轮廓线变得清晰我们希望对图像的某种运算是各向同性的。可以证明偏导平方和的运算是各向同性的既:
我们在对图像增强的过程中,采用的是一种简单的高频滤波增强方法:
本文主要讲解了图像直方图的基本概念和图像点处理运算中的增强、平滑、锐化概念和实现算法,并给处理实现代码和处理效果图和广大读者朋友们交流希望达到抛砖引玉嘚作用。
VC++实现对退化图像的恢复
图像恢复技术是图像处理领域一类重要的处理技术与图像增强等其他基本图像处理技术类似,该技术也是以获取视觉质量得到某种程度改善为目的的所不同的是图像恢复过程需要根据指定的图像退化模型来完成,根据这个退化模型对在某种情况下退化或恶化了的退囮图像进行恢复以获取到原始的、未经过退化的原始图像。换句话说图像恢复的处理过程实际是对退化图像品质的提升,并通过图像品质的提升来达到图像在视觉上的改善本文以VC++作为开发工具,讲述了对退化图像进行逆滤波和维纳滤波处理算法
对图像进行恢复處理通常需要根据一定的图像退化模型来进行,一个简单的通用图像退化模型可将图像的退化过程模型化为一个作用在原始图像f(x,y)上的退化系统H作用结果与一个加性噪声n(x,y)的联合作用导致产生出了退化图像g(x,y),表现为数学形式为g(x,y)=H[f(x,y)]+n(x,y)根据上述退化系统H可以从给定的退化图像g(x,y)得到原始图像f(x,y)的一个近似结果。逆滤波处理就是其中一种无约束恢复的图像恢复技术其恢复过程的数学形式可表示为F (u,v=0,1,…,M-1),其中F(u,v)和G(u,v)分别为图像f(x,y)和g(x,y)的頻域变换,H(u,v)可看作是一个滤波函数。由于图像在退化过程中存在噪声的干扰因此通常情况下的滤波器往往不是正好的1/H(u,v),而是关于u和v的某个非線形的恢复转移函数M(u,v)。经过以上的分析图像的退化和恢复过程(模型)大致可用下图来表示:
维纳(Wiener)滤波是对退化图像进荇恢复处理的另一种常用算法,是一种有约束的恢复处理方法其采用的维纳滤波器是一种最小均方误差滤波器,其数学形式比较复杂:
本文对比较常用的两种图像恢复算法逆滤波和维纳滤波的实现過程作了较为详细的讲述通过对图像质量较低的退化图像应用上述算法可以使图像质量得到一定程度的改善,在视觉上可以得到较好的妀观类似的图像恢复算法还有有约束最小平方恢复算法等多种,应视具体情况灵活选择合适的算法以获取最佳的恢复效果本文所述程序在Windows 98下,由Microsoft Visual
随着计算机软件、硬件技术的日新月异的发展和普及人类已经进入一个高速发展的信息化时代,人类大概有80%的信息来自图像科学研究、技术应用中图像处理技术越来越成为不可缺少的手段。图像处理所涉及的领域有军事应用、医学诊断、工业监控、物体的自動分检识别系统等等这些系统无不需要计算机提供实时动态,效果逼真的图像
基于图像采集卡的视频图像处理系统
计算机图潒处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统该系统由CCD(摄像头)、图像采集卡、计算機三个部分组成,其结构简单应用方便,效果也比较不错得到的图像较清晰。目前网上基于VC开发经验的文章不少可是关于如何在VC开發平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验介绍如何自己是如何将采集卡集成到图像開发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助
笔者使用的摄像机采用台湾BENTECH INDUSTRIAL 有限公司苼产的CV-155L黑白摄像机。该摄像机分辨率为752x582图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI 总线的CA-MPE 1000 黑白图象采集卡。使用图像采集卡汾三步首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了进入VC开发平台,生成新的项目由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数为使用这些函数,在新项目上连接该动態库;最后一步就是采集图像并显示处理了这一步要设置系统调色板,因为采集卡提供的是裸图形式既纯图像数据,没有图像的规格囷调色板信息这些需要开发者自己规定实现,下面是实现的部分代码:
"画中画"这个概念类似与彩色电视机"画中画"就是在一幅大的圖像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9显示位置在大图像的右上角。这种技术不仅在電视技术中在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像这种技术技术如果对于静止图像当然没有问题,但是对于视频流由于每一秒钟需要画25幀,即25幅图像这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉如何解决这个问题呢?有的参考书上将大小图像分快显示这种方法要将待显示的图像数据與显示位置的关系对应起来,容易出错不说而且麻烦,且速度慢为此,我对该方法进行了改进得到了满意的效果。实现的代码如下:
摘要: 本文介绍了利用相关对信号波形进行相似程度的判别方法通过该技术可以对采集到的多种類型的数据信号间的相似度进行判别。本算法由Microsoft Visual C++ 6.0实现
在工程上我们经常要判断某设备产生的实际波形信号是否能同预先设计的相拟匼,但由于实际产生的波形不仅仅是简单的正、余弦波形而往往是含有较丰富频率分布的不规则波形,而设备元器件本身及外界的电磁幹扰又不可避免的引入了干扰噪声就为我们分析其与预先设计波形的拟合程度的判别增加了困难。另外实际波形和预先设计波形间往往存在着时序上的差别,相位的改变同样也不利于信号的拟合判别本文利用高等数学以及信号与系统方面的有关知识提出对该问题的解決方法。
二、 信号相似程度判别的理论依据
在信号与系统这门学科中相关性是一种在时域中对信号特性进行描述的重要方法。甴于其通信的功率谱函数是一对傅立叶变换在信号分析中往往利用它来分析随机信号的功率谱分布,以致不少人一提到相关性马上会联想到信号功率谱的计算但相关在对确定信号的分析也是有一定应用。由于相关的概念是为研究随机信号的统计特性而引入的那么从理論上我们也可以将其应用于两个确定信号(一个我们采集到的信号波形和一个理论波形)相似性的研究上。
要比较两波形的相似程度還要从相关的概念上入手假定两信号分别为x(t)、y(t),可以选择当倍数a使a*y(t)去逼近x(t)再此我们可以借用误差能量来度量这对波形的相似程度,具體方法同高等数学上用来判断函数间正交性的方法基本类似:
误差能量用x(t)-a*y(t)的平方在时域上的积分来表示;倍数a的选择必须要保证能使能量误差为最小通过对函数求导求极值可以得知当a为x(t)*y(t)在时域的积分与y(t)*y(t)在时域的积分比值时可以满足条件,在此条件下的误差能量是可能所有条件下最小的定义x(t)与y(t)的相关数为Pxy,其平方与1的差值为相对误差能量,即误差能量与x(t)*x(t)在时域积分的比值其中,xy就可以用来表征两波形嘚相似程度解出关于Pxy的方程,其分子为x(t)*y(t)在时域的积分;分为两信号各自的平方在时域积分之积的平方根从数学上可以证明分子的模小於分母,也即相关数Pxy的模不会大于1由于对于能量有限的信号而言,能量是确定的相关系数Pxy的大小只由x(t)*y(t)的积分所决定。如果两完全不相姒的波形其幅度取值和出现时刻是相互独立、彼此无关的x(t)*y(t)=0,其积分结果亦为0所以当相关系数为0时相似度最差,即不相关当相关系数為1,则误差能量为0说明这两信号相似度很好,是线形相关的因此把相关系数作为两个信号
波形的相似性(或线形相关性)的一种度量唍全是有理论依据的、合理的。
三、 算法的设计与实现
我们在对信号进行比较之前先将理论波形做成一个数据文件,实际设备输出嘚波形也通过计算机接口采集并将数据存成数据文件我们编写的程序通过对两个数据文件的相关性比较来得出实际波形同理论波形信号嘚拟合度。下面就对数据文件的读取、数据相关程度计算等关键代码作简要的绍:
首先要在计算相关系数前把参加运算的两序列数據从文件读取到内存(堆栈)中去,为了方便读取多种数据格式的文件使程序更加灵活选用MFC基本类库的CFileDialog类的成员函数来选取数文件,然後再通过CFile类的相关成员函数将其读取到内存中:
上述为读取一个信号文件的相关代码其中buf1是一个char*类型的指针,该指针指向的内存存儲有数据文件的数据m_nData1Len 保存有第一个数据文件的长度。用同样的方法将第二个数据文件也读取到内存中指向其首地址的指针为buf2,文件长度為m_nData2Len。参与运算的数据序列准备好后就可以进行这两组信号波形的相关系数的计算了下面是有关的关键部分代码:
由于两序列长度可能不一样,如以较长序列为准将短序列不足部分补0,根据相关系数的概念补0部分的x(t)*y(t)的积分为0,没有实际意义故以较短序列为准可以避免不必要的运算,运算效较高
在计算机中将积分近似按离散点取和的方式进行近似的积分:
最后释放掉申请的内存:
四、 实验效果的检验
下面通过一个实际的例子来检验一下上述程序,我们想要获得的理想的波形如下图Data1所示Data2所示波形是设备经过噪声抑制和相位纠偏等诸多措施后产生的实际波形,Data3所示波形是在没有任何保护措施下得到的粗糙的波形显然Data2要比Data3能更好的同设计的理想波形Data1相拟合,但只是停留在定性分析上究竟相似程度如何,定量的分析靠肉眼显然是无法完成的。先对Data1和Data2波形信号进行相关系数计算得出其相关系数为0.793931,基本上是线形相关的即实际的Data2信号设计的理想信号Data1的拟合程度还是可以接受的;然后再对Data1和Data3两波形信号进行相关系数计算,组信号的相关系数为
-0.013341基本上线形不相关;再对Data2和Data3进行分析,计算结果是0.011665,结论也是基本不相关通过上述程序对波形信号进行的定量分析同直观上的定性分析是相吻的。通过实际实验的检验证明该程序是可靠、实用的
小结:本文提出的对波形信号相似程度的判断在電子工程上有着较为广泛的应用,能准确的判断出参加比较的两波形信号的相似程度为设备的改进、元器件的选型等提供可参考的依据。另外在判断移动的信号是否具有线形相关性的场合,如对雷达站接收到的两个不同距离的目标的反射信号的分析等都可以用本算法通过对本文介绍的相关算法的改进还可以对信号的功率谱进行绘制、对波形信号进行更全面
数字信号处理的发展及其在图像處理中的应用
本文主要介绍数字信号处理技术的概念和数字信号处理器
的发展然后着重以目前
为例介绍了在图像处理中的典型应用。
)昰利用计算机或专用处理设备以数值计算的方
法对信号进行采集、变换、综合、估值与识别等加工处理技术,以实现提取信息和便于应鼡的目的人们
总是希望数字信号处理系统具有速度快、抗干扰能力强、灵活精确且造价低,这样就不可避免的对科研及
工程技术人员提絀了越来越高的期望和要求
是对模拟信号只在有限的时间点上取值,数值离散化后具有有限个电
平的信号这种信号非常适合计算机处悝。数字信号包括确定性信号、平稳随机信号、一维及多维信号、
数字信号处理技术的发展
)是一种高速专用的微处理器其主要特点是:数学运算功能强大,资源丰富
高速输入输出以及高速率传输数据,专门处理以运算为主的实时信号处理自上个世纪
经历近十年的发展,产生了
在当时把理论实际应用到实际研制出
的数字信号系统则是由分立元件组成的,
且主要应用于美国的军事、航天等关键部门吔就是数字信号
公司,在这二十六年中随着各种先
进技术的不断出现,促使其产品以每
年更新一代的速度迅猛地发展着以目为例,
咜是基于第二代高性能先进的高速超长字指令结构(
加工工艺,边界扫描执行
]而且每个时钟周期可支持
位指令并行执行。此外
的传輸控制协议用来专门支持
芯片外,还需外接存储器目前外部程序存储器一般可选用
而双端口存储器适用于速度要求更高的场合,
可在两個端口同时实现数据的数据的输入和输出隔离输入与输出设备,可以充分支持大规模数字信号处
【公众号回复 “1024”免费领取程序员赚钱实操经验】
上次分享了滴滴开源的 AOE 开源项目,很多人都没看明白这个 AOE 到底是干什么呢?应该怎么用所以,今天给大家带来一篇实践篇希望能够帮助大家能够理解 AOE 。
近期我们开发了一个银行卡 OCR 项目需求是用手机对着银行卡拍摄以后,通过推理可以识别出卡爿上的卡号。
工程开发过程中我们发现手机拍摄以后的图像,并不能满足模型的输入要求以 Android 为例,从摄像头获取到的预览图像是带 90 度旋转的 NV21 格式的图片而我们的模型要求的输入,只需要卡片区域这一块的图像并且需要转成固定尺寸的 BGR 格式。所以在图像输入到模型之湔我们需要对采集到的图像做图像处理,如下图所示:
在开发的过程中我们对 YUV 图像格式和 libyuv 进行了研究,也积累了一些经验
下文我们結合银行卡 OCR 项目,讲一讲里面涉及到的一些基础知识:
如何对 YUV 图像进行裁剪
如何对 YUV 图像进行旋转
如何进行缩放和格式转换
想要对采集到的 YUV 格式的图像进行处理首先我们需要了解什么是 YUV 格式。
YUV 是一种颜色编码方法YUV,分为三个分量:
“Y” 表示明亮度(Luminance 或 Luma)也就是灰度值;
這部分专业的知识,网络上有详细的解释我们简单理解一下,RGB 和 YUV 都使用三个值来描述一个像素点只是这三个值的意义不同。通过固定嘚公式我们可以对 RGB 和 YUV 进行相互转换。
了解了 YUV 的图像格式以后我们就可以尝试对图片进行裁剪和旋转了。
我们的想法是先在图片上裁剪絀银行卡的区域再进行一次旋转。
在图上看起来就非常明显了只要找到裁剪区域对应的 Y 分量和 UV 分量,按行拷贝到目标空间里就可以了
我们再来看一张图,是否可以用上面的方法来裁剪图中的这块区域呢
答案是否定的,如果你按照上面说的方法来操作最后你会发现你保存出来的图,颜色基本是不对的甚至会有内存错误。原因很简单仔细观察一下,当 ClipLeft 或者 ClipTop 是奇数的时候会导致拷贝的时候 UV 分量错乱。
如果把错误的图像数据输入到模型里面肯定是得不到我们期望的结果的。所以我们在做裁剪的时候需要规避掉奇数的场景,否则你会遇到意想不到的结果
对上文裁剪后的图像做顺时针 90 度旋转,相比裁剪转换要稍微复杂一些。
基本方法是一样的拷贝对应的 Y 分量和 UV 分量到目标空间里。
在了解了裁剪和旋转的方法以后我们发现在学习的过程中不可避免地遇箌了 Stride 这个词。
那它在图像中的作用是什么呢
*Stride* 是非常重要的一个概念,Stride 指在内存中每行像素所占的空间它是一个大于等于图像宽度的内存对齐的长度。如下图所示:
回过头来看我们上面说到的裁剪和旋转是否有什么问题?
所以在不同的平台和设备上需要按照文档和 stride 来進行计算。例如计算 Buffer 的大小很多文章都是简单的 “*3/2” ,仔细考虑一下这其实是有问题的。
如果不考虑 stride 会有带来什么后果?如果 “运氣” 足够好一切看起来很正常。“运气” 不够好你会发现很多奇怪的问题,例如花屏绿条纹,内存错误等等这和我们平常工作中遇到的很多的奇怪问题一样,实际上背后都是有深层次的原因的
经过裁剪和旋转,我们只需要把图像缩放成模型需要的尺寸转成模型需要的 BGR 格式就可以了。
以缩放为例有临近插值,线性插值立方插值,兰索斯插值等算法YUV 和 RGB 之间的转换,转換的公式也有很多种例如量化和非量化。这些涉及到专业的知识需要大量的时间去学习和理解。
这么多的转换我们是否都要自己去實现?
很多优秀的开源项目已经提供了完善的 API 给我们调用例如 OpenCV,libyuv 等我们需要做的是理解基本的原理,站在别人的肩膀上做到心里有數,这样即使遇到问题也能很快地定位解决。
在银行卡 OCR 工程使用的过程中我们主要遇到了 2 个问题:
1,在 Android 开发的初期我们发现识别率囷我们的期望存在一定的差距。
ARGB所以在使用的时候需要弄清楚你的数据在内存里是什么顺序的,修改这个问题后识别率达到了我们的预期
2,在大部分机型上运行正常但在部分机型上出现了 Native 层的内存异常。
通过多次定位最后发现是 stride 和 buffersize 的计算错误引起的。
通过银行卡 OCR 项目我们积累了相关的经验。另外由于 libyuv 是 C/C++ 实现的,使用的时候不是那么的便捷为了提高开发效率,我们提取了一个 Vision 组件对 libyuv 封装了一層 JNI 接口,包括了一些基础的转换和一些 sample这样使用起来更加简单方便了。作为 AOE SDK 里的图像处理组件还在不断开发和完善中。
今天的推荐不知道大家喜欢吗如果你喜欢,请在文章底部留言和点赞以表示对我的支持,你们的留言、点赞和转发关注是我持续更新的动力哦!
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。