在图像中实现降序循环?

时间:2016-08-29 14:18:54

标签: java android image-processing

我试图在二进制图像的4个角中寻找4个白色方块。我浏览第一个(150x150)角,并总结(25x25)像素的像素内的像素。如果超过60%的贴片是白色的,我将其全部转换为黑色。我在右上角实现了它并且它正在工作,这是代码:

  while (count1<150)
                {
                   for (int count2 = 0; count2 <150; count2++)

                    {

                        Mat ROI = original.submat(count1, count1 + patch, count2, count2 + patch);
                        int sum = (int) Core.sumElems(ROI).val[0];


                        if (sum > patch * patch * 0.6)

                        {
                            for (int qn1 = count1; qn1 < count1 + patch; qn1++) {
                                for (int qn2 = count2; qn2 < count2 + patch; qn2++)

                                {

                                    original.put(qn1, qn2, 0);

                                }

                            }
                            count1 = 200;
                            break;

                        }

                        else {

                            count1++;

                        }




                    }




                }

我在其他角落实施它时遇到了麻烦。这是我的右下角代码,它不会改变图像中的任何内容:

while (count1<150)                                                                          
{                                                                                           
    for (int count2 = original.width()-1; count2 >original.width()-151; count2--)           

    {                                                                                       

        Mat ROI = original.submat(count1, count1 + patch, count2-patch, count2);            
        int sum = (int) Core.sumElems(ROI).val[0];                                          


        if (sum > patch * patch * 0.6)                                                      

        {                                                                                   
            for (int qn1 = count1; qn1 < count1 + patch; qn1++) {                           
                for (int qn2 = count2-patch; qn2 < count2; qn2++)                           

                {                                                                           

                    original.put(qn1, qn2, 0);                                              

                }                                                                           

            }                                                                               
            count1 = 200;                                                                   
            break;                                                                          

        }                                                                                   

        else {                                                                              

            count1++;                                                                       

        }                                                                                   




    }                                                                                       

}

1 个答案:

答案 0 :(得分:0)

我猜你犯了我第一次犯的错误,你需要重置Count1

Count1 = 0;

我很久没有使用过Java了,所以我把代码翻译成了Igor pro。创建了一个二维数组,在角落中有适当大小的补丁,并将其传递给我的函数。它也没有将第二个补丁设置为零,直到我将Count1 = 0行放入。

但我也怀疑你的补丁大小有1个错误,如果你想让补丁宽4个像素,那么你需要在计算索引时减去1。 EX:开始索引是2,你想要4个像素,包括startIndex,你想要2到5,Start to Start + Width-1。 但是你是一致的,所以如果你想要一个25像素宽的补丁,你可能会将补丁设置为24。

但总的来说,我会建议3件事: 将其分解为2个子功能,一个用于询问补丁的问题(并找到索引),另一个用于清除该补丁的操作。你将需要做4次这样的事情,每个角落一次。编写FindPatch函数,以便在给定搜索范围的情况下找到补丁的起始索引。 然后编写clearPatch函数来对图像进行处理。

第二件事,索引困难。错误很容易,所以尽量保持简单。如果可能的话,我总是向前推进。如果你认为向后走过图像真的更快,那么你需要做到这一点。我仍然建议以相同的方式返回一个起始索引。因此,ClearPatch始终可以将“宽度”和“高度”添加到startIndex。它将简化该代码,因此您只需编写和测试一次。

第三件事,更多的偏好,但你使用外部while循环的方式,也可以是for循环。事实上,如果我的预感是正确的,关于需要重置Count1,那么在外部循环中使用for循环将在它出现问题之前解决它。