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
}
}
}
}
谢谢大家。
你对循环工作方式的看法是错误的。此循环永远不会循环。
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字符串搜索算法。