『原創』+『參考』基于PPC的圖像對比程序——使
系統
1850 0
前言的前言:
最近小弟閑來無聊,就想到了在PPC上面來做個圖像對比的小東東,查找各方資料,終于在今天初步完成了這個程序,現在整理之后和各位共勉。程序中還存在很多不足之處,大家盡管提出自己的意見和建議,本人非常歡迎哦!
前言:
在閱讀本文后,你將知道:
-
如何在.net Compact Framework 2.0框架下使用C#語言進行圖片的縮放操作、保存
-
如何在c#中計算圖片的直方圖量度
-
如何使用SelectPictureDialog對話框
你需要以下開發環境:
-
Visual Studio 2008
-
Windows Mobile 6 Professional SDK(WM6
可以直接運行我提供的例子,WM5也可以開發
)
正文:
第一步:我們先來創建一個C#
智能設備項目,
我選用的是
.net Compact Framework 2.0
的框架庫,然后選擇?
Windows Mobile 6 Professional SDK
平臺。
在默認的Form1窗體中,我們如下圖一樣進行設計:
一個Label2用于顯示對比結果、一個TabControl,tabPage1中有一個PictureBox1,tabPage2中同樣放入一個PictureBox2,兩個PictureBox的SizeMode屬性設置為
StretchImage。
設計好界面后,我們就添加代碼,在這里只列出關鍵代碼,詳細代碼請到下載的項目中查找吧。
在程序頭部引用
using Microsoft.WindowsMobile.Forms;
using System.Drawing;
然后,添加全局變量:
PicCompare.GetHisogram.GetHis getHis = new PicCompare.GetHisogram.GetHis();//直方圖度量計算類其中包括了圖像縮放方法
string pic1 = @"Storage Card/test.bmp";//指定縮放后的圖片存放位置和格式
string pic2 = @"Storage Card/test2.bmp";//指定縮放后的圖片存放位置和格式
int[] pic1t;//圖片一的直方圖量度容器
int[] pic2t;//圖片二的直方圖量度容器
定義好變量后,我們雙擊“圖片一”,給他添加如下代碼:
?
Code
SelectPictureDialog?spd?
=
?
new
?SelectPictureDialog();
spd.ShowDialog();
pic1t?
=
?getHis.GetHisogram(getHis.Resized(spd.FileName,?pic1));
//
計算出圖片一的直方圖量度存放到一個pic1t的數組變量中
Bitmap?bmp
=
new
?Bitmap(spd.FileName);
????????????
pictureBox1.Image?
=
?bmp;
//
把處理后的圖片放入pictureBox1進行預覽
?
圖片二按鈕同上,只需修改相關參數即可。
然后我們看一下直方圖量度計算類的部分代碼實現吧:
計算圖像的直方圖的這個代碼從網絡上copy過來的,這個到處都有,我也不是太在行,所以暫不做解釋了,汗~
計算圖像的直方圖
?
///
?
<summary>
????????
///
?計算圖像的直方圖
????????
///
?
</summary>
????????
///
?
<param?name="img">
圖片
</param>
????????
///
?
<returns>
返回直方圖量度
</returns>
????????
public
?
int
[]?GetHisogram(Bitmap?img)
????????{
????????????
????????????BitmapData?data?
=
?img.LockBits(
new
?System.Drawing.Rectangle(
0
,?
0
,?img.Width,?img.Height),?ImageLockMode.ReadWrite,?PixelFormat.Format24bppRgb);
????????????
int
[]?histogram?
=
?
new
?
int
[
256
];
????????????
unsafe
????????????{
????????????????
byte
*
?ptr?
=
?(
byte
*
)data.Scan0;
????????????????
int
?remain?
=
?data.Stride?
-
?data.Width?
*
?
3
;
????????????????
for
?(
int
?i?
=
?
0
;?i?
<
?histogram.Length;?i
++
)
????????????????????histogram[i]?
=
?
0
;
????????????????
for
?(
int
?i?
=
?
0
;?i?
<
?data.Height;?i
++
)
????????????????{
????????????????????
for
?(
int
?j?
=
?
0
;?j?
<
?data.Width;?j
++
)
????????????????????{
????????????????????????
int
?mean?
=
?ptr[
0
]?
+
?ptr[
1
]?
+
?ptr[
2
];
????????????????????????mean?
/=
?
3
;
????????????????????????histogram[mean]
++
;
????????????????????????ptr?
+=
?
3
;
????????????????????}
????????????????????ptr?
+=
?remain;
????????????????}
????????????}
????????????img.UnlockBits(data);
????????????
return
?histogram;
????????}
?
下面的這個代碼就是在分別計算完兩張圖片的量度后,把兩個量度再放到這里面來計算結果,所得結果即為圖片相似度的一個參考值,代碼如下:
?
最終計算結果
????????
///
?
<summary>
????????
///
最終計算結果
????????
///
?
</summary>
????????
///
?
<param?name="firstNum">
圖片一的直方圖量度
</param>
????????
///
?
<param?name="scondNum">
圖片二的直方圖量度
</param>
????????
///
?
<returns>
計算結果
</returns>
????????
public
?
float
?GetResult(
int
[]?firstNum,?
int
[]?scondNum)
????????{
????????????
if
?(firstNum.Length?
!=
?scondNum.Length)
????????????{
????????????????
return
?
0
;
????????????}
????????????
else
????????????{
????????????????
float
?result?
=
?
0
;
????????????????
int
?j?
=
?firstNum.Length;
????????????????
for
?(
int
?i?
=
?
0
;?i?
<
?j;?i
++
)
????????????????{
????????????????????result?
+=
?
1
?
-
?GetAbs(firstNum[i],?scondNum[i]);
????????????????????Console.WriteLine(i?
+
?
"
----
"
?
+
?result);
????????????????}
????????????????
return
?result?
/
?j;
????????????}
????????}
?
其中,還有一個類是用來處理圖片大小的,在這里也貼出來,大家應該用得到的哦!
?
Code
?
///
?
<summary>
????????
///
?圖片大小縮放(正方形)
????????
///
?作者:Jack?Fan
????????
///
?
</summary>
????????
///
?
<param?name="sideSize">
指定大小
</param>
????????
///
?
<param?name="srcBMP">
原始圖片
</param>
????????
///
?
<returns>
返回縮放后的Bitmap圖片
</returns>
????????
public
?Bitmap?ResizeBMP(
int
?sideSize,?Bitmap?srcBMP)
????????{
????????????Bitmap?bmp?
=
?
new
?Bitmap(sideSize,?sideSize);
????????????Rectangle?srcRec?
=
?
new
?Rectangle(
0
,?
0
,?srcBMP.Width,?srcBMP.Height);
????????????Rectangle?destRec?
=
?
new
?Rectangle(
0
,?
0
,?sideSize,?sideSize);
????????????Graphics?g?
=
?Graphics.FromImage(bmp);
????????????g.DrawImage(srcBMP,?destRec,?srcRec,?GraphicsUnit.Pixel);
????????????g.Dispose();
????????????
return
?bmp;
????????}
?
?
對比按鈕的代碼:
?
對比按鈕
?pictureBox1.Refresh();
pictureBox2.Refresh();
label2.Text?
=
?(getHis.GetResult(pic1t,?pic2t)?
*
?
100
).ToString()?
+
?
"
%
"
;
//
計算最終結果
?
好了,代碼就是這些了,下面來看看實際效果如何把:
1、程序運行后,添加了兩張比較相似的圖片(不同點請看第三張圖片的紅圈):
然后,點擊“對比”按鈕后,即可見到相似度了:
?
結尾:
在這里,我想申明一點,這個直方圖量度來計算圖片相似度的想法是我從園子里一個朋友
Aaron Wu
的blog上看來的,本想在前面附上他的署名,無奈今天無論如何都找不到他的原文,所以請見諒,您看到了就跟我說一聲,畢竟我還有很多問題想請教一二啊!(原文名稱《圖像相似度算法的C#實現及測評》,在cnblogs里面好像搜不到了哦,大家股溝一下吧!)文中還有部分細節描述不清楚的地方,歡迎各位提問,在下文筆不好,只能是有問必答,呵呵。相信大家在看了源代碼以及了解了相關直方圖量度的知識后,會有另一番感覺。
另:在測試中,發現如果使用圖片分割,再逐個部分進行對比,然后在匯總的方法,得出的結果就比較高了!但是無奈PPC設備硬件條件有限,暫時還不考慮。如果轉載請注明原文歸屬哦,謝謝。
?源代碼:
點擊下載
『原創』+『參考』基于PPC的圖像對比程序——使用直方圖度量
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元