03 2013 档案
摘要:好老的技术了,91年的,不过我发现网上介绍的还真不多。steerable filters方向可调滤波器,通过在不同方向上产生模板,然后用不同方向上的模板去卷积图像,就能得到图像的边缘。产生的模板分不同阶,不同阶有不同的系数,系数分幅度系数和方向系数,最后的模板是不同方向上的系数相乘再相加。下面是一些求系数的公式,都是在mit的一个教程上找到的,并且我也用了其中的三阶系数来编程。二阶系数:三阶系数:四阶系数:五阶系数:最终需要的模板G=Ha*ka+Hb*kb+Hc*kc等等就看用几阶了。matlab代码:clear all;close all;clc;sigma=0.5;h=floor(2*si
阅读全文
摘要:纹理描述的共生矩阵方法是基于在纹理中某一灰度级结构重复出现的情况;这个结构在精细纹理中随着距离而快速的变化,而在粗糙纹理中则缓慢的变化。假设待分析在精细纹理图像的一部分是一个M*N的矩形窗口。某一灰度级结构的出现情况可以由相对的频率的矩阵来描述,他描绘了具有灰度级a,b的两个像素,在方向Φ上间隔距离为d,以多大的频率出现在窗口中。共生矩阵求取方法:这里有两种定义,书上的是第一种,也就是对称矩阵的定义,如下:我程序用的是非对称的矩阵的定义,如下:哦,我想这一大堆公式是不那么容易看明白的,不过下面这个图就让人一目了然了。下图中的Φ=0,d=1.共生矩阵产生完之后就需要使用其派生出的准则了。主要有如
阅读全文
摘要:均值模糊原理很容易了,就不解释了。我测了一下,使用汇编的代码处理时间为1-2ms左右。cpp代码处理时间为3-4ms左右。这里只给出关键代码,其余代码见这里。void asmMeanFilter(BitmapData *data){ UINT Height=data->Height; UINT s_Height=Height-1; UINT Width=data->Width; UINT s_Width=Width-1; Pix* p=(Pix*)data->Scan0; UINT h,w,i,j; __asm { push ...
阅读全文
摘要:一种图像特征的提取算法。算法步骤:1.用3*3的模板对图像每个像素进行处理,比较当前像素和周围像素的大小,将大于当前像素的置1,小于的置0。2.对这周围八个像素进行编码,这八个0和1正好是可以组成一个byte数,然后按一定的规则组成这个无符号数。3.把这个数赋值给当前像素。4.通常对处理后的图像进行区域划分,比如分成4*4 、10*10或16*16的区域,对每个区域求得直方图,得到16、100或256个直方图。(划分都不是固定的)5.这些直方图就是特征了,可以根据需要任意使用了。下面是简单的实现:clear all;close all;clc;img=imread('lena.jpg&
阅读全文
摘要:本来自己写了一个,不过性能竟然和memcpy一样,一点提升都没有,所以有就去网上找了一个性能好的。下面的程序是对100MB数据进行内存拷贝.我测试了一下。直接调用memcpy时间为100ms左右,而asm中的程序能把时间能缩短到80ms左右。性能提高的还是很明显的。#include <iostream>#include <ctime>#define N 100*1024*256using namespace std;int main(int argc, char* argv[]){ float *a; float *b; a=(float*)malloc(N*sizeo
阅读全文
摘要:如果不是处理的灰度图像,那么最大值也就没什么意思了。彩色图也可以转成灰度图嘛。虽然用了汇编,不过没有使用多媒体指令。灰度图像的RGB都一样,没必要使用mmx寄存器了,直接对单个字节处理就行了。获得最小值和获得最大值原理一样,只需改一个指令,把ja改为jna就行了。Pix asmGetMaxGrayPix(BitmapData *data){ //处理的是灰度图像,所以RGB值都一样 //这里不需要用mmx指令也可以 UINT Height=data->Height; UINT Width=data->Width; Pix* p=(Pix*)data->Scan0;...
阅读全文
摘要:权当练手了,效果不好,cpu没有提供pmulluw这样一个无符号字相乘指令。处理的效果和matlab明显不同,尤其是背景,我实在找不出问题在哪里,最可能就在寄存器符号上。灰度公式是:Gray = (R*76 + G*150 + B*30) >> 8有符号范围是[-32768-32767],无符号范围是[0-65536],前者显然不够存放255*150=38250的,所以就溢出了。提高了位宽模拟无符号相乘不行,减小运算精度也不行,开源节流都不行,让人很纠结。反正是初学,这指令还要多练才行。VOID asmARGB2Gray(BitmapData *data){ UINT Height
阅读全文
摘要:主要用来学习多媒体指令的,要不我也不会这么麻烦的用win32 sdk编程。果然要只学习图像算法,还是推荐matlab。这里主要用了pcmpgtb指令格式 pcmpgtb mm0,mm1;解释:当 mm0 中对应字节大于 mm1对应字节时,mm0相应位置置0xff,否则置0x00。当然,相关还有pcmpgtw等。详见这里//本程序算是一个简单的框架了,可以用来处理图像//主要是用来学习多媒体指令mmx/sse相关的。#include <windows.h>#include <gdiplus.h>#pragma comment(lib, "gdiplus.lib&
阅读全文
摘要:mmx指令:movq:移动8个字节。paddb:每1个字节作为一个整体单元相加。emms:mmx指令结束标志。#include <iostream>#include <windows.h>#include <gdiplus.h> //为将来使用GDI+处理图像做准备#pragma comment(lib, "gdiplus.lib")using namespace Gdiplus;using namespace std;typedef union{ ARGB Color; struct { BYTE Blue; BYTE Green; .
阅读全文
摘要:#include <iostream>using namespace std;int main(int argc, char* argv[]){ float a[8]={1,2,3,4,5,6,7,8}; float b[8]={1,2,3,4,5,6,7,8}; float c[8]; //两个数组相乘的结果 __asm { mov ebx,0; mov ecx,2; //循环两次 lp: movups xmm0,[a+ebx]; //一次存入xmm中...
阅读全文
摘要:总是有些小技巧需要找个地方记录的。#include <iostream> #include <ctime> #include <Windows.h>using namespace std;int main() { clock_t start,finish; start=clock(); Sleep(500); finish=clock(); double time = finish-start; cout<<"过了"<<time<<"ms"<<endl; system(&
阅读全文
摘要:K最邻近密度估计技术是一种分类方法,不是聚类方法。不是最优方法,实践中比较流行。通俗但不一定易懂的规则是:1.计算待分类数据和不同类中每一个数据的距离(欧氏或马氏)。2.选出最小的前K数据个距离,这里用到选择排序法。3.对比这前K个距离,找出K个数据中包含最多的是那个类的数据,即为待分类数据所在的类。不通俗但严谨的规则是:给定一个位置特征向量x和一种距离测量方法,于是有:1.在N个训练向量外,不考虑类的标签来确定k邻近。在两类的情况下,k选为奇数,一般不是类M的倍数。2.在K个样本之外,确定属于wi,i=1,2,...M类的向量的个数ki,显然sum(ki)=k。3.x属于样本最大值ki的那一
阅读全文