Ошибка с краем изображения OpenCV? - PullRequest
0 голосов
/ 21 марта 2020

Я беру изображение и затем выбираю из него внутренний квадрат (т. Е. Если изображение имеет размер 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
...