我试图在二进制图像的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++;
}
}
}
答案 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循环将在它出现问题之前解决它。