跳过访问for循环中的图像像素值C#

时间:2015-08-11 15:31:19

标签: c# emgucv

  • 是否可以阻止访问图像中的特定像素一次 我们满足嵌套for循环中的条件?我需要跳过它 在下一次迭代中通过图像的像素。
  • 为2个图像提供嵌套的循环测试。一旦绝对差异 像素之间匹配if条件,我想阻止访问 下一次迭代中的那个像素。

    user.Email

3 个答案:

答案 0 :(得分:2)

如果您想跳过一个i j对,只需存储i j组合并检查计数器是否等于找到上次迭代的i j

如果您只想在下一次迭代期间跳过几个像素,则可以将它们存储在List<Tuple<int, int>>中,并在每次迭代时检查它们。 (或List<CustomCoordinateStruct>,如果您认为它的清晰度/速度是值得的。)

如果对于许多像素都是如此,那么最好存储另一个bool数组,其中包含是否应该跳过该像素。

答案 1 :(得分:1)

我会将像素的索引存储在HashSet<T>

var blocked = new HashSet<int>();

...

int key = x *  watermark_img.Width + y;
if (!blocked.Contains(key)) {
    if (condition satisfied) {
        blocked.Add(key);
        count_hit[cnt - 1]++;
    }
}

我不确定您要阻止哪些索引(x,y)或(i,j)。

请注意,无论您存储多少项,HashSet都有一个固定的访问时间。

如果您需要存储所有4个索引,则可以切换到long并从这4个索引中计算密钥。这些指数都可以在大约0..2 16 或大约0..65535的范围内。

答案 2 :(得分:0)

@Olivier,我顺便说一下,最终的输出由于这个变化而改变了。以前输出是正确的。我不知道我是否做错了。如果是这样,请纠正我。

 //iterate thhrough watermark image
                for (int x = 0; x < watermark_img.Height; x++)
                {
                    for (int y = 0; y < watermark_img.Width; y++)
                    {
                        //iterate through cover image
                        for (int i = 0; i < cover.Height; i++)
                        {
                            for (int j = 0; j < cover.Width; j++)
                            {
                                int key = i *  cover.Width + j;
                                    if (!blocked.Contains(key)) 
                                    {

                                        if ((Math.Abs(watermark_arr[x, y, 0] - cover_arr[i, j, 0]) <= threshold)  //[x,y,0] --> r
                                            && (Math.Abs(watermark_arr[x, y, 1] - cover_arr[i, j, 1]) <= threshold)     //[x,y,1] --> g
                                                && (Math.Abs(watermark_arr[x, y, 2] - cover_arr[i, j, 2]) <= threshold))     //[x,y,2] --> b
                                        {
                                            flag = true;
                                            blocked.Add(key);
                                            count_hit[cnt - 1]++;
                                        }