gpt4 book ai didi

c++ - 具有循环色调范围的 HSV 中的高效 InRange

转载 作者:行者123 更新时间:2023-11-28 07:04:45 31 4
gpt4 key购买 nike

我正在尝试将 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;
}

但是这个解决方案在 else 情况下需要两倍的时间(在优化发布中)。我认为可以有一个更有效的代码来反转范围或以某种方式反转图像。但是由于我使用的是完整的 hsv 范围而不仅仅是色调 channel ,所以我还没有找到更好的解决方案。

在 hsv 范围内计算像素的更有效实现是什么?我敢肯定有人已经对这个问题有了很好的解决方案。使用 openCV 函数还是重写算法?

最佳答案

你总是可以重写算法,这对函数来说并不复杂inRange .

另一种解决方案可能是简单地使用 inRange什么时候min[0]<=max[0]否则执行以下操作:

  1. 打开 channel {hchan,schan,vchan}你的图像使用 cv::split

  2. 申请 inRange到三个 channel 并得到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. 像这样重新组合三个mask

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

但我个人认为这是一个过度(而且效率也低于重写算法)。

关于c++ - 具有循环色调范围的 HSV 中的高效 InRange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21939345/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com