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