为2个图像提供嵌套的循环测试。一旦绝对差异 像素之间匹配if条件,我想阻止访问 下一次迭代中的那个像素。
user.Email
答案 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]++;
}