繁体   English   中英

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

[英]Skip accessing an image pixel value within a for loop C#

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

     byte[,,] watermark_arr = watermark_img.Data; byte[,,] cover_arr = cover.Data; //iterate through 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++) { 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; count_hit[cnt - 1]++; } 

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

如果只想在下一次迭代中跳过几个像素,则可以将它们存储在List<Tuple<int, int>>并在每次迭代时进行检查。 (或List<CustomCoordinateStruct>如果您认为出于清晰度/速度考虑,值得这样做。)

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

我将像素的索引存储在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的范围内。

@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]++;
                                        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM