Как выполнить boxFilter OpenCV для области интереса (ROI)?

Вопросы и ответы

У меня есть изображение, и я хочу применить boxFilter OpenCV к области интереса (ROI) этого изображения.

image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);   
cv::Rect roi( 10, 10, 64, 64);
cv::Mat output;
cv::boxFilter(image(roi),output,-1,cv::Size(scale_size,scale_size));

Я хочу знать, что произойдет, если ядро выйдет за пределы ROI? Будут ли использоваться пиксели за пределами ROI, но все еще в пределах изображения, для фильтрации, или будет использовано значение, указанное параметром BorderType?
На самом деле, я хочу использовать первый вариант для фильтрации.

Большое спасибо.

EnjImage

Я хочу знать, что произойдет, если ядро выйдет за пределы ROI? Будут ли использоваться пиксели за пределами ROI, но все еще в пределах изображения, для фильтрации или будет использовано значение, указанное параметром BorderType?

Не будут использоваться пиксели, которые находятся за пределами ROI.

Объяснение:

cv::Mat::operator()(const Rect & roi), который вы используете для передачи изображения ROI в cv::boxFilter, возвращает новый объект cv::Mat.
Этот новый объект разделяет данные с оригинальным cv::Mat image, но в остальном он отдельный (и его метаданные также отдельны).

Поэтому, когда вы передаете его в cv::boxFilter, функция будет рассматривать image(roi) как отдельный cv::Mat (отдельный от image), а пиксели на границе ROI как реальные границы входных данных.
С ними будет работать в соответствии с параметром borderType.

Возможным решением может быть увеличение ROI, чтобы включить еще несколько окружающих пикселей (примерно на половину размера ядра), но затем вам придется извлечь фактическое желаемое изображение ROI после этого.

Ответ

Для выполнения операции boxFilter из OpenCV на области интереса (ROI) изображения, следует учитывать, что если ядро фильтра выходит за пределы заданного ROI, то функция boxFilter не будет использовать пиксели, находящиеся за пределами этой области. Это значит, что обработка будет применена только к тем пикселям, которые находятся в пределах ROI, и в случае, если пиксели в пределах ядра фильтра находятся за пределами ROI, то будет применяться параметр borderType для обработки краевых пикселей.

Вот как это можно реализовать, а также несколько рекомендаций по работе с ROI и контролю за тем, чтобы ядро фильтра было правильно использовано:

Шаги выполнения:

  1. Чтение изображения:

    cv::Mat image = cv::imread(argv[1], cv::IMREAD_COLOR);
  2. Определение ROI:
    В данном примере мы определяем ROI (прямоугольную область интереса) с началом в (10, 10) и размером 64 на 64 пикселя.

    cv::Rect roi(10, 10, 64, 64);
  3. Определение размерности ядра:
    Укажите размер ядра, который будет использоваться для boxFilter. Например:

    int scale_size = 5; // размер ядра
  4. Создание матрицы для результата:

    cv::Mat output;
  5. Применение boxFilter:
    Теперь вы применяете фильтр к ROI. Имейте в виду, что если размер ядра слишком велик и выходит за пределы ROI, вы получите ухудшение результатов в этих краевых областях.

    cv::boxFilter(image(roi), output, -1, cv::Size(scale_size, scale_size));

Обработка границ:

Если ваше ядро фильтра превышает границы ROI, вы можете получить нежелательные эффекты, поэтому рекомендуется расширить ROI, чтобы захватить дополнительные пиксели, равные половине размера ядра.

Пример:

// Увеличьте ROI
cv::Rect enlarged_roi = cv::Rect(roi.x - scale_size / 2, roi.y - scale_size / 2, roi.width + scale_size, roi.height + scale_size);

Затем убедитесь, что enlarged_roi не выходит за пределы изображения перед применением boxFilter.

Извлечение конечного результата:

После фильтрации, если вы расширили ROI, вам нужно будет вернуть результат в исходные размеры:

// Удаляем части, которые выходят за границы исходного ROI
output = output(cv::Rect(scale_size / 2, scale_size / 2, roi.width, roi.height));

Заключение:

Использование boxFilter на ROI требует аккуратного обращения с размерами фильтра и управления границами. Увеличив ROI и правильно задав параметры, вы сможете избежать потерь информации и достичь желаемого результата.

Оцените материал
Добавить комментарий

Капча загружается...