2013-02-04 48 views
0

我在PictureBox1中有image_1。我想掃描圖像中間的一個矩形部分,例如x軸上的300到500和y軸上的300到450。當我掃描這一部分時,我想將所有像素的值相加並得到它們的平均值。c#循環和總和數據

然後,我在ImageBox2中有image_2,測試圖像。這是第一張圖片的副本,但PictureBox2上有一個滾動條。如果我然後在與第一張圖像相同的位置掃描第二張圖像,則對該矩形內的每個像素值進行求和,並得到它們的平均值,這些值應與我使用image_1得到的值完全相同。

現在,我將使用PictureBox2上的滾動條在垂直,y軸上稍微向上移動image_2,並在與之前相同的固定位置重新掃描,然後合併像素值並獲取它們的平均值。這些值應該是不同的,因爲我正在掃描圖像的不同部分。 然後我再重複這個過程,在image_2的y軸上獲得不同程度的差異以獲得數值讀數。

這只是爲了證明一個概念。在固定的矩形位置上掃描圖像,求和和平均值足以最終縮小這些值,以便可以定位對象的起點。

這是否被認爲是可能的我是否想嘗試一下。 請指教最簡單的方法。在這個階段沒有必要嘗試最快或最有效的方法,純粹目前最簡單的方法是最好的

這是我可以簡單這樣做嗎?

namespace imageAlign 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Bitmap myImage1 = (Bitmap)pictureBox1.Image; 
      OpenFileDialog ofd1 = new OpenFileDialog(); 
      if (ofd1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       pictureBox1.Image = Image.FromFile(ofd1.FileName); 

         // get pixel value and store it in array, sum and average it so it can Be compared to image2 
       int sum = 0; 
         for (int i = 0; i > 300 && i < 500; i++) 
         { 
          for (int j = 0; j > 300 && j < 450; i++) 
          { 
           int[] img1 = new int[i]; 
           sum += img1[i]; 
           MessageBox.Show(sum); 
           //Color pixel = img1.GetPixel(i,j); 
           //sum and average pixel values in array 
        } 
       } 
      } 

     } 

謝謝大家。

+0

這一切的目標是什麼。你想達到什麼目的?你是否想知道第二張圖像與第一張圖像進行比較所滾動的數量?它可以水平和垂直滾動嗎? –

+3

您的for循環不正確。如果你想在300到500之間,應該是__for(int i = 300; i <500; i ++); __你寫的東西會落在循環中 –

+0

@Jason Moore:不客氣。此外,由於您是StackOverflow的新用戶,因此我想告訴您,您可以通過查看答案旁邊的勾號來獲得最佳答案並接受最能幫助您的答案。在這個網站上upvote或接受的答案算作「謝謝」。 –

回答

0

您對循環工作方式的看法是錯誤的。這個循環永遠不會循環。

for (int i = 0; i > 300 && i < 500; i++) ... 

由於i0之初,病情i > 300沒有被滿足,循環甚至不會開始循環。而不是這樣寫:

for (int i = 300; i < 500; i++) ... 

我假設你試圖通過找到多少第二圖像已滾動,通過比較第一(非滾動)的圖像。 (你正在談論解決你沒有解釋的問題。)

爲什麼用平均值?這將非常昂貴,因爲您必須計算每個可能位置的數萬像素的平均值。

首先我們需要知道滾動是如何發生的。只有水平,或只有垂直,或兩者?這會影響算法。

如果兩幅圖像完全相同,我只會比較單個像素,並且如果找到匹配像素,則比較它旁邊的像素,直到所有可用像素匹配或檢測到差異。

這裏的算法我心目中的草圖(在僞代碼):

for every x in image1 up to image1.width - pattern.width 
    for every y in image1 up to image1.height - pattern.height 
     if match_found(x, y) then 
      return x, y  -- this is the desired result 
     end if     
    next 
next 
if we reach this point, we didn't find a match. 

function match_found(x, y) 
    for every xp in pattern  -- where pattern is a portion of image 2 
     for every yp in pattern 
      if image1[x + xp, y + yp] not equal pattern[xp, yp] 
       return false 
     next 
    next 
    return true 
end function  

您也可以嘗試去適應搜索字符串模式而開發的算法,就像博耶 - 穆爾算法,對這個圖像問題。基本上Boyer-Moore通過使用距離表來嘗試跳過儘可能多的位置,如果找不到匹配的話。請參閱維基百科上的Boyer–Moore string search algorithm ..