Я беру изображение и затем выбираю из него внутренний квадрат (т. Е. Если изображение имеет размер 100 x 100, а моя переменная neighbourSize равна 10 -> мое новое изображение имеет значение от (5,5) до (95, 95))
Мой первый l oop находит среднее значение в каждой сетке изображения (я делаю это для учета неравномерного освещения на моем изображении). Затем я ввожу второй набор циклов for, чтобы вычислить сумму квадрата, окружающего каждый отдельный пиксель (это моя переменная neighbourSize). Я делаю это, используя прямоугольник из моего исходного изображения. Я сравниваю их общее с порогом и применяю результат к моему обрезанному изображению. Я столкнулся с проблемой во время последнего запуска моего для l oop, мой прямоугольник превышает границы пикселей моего исходного изображения. Но я не уверен, где происходит ошибка.
Я пытался вычислить мои прямоугольные координаты, и я всегда на 1 пиксель выше исходного размера изображения, но я не могу понять, какую переменную мне нужно изменить.
Вот мой код:
Mat neighbor_algorithm(Mat im, int neighborSize, int sectionCount) {
Mat ROI;
int x;
int y;
int pixel_x, pixel_y;
int rows = im.rows;
int columns = im.cols;
int new_rows = rows - neighborSize / 2;
int new_cols = columns - neighborSize / 2;
int sum = 0;
Rect new_image(neighborSize / 2, neighborSize / 2, new_cols, new_rows);
Mat croppedIm = im(new_image);
Mat clone = croppedIm.clone();
int sectionHeight = new_rows / sectionCount;
int sectionWidth = new_cols / sectionCount;
int SD = find_SD(croppedIm);
int average = find_average(croppedIm);
int ROI_average = 0;
int average_grid_SD = 0;
for (int i = 0; i < sectionCount; i++) {
for (int j = 0; j < sectionCount; j++) {
Rect ROI_image = Rect(i * sectionWidth, j * sectionHeight, sectionWidth, sectionHeight);
ROI = croppedIm(ROI_image);
ROI_average = find_average(ROI);
for (x = 0; x < sectionWidth; x++) {
for (y = 0; y < sectionHeight; y++) {
pixel_x = x + i * sectionWidth;
pixel_y = y + j * sectionHeight;
Rect rect = Rect(pixel_x + neighborSize/2, pixel_y + neighborSize/2, neighborSize, neighborSize);
rect -= Point(neighborSize / 2, neighborSize / 2);
Mat temp = im(rect);
for (int a = 0; a < temp.cols; a++) {
for (int b = 0; b < temp.rows; b++) {
int pixelValue = (int)temp.at<uchar>(b, a);
sum += pixelValue;
}
}
average_grid_SD = neighborSize * neighborSize * (ROI_average - 0.75 * SD);
if (sum > average_grid_SD) {
clone.at<uchar>(pixel_y, pixel_x) = 255;
}
else {
clone.at<uchar>(pixel_y, pixel_x) = 0;
}
sum = 0;
}
}
}
}
return clone;
}
Это ошибка:
OpenCV(4.2.0) Error: Assertion fa oi.width <= m.cols && 0 <= roi.y ows) in cv::Mat::Mat, file C:\bui es\core\src\matrix.cpp, line 466