我通过使用OpenCV,C ++访问像素来实现bgr2hsv函数。
我只是用互联网上的bgr2hsv算法编写它。
我将bgr2hsv()
与cvtColor()
结果进行了比较。
实际上,即使原始图像相同,结果图像也会有一些不同的颜色。我试图看到为什么不同,但我无法找到它。 你能看到源代码和结果图片吗? 这是代码。
//self-made bgr2hsv
double b, g, r;
double bb, gg, rr;
double tmax, tmin;
double h = 0, s = 0, v = 0;
double del, delB, delG, delR;
Mat image = imread("lena.jpg", 1);
Mat clone1 = image.clone();
Mat img;
image.convertTo(img, CV_64F);
for (int y = 0; y < img.rows; y++)
{
for (int x = 0; x < img.cols; x++)
{
b = image.at<Vec3b>(y, x)[0];
g = image.at<Vec3b>(y, x)[1];
r = image.at<Vec3b>(y, x)[2];
bb = b / 255;
gg = g / 255;
rr = r / 255;
tmax = _max(bb, gg, rr);
tmin = _min(bb, gg, rr);
v = tmax;
del = tmax - tmin;
if (del == 0) {
h = 0;
s = 0;
}
else {
s = del / tmax;
delB = ((tmax - b) / 6 + del / 2) / del;
delG = ((tmax - g) / 6 + del / 2) / del;
delR = ((tmax - r) / 6 + del / 2) / del;
if (b == tmax) {
h = (2 / 3) + delG - delR;
}
if (g == tmax) {
h = (1 / 3) + delR - delB;
}
if (r == tmax) {
h = delB - delG;
}
if (h < 0) h += 1;
if (h > 1) h -= 1;
}
img.at<Vec3d>(y, x)[0] = h;
img.at<Vec3d>(y, x)[1] = s;
img.at<Vec3d>(y, x)[2] = v;
}
}
//bgr2hsv with cvtColor
cvtColor(image,clone1,CV_BGR2HSV);
imwrite("implemented_hsv.jpg",clone1);
imwrite("bgr2hsv.jpg", img);
//show images
imshow("bgr2hsv", img);
imshow("implemented_hsv",clone1);
waitKey(0);
结果就在这里。 enter image description here
答案 0 :(得分:3)
我不建议从互联网上抓东西并期望它能给你正确的结果,除非你明白发生了什么。为什么不使用the formula from the OpenCV docs?
,而不是使用它有关此特定转换的示例,请参阅我的回答here。它使用上面链接的文档中的OpenCV提及的确切公式,用于BGR到HSV的转换。它是Python而不是C ++,但无论如何Python都相当容易阅读。