【问题标题】:c# loop and sum datac# 循环和求和数据
【发布时间】:2013-02-05 00:08: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
                    }
                }
            }

        }

谢谢大家。

【问题讨论】:

  • 这一切的目的是什么。你想达到什么目的?您想通过将第二张图片与第一张图片进行比较来了解第二张图片滚动了多少吗?它可以水平和垂直滚动吗?
  • 您的 for 循环不正确。如果你想在 i 中从 300 到 500,应该是 for(int i = 300; i 你写的东西会直接跳出循环
  • @Jason Moore:不客气。另外,由于您是 StackOverflow 的新手,我想通知您,您可以通过勾选答案旁边的勾号来为好的答案投票并接受对您帮助最大的答案。在本网站上,点赞或接受的答案都算作“感谢”。

标签: c# image


【解决方案1】:

您对 for 循环工作方式的概念是错误的。这个循环永远不会循环。

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

由于i开头是0,所以条件i &gt; 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 string search algorithm..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多