既然选择远方,便只顾风雨兼程……

图像相似度算法的C#实现及测评

上一篇 / 下一篇  2009-04-28 11:57:41 / 个人分类:软件开发相关

51Testing软件测试网RXv V C%c$FRF^

  近日逛博客的时候偶然发现了一个有关图片相似度的Python算法实现。想着很有意思便搬到C#上来了,给大家看看。51Testing软件测试网arq8O,\*}sJ@

闲言碎语

/AHb3Cu,K0

51Testing软件测试网-h*t3a(x@e}lX$yVf!aS

  才疏学浅,只把计算图像相似度的一个基本算法的基本实现方式给罗列了出来,以至于在最后自己测评的时候也大发感慨,这个算法有点不靠谱。不管怎么样,这个算法有时候还是有用的,所以还是列出来跟大家伙一起分享分享~~

wZ d:A'LuK:}0k0

  PS:图像处理这一块博大精深,个人偶尔发现了点东西拿来分享。说的不好的地方,写得太糟的地方,诸位准备扔砖头还望淡定,淡定~~51Testing软件测试网+u"e V` e9LC Do]"x

51Testing软件测试网|F+s F!~*S\

基本知识介绍51Testing软件测试网&]ign%LFp;F

颜色直方图51Testing软件测试网Pd6\ c$`

               颜色直方图是在许多图像检索系统中被广泛采用的颜色特征,它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适用于描述那些难以进行自动分割的图像。51Testing软件测试网9vm_c QE/Wz$n

灰度直方图51Testing软件测试网%h:H o8hj

  灰度直方图是灰度级的函数,它表示图像中具有每种灰度级的像素的个数,反映图像中每种灰度出现的频率。灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图像的最基本的统计特征。

3A \B n(?.t a/tT0

   本文中即是使用灰度直方图来计算图片相似度,关于算法那一块也不赘言了,毕竟图像学图形学,直方图我是门儿都不懂,我也不准备打肿脸充胖子,只想实现一个最基本的算法,然后从最直观的角度看看这个算法的有效性,仅此而已。

V9PMj$K$M3z0

 51Testing软件测试网W;d|&|JA!B-C!];Mo@

算法实现51Testing软件测试网:pU] M%T

               诸位看官休怪笔者囫囵吞枣,浅尝辄止的学习态度。额毕竟是因兴趣而来,于此方面并无半点基础(当然,除了知道RGB是啥玩意儿——这还幸亏当年计算机图形学的老师是个Super美女,因此多上了几节课的缘故),更谈不上半点造诣,看官莫怪莫怪,且忍住怒气,是走是留,小生不敢有半点阻拦~~

#L@s3W+z2p2bkI0

大致步骤如下:51Testing软件测试网,?"P3cc4sw

1, 将图像转换成相同大小,以有利于计算出相像的直方图来51Testing软件测试网'J+P~u/\?u

2, 计算转化后的灰度直方图

,Xei6d;_2O%p J&h0

3, 利用XX公式,得到直方图相似度的定量度量51Testing软件测试网G o%K6I/?0t.I8NX

4, 输出这些不知道有用没用的相似度结果数据

p(`"W ii0{j(`0

代码实现

;YS+o:y6aF]^k0

步骤1将图像转化成相同大小,我们暂且转化成256 X 256吧。

*M0R\&vm\.S%f0

 

