【问题标题】:Accidental quantization in BGR to HSV conversionBGR 到 HSV 转换中的意外量化
【发布时间】:2016-01-24 17:51:43
【问题描述】:

我正在尝试将 BGR 图像转换为 HSV。当我写出转换的 H 通道时,它有一个奇怪的块状结构,我猜这意味着某些东西在此过程中被意外地量化了。我尝试先将我的 BGR unsigned char 图像转换为浮点数,但结果是一样的。这是我的代码:

// STL
#include <iostream>

// OpenCV
#include <opencv2/opencv.hpp>

void Float(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat floatImage;
    image.convertTo(floatImage, CV_32FC3);

    cv::Mat hsvImage;
    cv::cvtColor(floatImage, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_float.png", hsvChannels[0]);

}

void Original(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_original.png", hsvChannels[0]);

}

int main(int argc, char* argv[])
{
    std::string inputFilename = argv[1];

    Original(inputFilename);
    Float(inputFilename);

    return EXIT_SUCCESS;
}

这是输入:

和输出(h_original.png):

和输出(h_float.png):

关于我在这里做错了什么有什么建议吗?

【问题讨论】:

  • 输出有什么问题?对我来说似乎合乎逻辑
  • @HumamHelfawi 它非常“块状”。 H 图像(或 S 或 V)应该看起来像原始图像的灰度版本,对吧?也就是说,它应该像原始图像一样平滑变化。为什么要引入所有这些矩形伪影/边缘?
  • 我不确定,但您的图像似乎具有非常低范围的色彩空间(白色及其度数)
  • @HumamHelfawi 这不应该改变平滑度。 RGB是连续空间,HSV也是连续空间,所以映射不应该这样量化。
  • 是的,它是连续的,但只是在 N 上。但是,这当然不是重点。考虑这种情况:黑色形状的图像,上面有光和阴影。所有形状都是黑色的,因此它将映射到相同的 H 和 S 值(几乎)。但 V 将包含非常平滑且不同的值。

标签: c++ opencv opencv3.0 hsv


【解决方案1】:

你正在以正确的方式做每一件事。我在我的机器上尝试了你的图像并得到了相同的结果。我认为这个结果是由于您的图像的颜色范围较低。这是 HSV 的 3 个通道的结果。 H 和 S 遇到了这个问题。然而,V 是平滑的,因为它是关于光照条件而不是颜色。

编辑:

为了让我的观点更清楚,请使用相同的代码查看此图像和输出:

另一个编辑(黑色问题):

HSV: if V=0 then it is black 中,其余的 SH 是。 因此,要检查颜色是否为黑色,您只需检查 V 分量,如果检查另一个则没有意义。

数学证明:

C = V × S
X = C × (1 - |(H / 60º) mod 2 - 1|)
m = V - C

很明显,当V=0 和任何H,S 是时,我们将拥有: C=0 , X=0 导致 R,G,B=(0,0,0)

【讨论】:

  • 那么你能解释一下为什么在 H 图像中任何合理近似的“相同颜色”或至少“非常平滑变化”的床头板最终会出现非常锐利的矩形边缘吗?床上的毯子也一样,尤其是右下角?这些矩形是图像对齐的(即完全垂直)似乎也很奇怪?
  • 没那么难。到这里rapidtables.com/convert/color/rgb-to-hsv.htm 看看这个 RGB 值 (0,0,0), (1,2,3) 的 HSV 是多少,它们都是黑色的,人眼无法看到差异。但是 H 值会是一个惊喜 :)
  • 那么是否有更好的色彩空间来表示图像的“颜色”(与 HSV 中的 H 所做的相同类型的事情)但没有这些奇怪的效果?我正在尝试检测“颜色边缘”,因此这些伪影确实存在问题,因为边缘检测算法确实会锁定它们。
  • 颜色边缘是什么意思?你可能会问另一个关于样本输入/输出的问题
猜你喜欢
  • 2013-06-13
  • 2021-09-18
  • 2021-06-08
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多