0

PictureBox1にimage_1があります。この画像の中央にある長方形のセクションをスキャンしたいと思います。たとえば、x軸が300〜500、y軸が300〜450です。このセクションをスキャンするとき、すべてのピクセルの値を合計して、それらの平均値を取得したいと思います。

次に、テスト画像であるPictureBox2にimage_2があります。これは最初の画像のコピーですが、PictureBox2にはスクロールバーがあります。次に、最初の画像と同じ場所で2番目の画像をスキャンし、その長方形内のすべてのピクセル値を合計してそれらの平均を取得すると、値はimage_1で取得した値とまったく同じになります。

次に、PictureBox2のスクロールバーを使用してimage_2を垂直方向、y軸上に少し上に移動し、以前と同じ固定位置でスキャンをやり直し、ピクセル値を合計して平均を取得します。画像の別のセクションをスキャンしているため、これらの値は異なるはずです。次に、このプロセスをさらに繰り返し、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
                    }
                }
            }

        }

皆さん、ありがとうございました。

4

1 に答える 1

0

ループが機能する方法に関するあなたの概念は間違っています。このループは決してループしません。

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

iは先頭にあるため0、条件i > 300が満たされず、ループはループを開始しません。代わりにこれを書いてください:

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

最初の(スクロールされていない)画像と比較して、2番目の画像がどれだけスクロールされたかを調べようとしていると思います。(説明しなかった問題の解決策について話している。)

なぜ平均で作業するのですか?これは、考えられるすべての位置について数万ピクセルの平均を計算する必要があるため、非常にコストがかかります。

まず、スクロールがどのように行われるかを知る必要があります。横のみ、縦のみ、または両方?これはアルゴリズムに影響します。

両方の画像がまったく同じ場合は、単一のピクセルのみを比較し、一致するピクセルが見つかった場合は、使用可能なすべてのピクセルが一致するか、違いが検出されるまで、その隣のピクセルを比較します。

これは、私が考えているアルゴリズムの大まかなスケッチです(疑似コードで):

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 は、距離テーブルを使用して、一致するものが見つからない場合、できるだけ多くの位置をスキップしようとします。ウィキペディアの Boyer-Moore 文字列検索アルゴリズムを参照してください。

于 2013-02-04T15:53:22.547 に答える