映像相似性(借鑒)–『原創』+『參考』基於PPC的映像對比程式——使用長條圖度量

來源:互聯網
上載者:User

轉自:http://tech.it168.com/a2009/0811/622/000000622042.shtml

前言的前言:

 最近小弟閑來無聊,就想到了在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;//圖片二的長條圖量度容器

 定義好變數後,我們雙擊“圖片一”,給他添加如下代碼:

 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;

 }

 }

 其中,還有一個類是用來處理圖片大小的,在這裡也貼出來,大家應該用得到的哦!

 /// <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、程式運行後,添加了兩張比較相似的圖片(不同點請看第三張圖片的紅圈):

 然後,點擊“對比”按鈕後,即可見到相似性了:

 結尾:

 在這裡,我想申明一點,這個長條圖量度來計算圖片相似性的想法是我從園子裡一個朋友的blog上看來的,本想在前面附上他的署名,無奈今天無論如何都找不到他的原文,所以請見諒,您看到了就跟我說一聲,畢竟我還有很多問題想請教一二啊!(原文名稱《映像相似性演算法的C#實現及測評》,在cnblogs裡面好像搜不到了哦,大家股溝一下吧!)文中還有部分細節描述不清楚的地方,歡迎各位提問,在下文筆不好,只能是有問必答,呵呵。相信大家在看了原始碼以及瞭解了相關長條圖量度的知識後,會有另一番感覺。

 另:在測試中,發現如果使用圖片分割,再逐個部分進行對比,然後在匯總的方法,得出的結果就比較高了!但是無奈PPC裝置硬體條件有限,暫時還不考慮。

查看原文地址

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.