C# 循环和求和数据

本文关键字:数据 求和 循环 | 更新日期: 2023-09-27 17:57:24

我在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
                    }
                }
            }
        }

谢谢大家。

C# 循环和求和数据

你对循环工作方式的看法是错误的。此循环永远不会循环。

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

由于i在开始时是0的,因此不满足条件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会尝试通过使用距离表跳过尽可能多的位置。参见维基百科上的Boyer-Moore字符串搜索算法。