Освоение фильтрации цветового диапазона с помощью OpenCV: подробное руководство

Фильтрация цветового диапазона – это фундаментальный метод компьютерного зрения и обработки изображений. Он позволяет нам извлекать определенные цвета или цветовые диапазоны из изображения или видеопотока, что позволяет использовать широкий спектр приложений, таких как обнаружение объектов, сегментация изображений и отслеживание. Одной из популярных библиотек для реализации фильтрации цветового диапазона является OpenCV, которая предоставляет множество методов и функций для выполнения этой задачи. В этой статье мы рассмотрим несколько подходов к фильтрации цветового диапазона с помощью OpenCV, а также приведем примеры кода для каждого метода.

Метод 1: использование функции cv::inRange
Появившееся сообщение об ошибке: «неопределенная ссылка на cv::inRange," suggests that the linker is unable to find the definition of thecv::inRangefunction. To resolve this issue, ensure that you have included the necessary OpenCV libraries and headers in your project. Here's an example of usingcv::inRange` для фильтрации определенного цветового диапазона:

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
int main()
{
    cv::Mat image = cv::imread("input.jpg");
    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

    cv::Scalar lowerBound(0, 100, 100);
    cv::Scalar upperBound(20, 255, 255);

    cv::Mat mask;
    cv::inRange(hsvImage, lowerBound, upperBound, mask);

    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", mask);
    cv::waitKey(0);

    return 0;
}

В этом примере мы конвертируем входное изображение в цветовое пространство HSV, используя cv::cvtColor. Затем мы определяем нижнюю и верхнюю границы цветового диапазона, который хотим фильтровать, используя cv::Scalar. Наконец, мы применяем cv::inRangeдля создания бинарной маски, представляющей отфильтрованные пиксели.

Метод 2: методы определения порогов
Пороговое значение — еще один мощный подход к фильтрации цветового диапазона. OpenCV предоставляет различные методы определения порогов, которые можно использовать для извлечения определенных цветов. Вот пример использования метода адаптивного порогового определения:

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
int main()
{
    cv::Mat image = cv::imread("input.jpg");
    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

    cv::Mat thresholded;
    cv::inRange(hsvImage, cv::Scalar(0, 100, 100), cv::Scalar(20, 255, 255), thresholded);

    cv::adaptiveThreshold(thresholded, thresholded, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 2);

    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", thresholded);
    cv::waitKey(0);

    return 0;
}

В этом примере мы сначала применяем cv::inRangeдля создания начальной двоичной маски. Затем мы используем cv::adaptiveThresholdдля дальнейшего уточнения маски с помощью адаптивного порога.

Метод 3: пороговое значение пользовательского цветового пространства
Иногда фильтрация цветового диапазона более эффективна в пользовательском цветовом пространстве, а не в стандартных пространствах RGB или HSV. OpenCV позволяет определять и использовать собственные цветовые пространства для определения порогов. Вот пример использования пользовательского цветового пространства:

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
int main()
{
    cv::Mat image = cv::imread("input.jpg");

    cv::Mat customSpace;
    cv::cvtColor(image, customSpace, cv::COLOR_BGR2XYZ);

    cv::Mat thresholded;
    cv::inRange(customSpace, cv::Scalar(0, 0, 100), cv::Scalar(255, 255, 200), thresholded);

    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", thresholded);
    cv::waitKey(0);

    return 0;
}

В этом примере мы преобразуем входное изображение в цветовое пространство XYZ, используя cv::cvtColor, а затем применяем cv::inRangeдля фильтрации нужного цветового диапазона.

Фильтрация цветового диапазона — важный метод компьютерного зрения и обработки изображений. OpenCV предоставляет множество методов для выполнения этой задачи, включая функцию cv::inRange, методы определения порогов и определение порогов пользовательского цветового пространства. Используя эти методы и экспериментируя с различными цветовыми диапазонами, вы можете извлекать определенные цвета или цветовые диапазоны из изображений или видеопотоков для различных приложений. Понимание и освоение этих методов значительно расширит ваши возможности работы с фильтрацией цветового диапазона в OpenCV.