C++ 如何在c+中使用RGBtoHSV转换器功能后显示HSV图像+;?
晚上好,在互联网上我们可以找到很多将RGB像素值转换为HSV的算法,但我找不到显示它的函数。我正在使用MS Visual Studio 2013和openCV库。我知道有获取HSV图像的内置函数:cvtColor(obrazeczek1、obrazeczek1、CV_BGR2HSV)但我尝试在没有此函数的情况下执行此操作。例如,要使用函数获取灰度图像,请执行以下操作:C++ 如何在c+中使用RGBtoHSV转换器功能后显示HSV图像+;?,c++,opencv,hsv,C++,Opencv,Hsv,晚上好,在互联网上我们可以找到很多将RGB像素值转换为HSV的算法,但我找不到显示它的函数。我正在使用MS Visual Studio 2013和openCV库。我知道有获取HSV图像的内置函数:cvtColor(obrazeczek1、obrazeczek1、CV_BGR2HSV)但我尝试在没有此函数的情况下执行此操作。例如,要使用函数获取灰度图像,请执行以下操作: #define NORMALIZE_RGB(x) \ (x > 255 ? 255 : (x < 0 ? 0
#define NORMALIZE_RGB(x) \
(x > 255 ? 255 : (x < 0 ? 0 : x))
cv::Mat rgb2grey(cv::Mat& I)
{
CV_Assert(I.depth() != sizeof(uchar));
cv::Mat res(I.rows, I.cols, CV_8UC3);
switch (I.channels()) {
case 3:
cv::Mat_<cv::Vec3b> _I = I;
cv::Mat_<cv::Vec3b> _R = res;
for (int i = 0; i < I.rows; ++i)
for (int j = 0; j < I.cols; ++j){
int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;
_I(i, j)[0] = NORMALIZE_RGB(grey);
_I(i, j)[1] = NORMALIZE_RGB(grey);
_I(i, j)[2] = NORMALIZE_RGB(grey);
}
res = _I;
break;
}
return res;
}
void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
{
v = max(max(r, g), b);
double t = min(min(r, g), b);
double delta = v - t;
if (v != 0.0)
s = delta / v;
else
s = 0.0;
if (s == 0.0)
h = 0.0;
else
{
if (r == v)
h = (g - b) / delta;
else
if (g == v)
h = 2.0 + (b - r) / delta;
else
if (b == v)
h = 4.0 + (r - g) / delta;
h = h * 60.0;
if (h < 0.0)
h += 360;
}
}
我在这里找到了一些建议。我知道如何将RGB像素转换为HSV,但如何使用imshow显示此矩阵?我也找到了功能rgb2hsv,但我不知道要改变什么,显示它。这是一个函数:
#define NORMALIZE_RGB(x) \
(x > 255 ? 255 : (x < 0 ? 0 : x))
cv::Mat rgb2grey(cv::Mat& I)
{
CV_Assert(I.depth() != sizeof(uchar));
cv::Mat res(I.rows, I.cols, CV_8UC3);
switch (I.channels()) {
case 3:
cv::Mat_<cv::Vec3b> _I = I;
cv::Mat_<cv::Vec3b> _R = res;
for (int i = 0; i < I.rows; ++i)
for (int j = 0; j < I.cols; ++j){
int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;
_I(i, j)[0] = NORMALIZE_RGB(grey);
_I(i, j)[1] = NORMALIZE_RGB(grey);
_I(i, j)[2] = NORMALIZE_RGB(grey);
}
res = _I;
break;
}
return res;
}
void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
{
v = max(max(r, g), b);
double t = min(min(r, g), b);
double delta = v - t;
if (v != 0.0)
s = delta / v;
else
s = 0.0;
if (s == 0.0)
h = 0.0;
else
{
if (r == v)
h = (g - b) / delta;
else
if (g == v)
h = 2.0 + (b - r) / delta;
else
if (b == v)
h = 4.0 + (r - g) / delta;
h = h * 60.0;
if (h < 0.0)
h += 360;
}
}
void rgb2hsv(双r、双g、双b、双h、双s、双v)
{
v=最大值(最大(r,g),b);
双t=min(min(r,g),b);
双三角=v-t;
如果(v!=0.0)
s=δ/v;
其他的
s=0.0;
如果(s==0.0)
h=0.0;
其他的
{
如果(r==v)
h=(g-b)/delta;
其他的
如果(g==v)
h=2.0+(b-r)/delta;
其他的
如果(b==v)
h=4.0+(r-g)/delta;
h=h*60.0;
if(h<0.0)
h+=360;
}
}
这里没有类似的问题,请提供帮助。使用imshow()显示已转换为HSV的图像没有意义
imshow()
认为,矩阵是按BGR顺序排列的。将图像转换为HSV只是将RGB值转换为HSV通道值
它是在3通道之前,转换后也是3通道,但其他值除外imshow()
仍希望将图像显示为RGB图像,但随后使用HSV值,这会导致图像无效
只需将其转换回RGB即可使imshow()
正确显示图像
编辑
Mat hsv, bgr; // hsv is the hsv image you want to display
cvtColor(hsv, bgr, CV_HSV2BGR);
imshow("lolz", bgr);
您对颜色空间转换有误解。在进行颜色空间转换时,您可能希望图像在视觉上看起来会有所不同,但事实并非如此 图像仍将包含相同的信息,只是格式不同。就像以
.jpg
、.png
等形式存储图像文件一样,它们在语义上仍然是相同的图像。您不需要从jpg
转换为png
并再次查看它,因为您知道它看起来是一样的。二进制内容将不同,但语义内容完全相同
HSV、BGR、RGB、LAB只是同一图像的不同表示。无论使用什么颜色空间,图像看起来都是一样的。
OpenCV希望imshow()
将提供BGR
颜色空间,因此您需要在显示之前将任何图像转换为BGR
您已经有了BGR
图像,因此不需要将其转换为HSV
来显示它
只有当您将图像转换为灰度时,图像才会真正改变。当你丢失一些信息时,图像会看起来不一样
如果您使用imshow()
显示HSV图像,它将向您显示一个无效图像,您可能会将其解释为有用或酷的东西。但事实并非如此。它就像一个美丽的虫子,你认为它是一个功能
因此,只需显示BGR图像,它与HSV具有相同的语义内容。您的媒体或图形控制器是什么?许多图形控制器没有直接支持HSV的API。您正在发送到彩色打印机吗?我在主板上只内置了图形卡(Intel HD3000),但如果我使用此内置函数CV_BGR2HSV,我会看到彩色RGB和HSV之间的差异。您可能需要在显示之前将HSV更改转换回RGB。计算机显示器,以及驱动它们的视频电路和驱动程序,只在RGB工作。有一些视频格式是用YUV表示的,但即使是这些格式也必须转换成RGB。我的问题是:我有RGB图像,可以访问r、g、b通道,我使用公式将r、g、b通道更改为h、s、v,我的矩阵值为“190、0.92、0.87”如果我在这个矩阵中使用imshow函数,它会在HSV模型中显示图像吗?