T*?*B {b3v0

publicBitmapResize(stringimageFile,stringnewImageFile)51Testing软件测试网.\8F5Q+_!p#D

       {

h`.k%wa(K.V/d0

           img =Image.FromFile(imageFile);51Testing软件测试网sT NL#j+D:SV5?

           BitmapimgOutput =newBitmap(img, 256, 256);51Testing软件测试网3FIH/x,Toh.A)l{,\B W

           imgOutput.Save(newImageFile, System.Drawing.Imaging.ImageFormat.Jpeg);

uVp4r$j$u g2C;G0

           imgOutput.Dispose();

5v9} YI2y{@!G-o0

           return(Bitmap)Image.FromFile(newImageFile);51Testing软件测试网tC5^,fVkNo

     }51Testing软件测试网2X[Bi1@

 

7~+V L]-{*d6s0

  这部分代码很好懂,imageFile为原始图片的完整路径,newImageFile为强转大小后的256 X 256图片的路径,为了“赛”后可以看到我们转化出来的图片长啥样,所以我就把它保存到了本地了,以至于有了上面略显丑陋的代码。51Testing软件测试网1~$[[;L{

步骤2,计算图像的直方图51Testing软件测试网%s0I%cu3\~6kR

publicint[] GetHisogram(Bitmapimg)51Testing软件测试网~ nE0sI-e

       {51Testing软件测试网 HNS/oT

           BitmapDatadata = img.LockBits(newSystem.Drawing.Rectangle( 0 , 0 , img.Width , img.Height ),ImageLockMode.ReadWrite ,PixelFormat.Format24bppRgb );51Testing软件测试网/f-?mk3@)Nk

           int[ ] histogram =newint[ 256 ];

fJt r^!KMT0

           unsafe51Testing软件测试网)[,h-`J9Xe9R

           {51Testing软件测试网 h`$Q b%c?;qto|

                               byte* ptr = (byte* )data.Scan0;

]4wY6h_^6o0

                               intremain = data.Stride - data.Width * 3;51Testing软件测试网|:?0B#` `F"L&a

                               for(inti = 0 ; i < histogram.Length ; i ++ )

0K^(\6c6[_2G-m |,h0

                                       histogram[ i ] = 0;51Testing软件测试网IPrs$_f

                               for(inti = 0 ; i < data.Height ; i ++ )

m8iugCV0

                               {51Testing软件测试网h$AW-D4fZ)eY9r1R

                                       for(intj = 0 ; j < data.Width ; j ++ )51Testing软件测试网O/\5H:nv

                                       {51Testing软件测试网L;p l^QbN

                                               intmean = ptr[ 0 ] + ptr[ 1 ] + ptr[ 2 ];

Q&BLIh z(S4E%No"^0

                                               mean /= 3;

*t8iX-I@~ [?0

                                               histogram[ mean ] ++;

Ebc$K#}$h6B0

                                               ptr += 3;51Testing软件测试网4r-^.\-?6j,{2Z

                                       }

&h)IWm(L-^.`0

                                       ptr += remain;

/lll!hv5ui-d0

                               }51Testing软件测试网$N*Z8Z9{R

           }51Testing软件测试网*bTV3`$d5c1x.x$W+t@!c

                       img.UnlockBits( data ); 

2t"P'qy(_G`,R0

           returnhistogram;51Testing软件测试网'YS ozN0c5L

   }51Testing软件测试网*Ma H.YZ&U:sW_j

这段就是惊天地泣鬼神的灰度直方图计算方法,里面的弯弯绕还是留给诸位自己去掺和。51Testing软件测试网;dv];CR]sT8kH

步骤3,计算直方图相似度度量

2f*DC&X"]3EUp0

这一步骤的法宝在于这个:

M2RM Ud3y_ q*F0

Sim(G,S)=HowTo其中G,S为直方图,N为颜色空间样点数

{h!K#k Hi0

为了大家少敲两行字儿,也给出一堆乱七八糟的代码:

+?CAAG/\)ES5P2go0

 

w\8^tYWMa0

//计算相减后的绝对值

5`u!CmUI:b)zPh0

       privatefloatGetAbs(intfirstNum,intsecondNum)51Testing软件测试网2d D)Re[*?$aao

       {

2Y&E%EH~#j3p,qr c0

           floatabs =Math.Abs((float)firstNum - (float)secondNum);51Testing软件测试网`C(Y l2i#dG"YUy

           floatresult =Math.Max(firstNum, secondNum);51Testing软件测试网`2}JW h'|7~/l(c

           if(result == 0)

6F+R9`aV+E's^l0d0

               result = 1;

P!or4yp0P1J0

           returnabs / result;51Testing软件测试网? `PpF^g VF+u\

       }51Testing软件测试网4v F yS"DYQ3IW'z

 51Testing软件测试网:yt;G~O-bZQzD

       //最终计算结果

$hr2oQ2s:TfiI0

       publicfloatGetResult(int[] firstNum,int[] scondNum)

O.y7P ~B0

       {51Testing软件测试网M-Jn*R[2s,`

           if(firstNum.Length != scondNum.Length)51Testing软件测试网^6C5OGN/`7Tw#{

           {51Testing软件测试网{S6l%o*mp9lv x

               return0;

3A"Q Cc!CG!D0

           }

%C"s qX C I h'Zp1}(K0

           else

S?N Ko+Bg3W#W#Z9Q7D0

           {

m1t ?(d VNm0

               floatresult = 0;51Testing软件测试网To;hK*Nw H

               intj = firstNum.Length;

'a6{;xZ!x.O5uc0

               for(inti = 0; i < j; i++)

bN&V/\4p.h2\6zxB0

               {51Testing软件测试网DmW!wyxoX

                   result += 1 - GetAbs(firstNum[i], scondNum[i]);51Testing软件测试网)u{7nw\n~R

                   Console.WriteLine(i +"----"+ result);51Testing软件测试网8U'h/b2ab8?

               }

%Z"Db5W Ip v?0

               returnresult/j;

4g`+ct{LQi"w6MB0

           }51Testing软件测试网|'A~7L!Zf#C g

TAG: 图像相似度

 

评分:0

我来说两句

Open Toolbar