我通过使用OpenCV,C++访问像素来实现OpenCV函数。我刚在互联网上用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);结果出来了。在这里输入图像描述
发布于 2017-07-20 07:31:57
我不会建议从互联网上抓取一些东西,并期望它能给你正确的结果,除非你了解发生了什么。为什么不直接使用OpenCV文档中的公式?
有关此特定转换的示例,请参见我的答案这里。它使用了OpenCV在上面链接的文档中提到的精确公式,用于BGR到HSV的转换。它是用Python而不是C++编写的,但是Python无论如何都很容易阅读。
https://stackoverflow.com/questions/45206400
复制相似问题