0

我在 PictureBox1 中有 image_1。我想扫描这张图片中间的一个矩形部分,比如 x 轴上大约 300 到 500,y 轴上大约 300 到 450。当我浏览这一部分时,我想将所有像素的值相加并得到它们的平均值。

然后我在测试图像 PictureBox2 中有 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
                    }
                }
            }

        }

谢谢你们。

4

1 回答 1

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 会尝试使用距离表跳过尽可能多的位置。请参阅Wikipedia 上的 Boyer–Moore 字符串搜索算法

于 2013-02-04T15:53:22.547 回答