Эффективный InRange в HSV с циклическим диапазоном оттенков

Я пытаюсь использовать cv :: InRange () с HSV-изображением. Поскольку значение оттенка является циклическим, мне нужно обработать минимальное / максимальное значения, где минимальное значение может быть больше максимального значения оттенка. До сих пор я использовал следующий код для вычисления маски диапазона:

cv::Mat InRangeMask(const cv::Mat &hsv, cv::Scalar min, cv::Scalar max)
{
cv::Mat rangeMask;
if(min[0]<=max[0])
{
cv::inRange(hsv, min, max, rangeMask);
}
else
{
cv::Mat rangeMask2;
cv::Scalar min1(0, min[1], min[2]);
cv::Scalar max1(min[0], max[1], max[2]);
cv::Scalar min2(max[0], min[1], min[2]);
cv::Scalar max2(179, max[1], max[2]);

cv::inRange(hsv, min1, max1, rangeMask);
cv::inRange(hsv, min2, max2, rangeMask2);
rangeMask |= rangeMask2;
}
return rangeMask;
}

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

Что может быть более эффективной реализацией для вычисления пикселей в диапазоне hsv? Я уверен, что у кого-то уже есть хорошее решение этой проблемы. Использование функций openCV или переписать алгоритм?

0

Решение

Вы всегда можете переписать алгоритм, который не так сложен для функции inRange,

Другое решение может быть просто использовать inRange когда min[0]<=max[0] и в противном случае сделайте следующее:

  1. разрезать каналы {hchan,schan,vchan} вашего изображения с помощью cv::split

  2. применять inRange на три канала и получить maskH, maskS, maskV

    • inRange(hchan,max[0],min[0],maskH)
    • inRange(schan,min[1],max[1],maskS)
    • inRange(vchan,min[2],max[2],maskV)
  3. рекомбинировать три маски, как это

    • bitwise_and(maskS,maskV,rangeMask)
    • bitwise_not(maskH,maskH)
    • bitwise_and(maskH,rangeMask)

Но я лично считаю, что это перерегулирование (и также менее эффективное, чем переписывать алгоритм).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]