这很奇怪。我有以下代码:
int white = 0;
int black = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int total = 0;
for (int x = i - 1; x <= i + 1; x++) {
for (int y = j - 1; y <= j + 1; y++) {
total += data[x*step + y];
}
}
if (total == (255 * 9)) {
white += 1;
// data[i*step + j] = 255;
}
else {
black += 1;
// data[i*step + j] = 0;
}
}
}
cout << white << endl << black << endl;
当我运行此代码时,它将正确输入白色和黑色。但由于某种原因,当我取消注释数据时,代码将是错误的。顺便说一句,我只是简单地侵蚀了一个图像,这就是我到目前为止所做的。
答案 0 :(得分:4)
当您取消注释这些语句时,您将在其中修改data[]
“并且,因为您正在执行邻域操作,所以修改后的数据将在后续迭代中重新用作输入数据,这将是当然会使结果无效。您需要一个单独的输出图像来将这些新值写入。
答案 1 :(得分:3)
你的代码溢出了。
如果你想检查一个3x3的邻居,你需要在所有方面留出1个像素的边框。
另外,你不能就地,你需要第二个Mat来获得结果。
Mat m2 = m.clone();
int white = 0;
int black = 0;
for (int i = 1; i < height - 1; i++){ // border
for (int j = 1; j < width - 1; j++){ // border
int total = 0;
for (int x = i - 1; x <= i + 1; x++){
for (int y = j - 1; y <= j + 1; y++){
total += data[x*step + y];
}
}
if (total == (255 * 9)){
white += 1;
m2.data[i*step + j] = 255; // *write* to a 2nd mat
}
else{
black += 1;
m2.data[i*step + j] = 0; // *write* to a 2nd mat
}
}
}
cout << white << endl << black << endl;