Фильтрация цветового диапазона – это фундаментальный метод компьютерного зрения и обработки изображений. Он позволяет нам извлекать определенные цвета или цветовые диапазоны из изображения или видеопотока, что позволяет использовать широкий спектр приложений, таких как обнаружение объектов, сегментация изображений и отслеживание. Одной из популярных библиотек для реализации фильтрации цветового диапазона является 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.