当前位置:首页 >> 电力/水利 >>

数字图像的特征提取


呵呵,看了半天,原来你只不过要求进行边缘检测就可以,然后再做阈值化而已,太简单了。 按照下面做即可: void RobelEdgeDetect(LPBYTE lpDibTemp, LPBYTE lpDibSave,int width,int height) { int i,j; float R; float RCos,RSin; for(j=1;j <height-1;j+

+) for(i=1;i <width-1;i++) { RCos=(float)(lpDibTemp[(j-1)*width+i+1]+2*lpDibTemp[j*width+i+1]+lpDibTemp[(j+1) *width+i+1] -lpDibTemp[(j-1)*width+i-1]-2*lpDibTemp[j*width+i-1]-lpDibTemp[(j+1)*width+i-1]) ; RSin=(float)(lpDibTemp[(j+1)*width+i-1]+2*lpDibTemp[(j+1)*width+i]+lpDibTemp[(j+ 1)*width+i+1] -lpDibTemp[(j-1)*width+i-1]-2*lpDibTemp[(j-1)*width+i]-lpDibTemp[(j-1)*width+i+1 ]); lpDibSave[j*width+i]=(unsigned char)(float)sqrt(RCos*RCos+RSin*RSin); for(i=0;i <width;i++)//边缘处理 { lpDibTemp[width*(height-1)+i]=lpDibTemp[width*(height-2)+i]; lpDibTemp[i]=lpDibTemp[256+i]; } for(j=0;j <height;j++) { lpDibTemp[width-1+width*j]=lpDibTemp[width*j+width-2]; lpDibTemp[width*j]=lpDibTemp[width*(j+1)]; } for(j=0;j <height;j++) for(i=0;i <width;i++) { lpDibSave[j*width+i]=255-lpDibSave[j*width+i];//反色 if(lpDibSave[j*width+i]> =128) //阈值化 lpDibSave[j*width+i]=255; else lpDibSave[j*width+i]=0; } } ok,一切完成!!其中,阈值化时,要跟你的图像具体情况而定,当然可以使用自适应阈值最 ! 好了。

对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP jluhs



级:

#11 楼 得分:0 回复于:2002-05-11 11:57:34 补充一句:在使用上面的程序时之前,应该 将彩色图像变换为灰度图像,将真彩色图转换为灰度图的公式如下: Y=0.299R+0.587G+0.114B 其中 R,G,B 为真彩色的三种色彩成分,Y 代表灰阶图的亮度。 对真彩色图像中的每一像素作分别这样的转换就可以。 相信这,你会做了!!! !! 数字图像的特征提取 边缘能勾划出目标物体轮廓,使观察者一目了然,图像识别中抽取的重要属性。通常可以分 为阶跃状和屋顶状两种。阶跃状边缘位于两边的像素灰度值有明显不同的地方;屋顶状边缘 位于灰度值从增加到减少的转折处。边缘上像素值的一阶导数较大 而阶导数在边缘处值为 零 , 边缘或线条是指图像中像素灰度发生急剧变化的区域边境。 存在于目标与背景、 目标与 目标、区域与区域、基元与基元之间。对图像识别和分析有着十分重要的作用。呈现零交叉。 y , 通常一幅图像可以描述成 f x. 灰度变化情况可以用图像的灰度分布的梯度来反映。通 常将图像 f x,y 梯度定义为 梯度的模为 导数算子具有突出灰度变化的作用, 通常把梯度的模就叫做图像的梯度。边缘的检测就可 借助空域微分算子通过卷积完成。 对图像运用导数算子, 灰度变化较大的点处算得的值较高, 因此可将这些导数值作为相应点的边境强度,通过设置门限的方法,提取边境点集。有了上 面的定义后,接下来将具体介绍几种较常用的也可以说是比较经典的边缘提取的算子。 2.1 Robert 算法 Robert 算子是用斜向上 4 个像素交叉差分来表示梯度的即 其中的平方根运算使得该处理类似于人类视觉系统中发生的过程。其中 f ( x , y ) f ( x +1 , y ) f ( x , y +1 和f ( x +1 , y +1 分别为 4 领域的坐标 , 且是具 有整数像素坐标的输入图像。 上式也可以简化为 或 所对应的模板如下图所示。 图像中的每一个点都用这 2 个模板做卷积运算得到边缘点。 2.2 Sobel 算法和 Prewitt 算法

对数字图像 f x, Sobel 算法是一种一阶微分算子。 每个像素考查其相邻点像素灰度的加 y 权差,其表示形式是 对图像水平边缘和垂直边缘的影响较大。 与 Sobel 算子十分相近,Prewitt 算子同样也是一个 3 3 模板算子。其实际上 Sobel 算子 正是对 Prewitt 算子的一种加权处理,模板如图所示: 2.3 Laplac 算法 对于阶跃状边缘的二阶导数在边缘处出现零点, Laplac 算子是典型的二阶微分算子。 边缘 点两边的二阶导数异号,即出现所谓的零交叉,因此,可以利用对图像的各个像素求二阶导 数 和 之和的方法寻找边境。即 可以用差分近似微分,对于数字图像。即可对图像的每个像素取 x 方向和 y 方向的二阶差 分之和来近似上式,因此可以表示成 一个与方向无关的各向同性(旋转轴对称)边缘检测算子。对 Laplac 算子有多种模板通常 被人们所使用的有以下两种模板(分别是 4 领域和 8 领域) 2 . 4 LOG 算子 所以为了减小噪声带来影响, 由于噪声点 ( 灰度与周围点相差很大的点 ) 对边缘检测有 一定的影响。于是就把高斯平滑滤波器和 Laplc 锐化滤波器结合起来,先平滑掉噪声,再进 行边沿检测,以取得更好的提取效果。 高斯形滤波器的空间响应函数为 : K′为常数 , 其中 . σ 为高斯空间常数 . 则拉普拉斯 — 高斯算子为: 令ω = , 该算子的中心活动区域大约为 . ω 称为高期函数的正瓣宽度 , 整个算子的 宽度取 3 ω , 或者 8.5 σ , 这种近似保证了高斯函数的 99.7% 区域在算子中 . 常用的 LOG 模板是 -2 -4 -4 -4 -2 -4 0 8 0 -4 -4 8 24 8 -4 -4 0 8 0 -4 -2 -4 -4 -4 -2 2.5 Krisch 算法 如图 7 所示。将 K0 K7 模板算子分别与图像中的 3 3 区域相乘,选择最大的一个,将该最 大值作为中央像素的边缘强度,可以用下式表示( x, Krisch 算子是由 K0 K7 共 8 个方 向的模板组成。y 像点的强度。 其中 说明中央像素( x, 若 最大。y 处有 I 方向的边缘通过,边缘方向如图 8 所示。 第三章 线特征提取算法的改进 但是由于一幅图像的像素值分布往往极不均衡, 第二章中已经介绍了几种较典型的边缘提 取的算子。而且边境出也不可能都泾渭分明,所以从不同水平上给提取增加了一定的难度, 再加上噪声的影响,就更难以提取出鲜明的线特征了常用的检测算子也不可能对所有的图像 都起到良好的作用,当然它有自己独到优势,但同时也在一定水平上存在着不足之处。 3.1 边缘检测算法的实验结果分析 用简单的 2 2 邻域交叉差分来近似梯度值运算。 通过检测可以看到所提取出的线特征非常的 细腻光滑, Robert 算子是非线性的一阶微分边缘检测算子。连续性也较好,定位也较精确。 但它对去噪声的作用很小,所以比较敏感,而且对边缘处灰度值轻微的变化无法给出提取, 所以对灰度直方图较靠中间分布的图像,通常会漏掉该提取的边缘,以至于丢失图像的一些

重要线特征信息。对于噪声小且边缘处较分明的图像用此算法较好。 相对于 Robert 算子它从加大边缘检测算子的模板动身,将模板从 2 2 扩大到 3 3 来计算 差分算子, Sobel 算子是 Prewitt 算子的基础上, 4- 邻域采用带权的方法计算差分。 而 对 能在检测边缘的同时对图像进行去噪声处理,但是缺点也显而易见,由于模板扩大,领域中 进行比较的像素增多,使得检测进去的边缘较宽。对灰度渐变低噪声的图像有较好的检测效 果 ,Sobel 算子和 Prewitt 算子也是著名的一阶微分边缘检测算子。 但是对于混合多复杂噪 声的图像 , 处置效果就不够理想了 常发生双像素的边缘,同时对噪声非但没法抑制反而会有双倍加强作用。可以看到作用到图 像后,提取进去的边缘非常的昏暗,线特征的丢失情况也十分的明显。因此用 Laplac 算子 进行检测时需要对图像进行平滑处置, 如应用较成功的 LOG 算子, 可以减少噪声对提取的影 响, 但平滑作用越显著 ,Laplac 算子是典型的二阶微分算子。 一个与方向无关的边缘点检测 算子。优势就在于它对细线和孤立点的检测效果较好。但边缘方向信息容易丢失。去除噪声 越好,图像的细节也损失越大 , 边缘精度也就越低。 3.2 改进算法的设计 3.2.1 对彩色图像的预处理 而灰度图像之所以呈现出灰白的颜色是因为它 RGB 三个值都是相同的上面的章节中已经提 到进行边缘提取的算法中, 由于黑色图像是由 R G B 即红、绿、蓝三原色调和而成的不同 的数值赋给它就会调制出不同的颜色。对每一像素中的三原色进行分别处置的所以当对黑色 图像进行边缘提取时,提取进去的线条包括有三种颜色的成分,所以看上去比较的杂乱,而 对灰度图像进行提取颜色是单一的而且通常呈现出亮白色, 那么人们就会清晰的识别出对象。 所以在本文中是将黑色图像进行了灰度处置后再对其线特征提取的 1 对彩色图像的灰度化 介绍如何对图像进行灰度化。 已有的灰度化算法有很多种, 首先。 如将每个像素的 R G B 值 加起来然后除以三,再将此值重新赋给 R G B 从而得到其灰度值;还有就是本文当中用到算 法。设用 imagedata 表示经转换的像素灰度值,那么可以将式子表示成: imagedata= int 0.3 R+0.59 G+0.11 B 这种表示方法中, 上式是利用了 YUV 颜色表示方法。 Y 分量的物理含义就是亮度, U 和 V 分量代表了色差信号, 因为 Y 代表了亮度, 所以 Y 分量包括了灰度图的所有信息, 只用 Y 分量就能完全能够表示出一幅灰度图来。 当同时考虑 U V 分量时, 就能够表示出彩色信息来。 这样,用同一种表示方法可以很方便的灰度和黑色图之间切换。与 RGB 间的对应关系是 图像就显示为灰度, 因为当 RGB 三个值都一样时。 所以代入到上式中就可求出 Y 值, U V 而 值正好为 0 再将每个像素计算出的 imagedata 重新的赋值给 R G B 三个参量,每一个像素都通过此式 进行灰度转换之后。以达到此三值的一致,从而形成灰度图。 2 灰度图像的灰度扩展 有些图像看上去整个色调都偏暗, 进行了灰度处理之后。对于这样的图像就需要增加物体 间的对比度,可以用视觉或通过灰度直方图来观察,如果使用灰度直方图则要观察图像的分 布较分散,还是主要集中在一块(左边、右边还是中间)如果是分布较均衡的说明图像自身 的灰度分布就较理想如图 10 下)如果集中一块的就要对其进行灰度扩展如图 10 上) 本文中使用了两种灰度扩展的方法: 线性灰度扩展 灰度直方图均衡 1 线性灰度扩展 介绍线性灰度扩展。实验最初,首先。为了方便,只用了一个很简易的想法,即首先给出一

个灰度门限值 T 当然此门限是可以动态调整的而它作用就是 0 255 之间划分一个界限,对 逾越此门限的像素值给予丢弃,并用红色填充;但若某一个像素的灰度值小于此门限值,就 将其扩展( 256/T 倍,这样整幅图像就被扩展到 0-255 从而使对比度得到加强。 假设一像素的灰度值为 graydata 经转换后的灰度值为 trgrai 则此式可写成: trgrai = graydata*256/T 因为并不知道在 256 个值中哪个才是最合适的门限值, 所以会增加实验的繁冗。 为了填补这 样的缺陷于是又采取了下面的方法,利用一算法使在运行顺序时就自动计算出一个较佳的门 限值, 以供参考。 以上的方法是为了实验之初的调试 , 通过动态输入一个门限值 , 使得扩 展进去的灰度图像能发生一个较好的提取效果。当然此方法会给调试带来很大的麻烦。 然后从 0 至 255 依次累加像素数, 首先统计灰度图像中 256 个灰度级所拥有的像素数。 当 叠加之和已经占了总像素的 90% 或超过了 90% 就将最后的灰度值作为此幅图像的门限值进 行灰度扩展,至于扩展的方法仍利用上面的算法。 2 灰度直方图均衡 由于直方图是对图像上每个像素级发生的次数的绘图, 直方图均衡顾名思义就是利用直方 图原理进行灰度均衡。从 0-255 灰度级水平地从左到右显示。灰度级发生的次数越多,直方 图中该位置的线越高,以此来直观的表示出图像的灰度分布情况。 此处也不例外。也同样是进行了各像素值的个数的统计, 那么。前面已经提到对于灰度图 像,像素值是 0-255 之间的一个,所以可以定义一个长度为 256 数组 histogram[256] 来 存放统计出的个数。当然统计是给灰度均衡做最初的准备的最重要的当然还是像素值转换的 算法。这里使用的算法是如下式: v 表示经变换后得到像素值,其中。 u 就表示变换前的像素值。 需注意的此时的 i 和公式中的 i 一致的因此就可这样理解, 通过此式变换后将变换的像 素值存入另一长度为 256 数组 transform[i] 中。 transform[i] 中 i 所对应的位置下存 的像素值就是值为 i 像素经变换后所得到像素值, 假如原灰度图像的某一像素的值为 25 即 那么它变换值就在 transform[25] 中。 所以可以对图像中的每一像素值进行变换后, 再取它 对应位置上的值输出,即可得经灰度直方图均衡后的图像。 3.2.2 边缘提取算法的改进 就可以进入本文的重点线特征的提取了上面的叙述我已经了解了一些较常用的边缘提取算 子, 对图像进行以上的灰度预处理后。同时也看到不同状况下存在缺乏,所以为了得到更 好的线特征的提取效果,此基础上进行了一些改进。下面就来具体介绍经改进的算法。 1 四方向的 Sobel 算法 这就需要在提取时注意各方向上的比拟, 首先来看对 Sobel 算法的改进。 大家知道图像中的 线条繁多且通常它走向的规律事先难以判定。 来获取线条最佳的走向以提取出准确的线条来。 Sobel 算法只用了垂直和水平两个方向来进行检测,获取它最大值。为了得到更加准确的结 果就将检测方向扩大为四个: 0 ° 、 45 ° 、 90 ° 、 135 ° 。

首先说下我开始对模型的理解,希望对你有帮助,PLAYER 就是走迷宫的一个图块,从后面程 序分析看,是一个 1x1 像素的矩形, 记住是 PLAYER 是一个矩形,不是点 PLAY 的属性 1:坐标(x,y) 。 2:大小,宽高(1,1)这个程序里默认设置,程序就默认他是 1,不可配置和更改。从后面

写死的代码可以看出 然后就是迷宫的墙(WALL)了,你可以想象成一条一条直线, WALL 类有几个属性: 1:宽度很小(这个一般在整个程序里都固定一个值,置成 1 好了,) 2:长度(通过换算,可以转换成一个范围值) 3:位置,也就是起点坐标,和长度一起可以确定一道墙的范围 4:方向。比如一个 WALL 的位置定了,在屏幕(20, 20)的位置, 宽度 1, 长度 10, 那这 个点是不是可以往 N 个方向划一道墙出来, 看看现在大多数的迷宫图,这个线直的居多,这个程序里也是这样的。 1)-------canMove 分析 来分析一下往右走一步,能不能走。 case RIGHT: // nextpos.x += 1; //为什么这里+1, 因为 PLAY 的坐标取的是矩形的左上顶点。矩形自己 占了一个像素 //往右能不能走,那就要看右边会不会挨着墙了。 direct = LEFT_WALL; break case LEFT: //往左能不能走,就看这个点是不是挨着墙就可以 direct = LEFT_WALL; break; 假设 PLAYER 坐标(20,20) 这个 PLAYER 的 4 个顶点就是, (20,20)(21,20) (20,21) (21,21) , , , , 对了,这里的坐标点是无大小的,就是一个抽象的点(无大小概念) 判断右走,能不能走,只要判断右边顶点有没有挨着墙, 所以 nextpos.x += 1; 接下来, 左走,右走都是 LEFT_WALL:只表示这个 WALL 是纵方向的。 那么宽度呢? 宽度 好办,我这样判断好了, 假设: 这个墙的宽度是 2(一般来说墙会比 PLAYER 苗条点,这里就不是了) ,墙的坐标是(19,10) , (墙的起点,矩形的话,取左上点) 。 墙的长度是 10,方向 LEFT_WALL 纵方向。 那只要有个点,横坐标 19≤ x ≤ 21, 纵坐标 10≤ y ≤ 20, 都表示这个点在墙上了。 这个前提是我们说墙的坐标,都取左上起点的坐标。 看看判断程序, if(mazeptr->findNode(CWall(nextpos, direct)) != NULL) return 1;//RETURN 1 就表示往 this->curdir 方向走,不能走,会撞墙。 找到,就表示撞墙了(哦,不,这只表示你挨着墙了,再挪那么一丁点你就撞啦) 。

我们可以猜测一下,CWall 这个类的对象放到节点里去,我们可以猜测,这个 find 方法应 该是根据范围来找的, 不然,每一个个像素点都有一个 CWall 类的话,这个数据库就庞大了。这个方法就可以这 么来实现,匹配一下 CWALL 链表中的一个节点, 先匹配方向,然后根据上面提到的方法来判断是否挨着墙。 总结下 int CPlayer::canMove() CPLayer 类只放了一个信息 this->curdir, 至于坐标什么的都是从 path 这个路径链表里取一个一个节点出来的。 返回值:1 表示从 path 取出的节点,按 player 当前保存的方向来走,走不通 0 -----------------------------------------------, 可以走通 -1 path 链表错误 上下方向移动的方向和左右移动是类似的,这里就不再说了。

2)-------int CPlayer::autoGo()分析 { point nextpos; Node<class CPathNode> *cur = NULL; int ret = 0, count = 0; path.reset(); cur = path.current(); if(cur == NULL) { errOut("迷宫无解"); return -1; } count = 0; /*往四个方向都试探下,看能不能走*/ for(;;) { count ++; if(count > 4) { errOut("迷宫配置错误"); return -1;//4 个方向都不行,退出方法---所以 for 循环之后的语句能执行到的话就表示 某个方向可以走了。 } cur->data.outdir = (cur->data.outdir + 3)%4; ////

curdir = cur->data.outdir; ret = canMove(); if(ret == 0) break; if(ret < 0) return -1; } nextpos = cur->data.pos; switch(curdir) ///// { case RIGHT: nextpos.x += 1; break; case DOWN: nextpos.y += 1; break; case LEFT: nextpos.x -= 1; break; case UP: nextpos.y -= 1; break; } steps ++; //这里的 indir,这样认为吧,表示这个节点要回到上一节点的话该怎么走。 //这里相等,表示我下一步能走的却是要回到上一步的地方,那这步对于走迷宫来说是浪费 时间, //删掉这个节点吧 if(path.next() != NULL&&cur->data.outdir == cur->data.indir) { fillCell(cur->data.pos, 8, cur->data.outdir); ret = path.deleteFront(NULL); if(ret < 0) { errOut("删除节点失败"); return -1; } return 0; } fillCell(cur->data.pos, 0, cur->data.outdir); if(nextpos == m_exit) {//m_exit 记录了迷宫出口点的坐标,下一步就到出口了,完成!

m_status = OVER; return 1; } fillCell(nextpos, 0, NODIR); //这里插入节点(仅仅是说不撞墙,不回头的走法) (this->curdir + 2)%4 这个应该是下 , 个节点的 indir 了, //dir4 个数字应该是这么安排的 上左下右(一种可能) 这样加 2%4 就必取反方向了。 , //(this->curdir +2)%4 下个节点的 outdir 就是说建议下个节点的方向和本次能走通的方 向相同,所谓一条路走到黑。 //其实从 cur->data.outdir = (cur->data.outdir + 3)%4; // curdir = cur->data.outdir; //从这边来看,这里又有什么玄机呢? 这样能更快地找到终点???? 请看最终分析 //当然尝试失败,他还是会自动改方向的。 ret = path.insertFront(CPathNode(nextpos, cur->data.index + 1, (this->curdir + 2)%4, (this->curdir +2)%4)); if(ret < 0) { errOut("插入路径链表失败"); return -1; } return 0; } 好了,我们注意到,其实上面的 for 循环,只要有一个方向能走通,他就把下个节点设设置 到那个方向了。 没走到却能走通的方向怎么办呢? 我们假设一直调用 CPlayer::autoGo(),结果如何呢? 答案是不是出来了。 3 最后再来总结下这个流程吧,path 开始给个起点,我们调用 CPlayer::autoGo(),发现有路 可走,就把下一个节点 添加到 path 里去,假设走到某点的时候,有 2 条路可走,我们选了一条路,就退出了,继续 调 CPlayer::autoGo()。 继续走,继续加节点,终于我们加了一大堆之后,发现到不了终点,而且到一个点之后,往 3 个方向都撞墙, 只有往回走一条路,那么就开始删节点,好马也得吃回头草啊。 // cur->data.outdir = (cur->data.outdir + 3)%4; // curdir = cur->data.outdir; 现在再来看看这个,哇靠,原来如此,这边是为了第二次回到这个节点的时候,走的路不一 样才这样弄的。~~~~啊门

额额,谢谢 LZ 让我过过瘾了,在学校的时候都在逃课打 DOTA,WOW, ,现在偶尔会有点兴趣学 习下,都是逼出来的啊


相关文章:
数字图像的特征提取
对真彩色图像中的每一像素作分别这样的转换就可以。 相信这,你会做了!!! 数字图像的特征提取 边缘能勾划出目标物体轮廓,使观察者一目了然,图像识别中抽取的重要...
数字图像处理课程设计之图像特征提取
数字图像处理课程设计之图像特征提取_工学_高等教育_教育专区。河 南 农 业 大 学 《数字图像处理》 题学专班学姓 目: 院: 业: 级: 号: 名: 图像特征...
数字图像处理实验报告-图像边缘检测和特征提取
纹理特征提取的 matlab 实现方法 二、实验平台计算机和 Matlab 软件环境 三、实验内容 1、图像边缘检测 2、图像纹理特征提取 四、实验原理 1、图像边缘检测图像理解...
基于数字图像处理技术的边缘特征提取
基于数字图像处理技术的边缘特征提取 摘要 在计算机图像处理中,边缘检测是一项基本且重要的问题。在本文中,我们讨论 数字图像处理用于边缘特征提取的方法。首先,利用...
图像边缘等特征提取 数字图像处理
图像边缘等特征提取 数字图像处理_计算机软件及应用_IT/计算机_专业资料。实验五 图像边缘等特征提取实验五 图像边缘等特征提取 1.实验目的图像的边缘是图像的最基本...
岩石数字图像特征提取的初步研究
岩石数字图像特征提取的初步研究 【摘要】 获取岩石特征是工程伪装勘察的重要内容。本文基于数字图像处理 技术提出了获取岩石宏观分布特征和细节纹理特征的方法,为开展...
图像特征提取论文
图像特征提取论文_IT/计算机_专业资料。基于 C++的图像特征提取 摘要 图像特征提取...图像处理 是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,...
数字语音和图像信号处理及特征提取
数字语音和图像信号处理及特征提取_生物学_自然科学_专业资料。数字语音和图像信号处理及特征提取综合实验专业综合实验指导书数字语音和图像信号处理及特征提取 山东建筑...
数字图像的点特征提取及Hough变换直线提取
图像特征提取不仅可以用于图像识别,还可以用 于图像配准、图像分割、图像拼接等各个方面。 本文研究并实现了数字图像的特征 提取及Hough变换直线提取。 在图像的...
媒体特征提取
媒体特征提取_工学_高等教育_教育专区。matlab数字图像处理媒体计算方法课程 实验总结报告 实验名称: 学姓日号: 名: 期: 媒体特征提取 2014-12-23 一、实验目的...
更多相关标签:
数字图像特征提取 | 数字图像处理特征提取 | 特征提取与图像处理 | 图像特征提取 | matlab图像特征提取 | 图像特征提取算法 | 图像特征提取方法 | 图像纹理特征提取 |