图像特征提取需要提取颜色、纹理、形状特征等,在网上搜索了一下相关的主题,可是都是理论方面的研究,由于小弟图像方面的知识比较肤浅,况且图像格式太多,不可能按着理论上所描述的算法那样去编码实现特征提取
想问问大家与图像特征提取相关的C/C++语言实现的类库有哪些?
好像有人也曾经做过,可否请教下?
有源码的发我参考下
联系QQ:50740512
70 个解决方案
#1
顶上去。。加十分!
#2
特征提取和图像格式没有关系.
#3
除了开源的其它都不开源,建议去开源社区找。
#4
你不用找这个了,我觉得你还是安心的看看特征提取的理论知识了再来问问题。不要急着去编程实现。
再者特征提取与图像格式没有关系。
再者特征提取与图像格式没有关系。
#5
我也在做,开始也很迷茫,给你一个mallat小波变换的算法,用于提取纹理特征的.小波算法的介绍你自己去找,网上介绍很多的.
/********************************************************************************
*函数描述: DWT_Once完成一次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次竖直变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为1层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_Once(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int Trans_W, //图像扫描线控制:横坐标
Trans_H, //图像扫描线控制:纵坐标
Trans_M, //图像矩阵的横坐标
Trans_N; //图像矩阵的纵坐标
short Trans_Coeff0; //小波变换系数
signed short Trans_Coeff1;
fRadius=(float)1.414; //变换滤波系数
//本模块完成变换系数的赋值采样
//行变换,第一次(layer=1时)时nHeight即为原始图像的高度值
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
if(layer == 1)
//layer=1时,nWidth_H为原始图像宽度值的一半
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
if (fRadius==2)
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
}
else
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128);
}
}
//若变换层数大于1,则仅采样低频的小波系数
if(layer > 1)
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W];
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1];
}
}
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
{
//奇偶数值和的一半
Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
//逻辑非操作后数值加1
Trans_Coeff1=~Trans_Coeff1+1;
//系数预测
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
}
//完成一个偶系数的边界处理
Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1;
//完成一个奇系数的边界处理
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
//提升,整数到整数的变换
for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
{
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
}
}//水平方向的变换结束
//竖直方向的变换开始,数据源未水平变换后的小波系数
for(Trans_M=0; Trans_M<nHeight; Trans_M++)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
spTransData0[Trans_M][Trans_N]*=(short)fRadius;
spTransData0[Trans_M][Trans_N+nWidth_H]/=(short)fRadius;
}
}
//行提升后的数据在spTransData0中,spTransData0中的数据自然奇偶有序
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
//列变换
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
Trans_H =Trans_M<<1;
//频带LL部分
spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N];
//频带HL部分
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N];
//频带LH部分
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N];
//频带HH部分
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N];
}
//第一次提升奇数坐标系数
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
//竖直方向的变换
Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1;
}
Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
//边界处理
spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1;
Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
//边界处理
spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0;
//第一次提升偶数坐标系数
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0;
}
}
//存放小波系数,LL频带的系数进行幅值增强处理,其它高频频带的系数则削弱其幅值
for(Trans_N=0; Trans_N<nWidth; Trans_N++)
{
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
spTransData1[Trans_M][Trans_N]*=(short)fRadius;
spTransData1[Trans_M+nHeight_H][Trans_N]/=(short)fRadius;
}
}
}
/********************************************************************************
*函数描述: DWT_Once完成一次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次竖直变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为1层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_Once(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int Trans_W, //图像扫描线控制:横坐标
Trans_H, //图像扫描线控制:纵坐标
Trans_M, //图像矩阵的横坐标
Trans_N; //图像矩阵的纵坐标
short Trans_Coeff0; //小波变换系数
signed short Trans_Coeff1;
fRadius=(float)1.414; //变换滤波系数
//本模块完成变换系数的赋值采样
//行变换,第一次(layer=1时)时nHeight即为原始图像的高度值
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
if(layer == 1)
//layer=1时,nWidth_H为原始图像宽度值的一半
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
if (fRadius==2)
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
}
else
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128);
}
}
//若变换层数大于1,则仅采样低频的小波系数
if(layer > 1)
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W];
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1];
}
}
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
{
//奇偶数值和的一半
Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
//逻辑非操作后数值加1
Trans_Coeff1=~Trans_Coeff1+1;
//系数预测
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
}
//完成一个偶系数的边界处理
Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1;
//完成一个奇系数的边界处理
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
//提升,整数到整数的变换
for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
{
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
}
}//水平方向的变换结束
//竖直方向的变换开始,数据源未水平变换后的小波系数
for(Trans_M=0; Trans_M<nHeight; Trans_M++)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
spTransData0[Trans_M][Trans_N]*=(short)fRadius;
spTransData0[Trans_M][Trans_N+nWidth_H]/=(short)fRadius;
}
}
//行提升后的数据在spTransData0中,spTransData0中的数据自然奇偶有序
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
//列变换
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
Trans_H =Trans_M<<1;
//频带LL部分
spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N];
//频带HL部分
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N];
//频带LH部分
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N];
//频带HH部分
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N];
}
//第一次提升奇数坐标系数
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
//竖直方向的变换
Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1;
}
Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
//边界处理
spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1;
Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
//边界处理
spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0;
//第一次提升偶数坐标系数
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0;
}
}
//存放小波系数,LL频带的系数进行幅值增强处理,其它高频频带的系数则削弱其幅值
for(Trans_N=0; Trans_N<nWidth; Trans_N++)
{
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
spTransData1[Trans_M][Trans_N]*=(short)fRadius;
spTransData1[Trans_M+nHeight_H][Trans_N]/=(short)fRadius;
}
}
}
#6
建议你看看 冈萨雷斯的书 网上有很多类似代码
#7
工具方面给你几个选择
dephi, JAI, GDI或者C++的第三方图像库Cximage,或者openCV,matlab
dephi, JAI, GDI或者C++的第三方图像库Cximage,或者openCV,matlab
#8
我也好想知道呀,有知道怎么做的告诉我吧,我的QQ34608234
#9
同样啊,我主要是做特征值图片数据库,然后进行匹配,语言是SQL
有高手的加我下啊 最好有源码
QQ:414296592
liusiyu4@126.com
有高手的加我下啊 最好有源码
QQ:414296592
liusiyu4@126.com
#10
不会很难的 就是图像学的灰度处理,阀值处理,二值处理等
#11
我建议你学习一下OPENCV,里面有现成的提取特征的方法,他里面已经包含了最经典的HU moments这些特征,足够你用了。我现在的一个项目使用的是Adaboost机器学习结合Rectangle 特征要更好原一点。
#12
关于书,提供这个: http://www.verycd.com/topics/2737127/
正好我这段时间都在看这个。^_^
正好我这段时间都在看这个。^_^
#13
guanzhu
#14
还是建议先看些理论基础知识(如6楼说的:冈萨雷斯的书),再去找代码,这样才能融会贯通,否则即使做了点效果出来,也不理解,稍微变换一下就又不会了.
#15
到我的BLOG去看看,有些东东可能对你很有启发
#16
这里应该注意一个图像处理最最起码的问题:一切问题都应视情况而定。。没有问题无关的特征提取方法,应充分利用问题的先验,具体到图像上就是充分利用待处理图像本身的特点,观察图像几何特征,纹理,噪声情况,角点等。。必要时甚至可自己针对图像设计一个专门的算法处理。。特征提取有简单有复杂,效果自然也大不相同。可它们之间没有本质差别。。充分利用了先验信息的才是好的。。。闭门造车,弄得再复杂也是徒劳。如果简单的提取就能取得较好的效果,一定不要搞得太复杂!
#17
opencv
matlab
#18
特征多了去了。
根据应用选取正确的特征才是王道。
如果你只是想混混,那随便把。
给你个可操作的步骤:局部梯度特征很流行。比如SIFT,SURF,HOG等等。你可以选取一个研究一下。做个毕设不成问题吧。
根据应用选取正确的特征才是王道。
如果你只是想混混,那随便把。
给你个可操作的步骤:局部梯度特征很流行。比如SIFT,SURF,HOG等等。你可以选取一个研究一下。做个毕设不成问题吧。
#19
你要看是什么特征了 要做图像处理 数学基础知识还是要看看的,先找一本冈萨雷斯的书扫一遍,然后动手做一个实验看看。具体的实现工具很多了
,如OpenCV 之类的,总之图像处理的资源网上很多,要慢慢的体会消化
,如OpenCV 之类的,总之图像处理的资源网上很多,要慢慢的体会消化
#20
可以试一下OPENCV
#21
OpenCV 功能比较强大,Cximage开源的.
常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
如果想要代码,去www.image2003.com找找.
常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
如果想要代码,去www.image2003.com找找.
#22
我也在学习哦
#23
mark
#24
可以参考一下我blog上的系统:
http://blog.csdn.net/TTYangF/archive/2008/11/05/3226416.aspx
http://blog.csdn.net/TTYangF/archive/2008/11/05/3226416.aspx
#25
用Opencv就好了 特征很多 而且c/c++直接就可调用
#26
首先要对图像进行预处理,如图像的增强及预处理,
然后使用相应的方法提取图像的特征
方法很多,而且源代码也可以在网上找到
然后使用相应的方法提取图像的特征
方法很多,而且源代码也可以在网上找到
#27
mark!!
#28
冈萨雷斯的书
#29
一米阳光说的很对,要基于具体的问题来说。我建议lz也不要考虑什么多复杂的算法,比如颜色特征,直接读取像素数据,纹理,做个简单的统计相关度分析或者直接跟某个纹理图做减法然后来个简单分析,形状,就用几个矩做作,先把你的程序跑起来,然后再慢慢改进。不然,看文献看得云里雾里也不是办法。
另外,opencv和matlab的image,statistic,nn几个toolbox都是不错的。
另外,opencv和matlab的image,statistic,nn几个toolbox都是不错的。
#30
Opencv很适合,一般的图像处理算法都有
#31
用opencv吧
什么颜色直方图、边缘算子、傅立叶变换都有
都可作为特征
什么颜色直方图、边缘算子、傅立叶变换都有
都可作为特征
#32
这个说得比较实在,其实所有图像处理的基础就是像素(R、G、B或者Y、M、C),一切的特征识别、纹理、噪声等或者别的最终的问题都是像素的问题
#33
推荐opencv。
#34
xuexiliao
#35
OpenCV
IBM QBIC
IBM QBIC
#36
学习
#37
最近在做特征提取,做的是几何特征的提取,要做好有点难度....
#38
大家都推荐openCV,莫非十分好用的吗
#39
我也是用的opencv,但是这位哥们说的很对!具体到应用时!那些库起到的作用并不是很大!
很多时候需要你自己对每个像素进行操作!所以关键还是自己对数字图像处理的理解有多深
#40
有没有用Java做的啊?
#41
用OPENGL会较容易点
#42
顶吧~~~~~~~~~~~~~
#43
先读读冈萨雷斯的 数字图像处理吧 别盲目的瞎搞! 看了以后你就知道你要做些什么了!
#44
有写出来的吗?谁有发给我一份啊,我QQ419984686
#45
openCV 可以读取很多格式的图像,很方便,免费,开源。
如果做人脸识别的话,haar矩形特征很好。
共生矩也是一种常用的特征....
如果做人脸识别的话,haar矩形特征很好。
共生矩也是一种常用的特征....
#46
http://download.csdn.net/source/2705297
建议你到上面这个地址去下载《数字图像处理》,书中对数字图像处理作了很详细的介绍,你应该能用得着!
建议你到上面这个地址去下载《数字图像处理》,书中对数字图像处理作了很详细的介绍,你应该能用得着!
#47
楼主具体想实现什么特征的提取呢?
#48
看看冈萨雷斯的书,在用OPENCV解决!
#49
都是用工具的啊,可以参考一下
#50
冈萨雷斯的书很好,先看看,相信你会有想法的。
#1
顶上去。。加十分!
#2
特征提取和图像格式没有关系.
#3
除了开源的其它都不开源,建议去开源社区找。
#4
你不用找这个了,我觉得你还是安心的看看特征提取的理论知识了再来问问题。不要急着去编程实现。
再者特征提取与图像格式没有关系。
再者特征提取与图像格式没有关系。
#5
我也在做,开始也很迷茫,给你一个mallat小波变换的算法,用于提取纹理特征的.小波算法的介绍你自己去找,网上介绍很多的.
/********************************************************************************
*函数描述: DWT_Once完成一次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次竖直变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为1层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_Once(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int Trans_W, //图像扫描线控制:横坐标
Trans_H, //图像扫描线控制:纵坐标
Trans_M, //图像矩阵的横坐标
Trans_N; //图像矩阵的纵坐标
short Trans_Coeff0; //小波变换系数
signed short Trans_Coeff1;
fRadius=(float)1.414; //变换滤波系数
//本模块完成变换系数的赋值采样
//行变换,第一次(layer=1时)时nHeight即为原始图像的高度值
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
if(layer == 1)
//layer=1时,nWidth_H为原始图像宽度值的一半
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
if (fRadius==2)
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
}
else
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128);
}
}
//若变换层数大于1,则仅采样低频的小波系数
if(layer > 1)
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W];
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1];
}
}
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
{
//奇偶数值和的一半
Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
//逻辑非操作后数值加1
Trans_Coeff1=~Trans_Coeff1+1;
//系数预测
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
}
//完成一个偶系数的边界处理
Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1;
//完成一个奇系数的边界处理
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
//提升,整数到整数的变换
for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
{
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
}
}//水平方向的变换结束
//竖直方向的变换开始,数据源未水平变换后的小波系数
for(Trans_M=0; Trans_M<nHeight; Trans_M++)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
spTransData0[Trans_M][Trans_N]*=(short)fRadius;
spTransData0[Trans_M][Trans_N+nWidth_H]/=(short)fRadius;
}
}
//行提升后的数据在spTransData0中,spTransData0中的数据自然奇偶有序
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
//列变换
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
Trans_H =Trans_M<<1;
//频带LL部分
spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N];
//频带HL部分
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N];
//频带LH部分
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N];
//频带HH部分
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N];
}
//第一次提升奇数坐标系数
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
//竖直方向的变换
Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1;
}
Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
//边界处理
spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1;
Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
//边界处理
spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0;
//第一次提升偶数坐标系数
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0;
}
}
//存放小波系数,LL频带的系数进行幅值增强处理,其它高频频带的系数则削弱其幅值
for(Trans_N=0; Trans_N<nWidth; Trans_N++)
{
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
spTransData1[Trans_M][Trans_N]*=(short)fRadius;
spTransData1[Trans_M+nHeight_H][Trans_N]/=(short)fRadius;
}
}
}
/********************************************************************************
*函数描述: DWT_Once完成一次图像的小波变换 *
*函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
* short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
* short **spTransData1:小波变换系数,存放一次竖直变换后的小波系数 *
* int nHeight :图像属性参数,数值为原始图像的高度值 *
* int nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
* int nWidth :图像属性参数,数值为原始图像的宽度值 *
* int nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
* int layer :小波变换的层数,数值为1层 *
* float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
********************************************************************************/
void CWvltTrans::DWT_Once(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
{
int Trans_W, //图像扫描线控制:横坐标
Trans_H, //图像扫描线控制:纵坐标
Trans_M, //图像矩阵的横坐标
Trans_N; //图像矩阵的纵坐标
short Trans_Coeff0; //小波变换系数
signed short Trans_Coeff1;
fRadius=(float)1.414; //变换滤波系数
//本模块完成变换系数的赋值采样
//行变换,第一次(layer=1时)时nHeight即为原始图像的高度值
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
if(layer == 1)
//layer=1时,nWidth_H为原始图像宽度值的一半
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
if (fRadius==2)
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
}
else
{
spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128);
spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128);
}
}
//若变换层数大于1,则仅采样低频的小波系数
if(layer > 1)
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
Trans_W=Trans_N<<1;
spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W];
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1];
}
}
for(Trans_H=0; Trans_H<nHeight; Trans_H++)
{
for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
{
//奇偶数值和的一半
Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
//逻辑非操作后数值加1
Trans_Coeff1=~Trans_Coeff1+1;
//系数预测
spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
}
//完成一个偶系数的边界处理
Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1;
//完成一个奇系数的边界处理
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
//提升,整数到整数的变换
for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
{
Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
}
}//水平方向的变换结束
//竖直方向的变换开始,数据源未水平变换后的小波系数
for(Trans_M=0; Trans_M<nHeight; Trans_M++)
{
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
spTransData0[Trans_M][Trans_N]*=(short)fRadius;
spTransData0[Trans_M][Trans_N+nWidth_H]/=(short)fRadius;
}
}
//行提升后的数据在spTransData0中,spTransData0中的数据自然奇偶有序
for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
{
//列变换
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
Trans_H =Trans_M<<1;
//频带LL部分
spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N];
//频带HL部分
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N];
//频带LH部分
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N];
//频带HH部分
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N];
}
//第一次提升奇数坐标系数
for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
{
//竖直方向的变换
Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1;
}
Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1;
Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
Trans_Coeff1=~Trans_Coeff1+1;
//边界处理
spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1;
Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
//边界处理
spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0;
//第一次提升偶数坐标系数
for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
{
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0;
Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0;
}
}
//存放小波系数,LL频带的系数进行幅值增强处理,其它高频频带的系数则削弱其幅值
for(Trans_N=0; Trans_N<nWidth; Trans_N++)
{
for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
{
spTransData1[Trans_M][Trans_N]*=(short)fRadius;
spTransData1[Trans_M+nHeight_H][Trans_N]/=(short)fRadius;
}
}
}
#6
建议你看看 冈萨雷斯的书 网上有很多类似代码
#7
工具方面给你几个选择
dephi, JAI, GDI或者C++的第三方图像库Cximage,或者openCV,matlab
dephi, JAI, GDI或者C++的第三方图像库Cximage,或者openCV,matlab
#8
我也好想知道呀,有知道怎么做的告诉我吧,我的QQ34608234
#9
同样啊,我主要是做特征值图片数据库,然后进行匹配,语言是SQL
有高手的加我下啊 最好有源码
QQ:414296592
liusiyu4@126.com
有高手的加我下啊 最好有源码
QQ:414296592
liusiyu4@126.com
#10
不会很难的 就是图像学的灰度处理,阀值处理,二值处理等
#11
我建议你学习一下OPENCV,里面有现成的提取特征的方法,他里面已经包含了最经典的HU moments这些特征,足够你用了。我现在的一个项目使用的是Adaboost机器学习结合Rectangle 特征要更好原一点。
#12
关于书,提供这个: http://www.verycd.com/topics/2737127/
正好我这段时间都在看这个。^_^
正好我这段时间都在看这个。^_^
#13
guanzhu
#14
还是建议先看些理论基础知识(如6楼说的:冈萨雷斯的书),再去找代码,这样才能融会贯通,否则即使做了点效果出来,也不理解,稍微变换一下就又不会了.
#15
到我的BLOG去看看,有些东东可能对你很有启发
#16
这里应该注意一个图像处理最最起码的问题:一切问题都应视情况而定。。没有问题无关的特征提取方法,应充分利用问题的先验,具体到图像上就是充分利用待处理图像本身的特点,观察图像几何特征,纹理,噪声情况,角点等。。必要时甚至可自己针对图像设计一个专门的算法处理。。特征提取有简单有复杂,效果自然也大不相同。可它们之间没有本质差别。。充分利用了先验信息的才是好的。。。闭门造车,弄得再复杂也是徒劳。如果简单的提取就能取得较好的效果,一定不要搞得太复杂!
#17
opencv
matlab
#18
特征多了去了。
根据应用选取正确的特征才是王道。
如果你只是想混混,那随便把。
给你个可操作的步骤:局部梯度特征很流行。比如SIFT,SURF,HOG等等。你可以选取一个研究一下。做个毕设不成问题吧。
根据应用选取正确的特征才是王道。
如果你只是想混混,那随便把。
给你个可操作的步骤:局部梯度特征很流行。比如SIFT,SURF,HOG等等。你可以选取一个研究一下。做个毕设不成问题吧。
#19
你要看是什么特征了 要做图像处理 数学基础知识还是要看看的,先找一本冈萨雷斯的书扫一遍,然后动手做一个实验看看。具体的实现工具很多了
,如OpenCV 之类的,总之图像处理的资源网上很多,要慢慢的体会消化
,如OpenCV 之类的,总之图像处理的资源网上很多,要慢慢的体会消化
#20
可以试一下OPENCV
#21
OpenCV 功能比较强大,Cximage开源的.
常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
如果想要代码,去www.image2003.com找找.
常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
如果想要代码,去www.image2003.com找找.
#22
我也在学习哦
#23
mark
#24
可以参考一下我blog上的系统:
http://blog.csdn.net/TTYangF/archive/2008/11/05/3226416.aspx
http://blog.csdn.net/TTYangF/archive/2008/11/05/3226416.aspx
#25
用Opencv就好了 特征很多 而且c/c++直接就可调用
#26
首先要对图像进行预处理,如图像的增强及预处理,
然后使用相应的方法提取图像的特征
方法很多,而且源代码也可以在网上找到
然后使用相应的方法提取图像的特征
方法很多,而且源代码也可以在网上找到
#27
mark!!
#28
冈萨雷斯的书
#29
一米阳光说的很对,要基于具体的问题来说。我建议lz也不要考虑什么多复杂的算法,比如颜色特征,直接读取像素数据,纹理,做个简单的统计相关度分析或者直接跟某个纹理图做减法然后来个简单分析,形状,就用几个矩做作,先把你的程序跑起来,然后再慢慢改进。不然,看文献看得云里雾里也不是办法。
另外,opencv和matlab的image,statistic,nn几个toolbox都是不错的。
另外,opencv和matlab的image,statistic,nn几个toolbox都是不错的。
#30
Opencv很适合,一般的图像处理算法都有
#31
用opencv吧
什么颜色直方图、边缘算子、傅立叶变换都有
都可作为特征
什么颜色直方图、边缘算子、傅立叶变换都有
都可作为特征
#32
这个说得比较实在,其实所有图像处理的基础就是像素(R、G、B或者Y、M、C),一切的特征识别、纹理、噪声等或者别的最终的问题都是像素的问题
#33
推荐opencv。
#34
xuexiliao
#35
OpenCV
IBM QBIC
IBM QBIC
#36
学习
#37
最近在做特征提取,做的是几何特征的提取,要做好有点难度....
#38
大家都推荐openCV,莫非十分好用的吗
#39
我也是用的opencv,但是这位哥们说的很对!具体到应用时!那些库起到的作用并不是很大!
很多时候需要你自己对每个像素进行操作!所以关键还是自己对数字图像处理的理解有多深
#40
有没有用Java做的啊?
#41
用OPENGL会较容易点
#42
顶吧~~~~~~~~~~~~~
#43
先读读冈萨雷斯的 数字图像处理吧 别盲目的瞎搞! 看了以后你就知道你要做些什么了!
#44
有写出来的吗?谁有发给我一份啊,我QQ419984686
#45
openCV 可以读取很多格式的图像,很方便,免费,开源。
如果做人脸识别的话,haar矩形特征很好。
共生矩也是一种常用的特征....
如果做人脸识别的话,haar矩形特征很好。
共生矩也是一种常用的特征....
#46
http://download.csdn.net/source/2705297
建议你到上面这个地址去下载《数字图像处理》,书中对数字图像处理作了很详细的介绍,你应该能用得着!
建议你到上面这个地址去下载《数字图像处理》,书中对数字图像处理作了很详细的介绍,你应该能用得着!
#47
楼主具体想实现什么特征的提取呢?
#48
看看冈萨雷斯的书,在用OPENCV解决!
#49
都是用工具的啊,可以参考一下
#50
冈萨雷斯的书很好,先看看,相信你会有想法的。