自制bgr2hsv和opencv bgr2hsv结果不同
Different results between self-made bgr2hsv and opencv bgr2hsv
我通过使用 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
我不建议从互联网上抓取一些东西并期望它能给你正确的结果,除非你明白发生了什么。不用这个,为什么不直接用 the formula from the OpenCV docs?
有关此特定转换的示例,请参阅我的回答 。它使用 OpenCV 在上面链接的文档中提到的用于 BGR 到 HSV 转换的确切公式。它在 Python 而不是 C++ 中,但是 Python 无论如何都相当容易阅读。
我通过使用 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
我不建议从互联网上抓取一些东西并期望它能给你正确的结果,除非你明白发生了什么。不用这个,为什么不直接用 the formula from the OpenCV docs?
有关此特定转换的示例,请参阅我的回答