Я реализовал функцию bgr2hsv, получая доступ к пикселям с помощью OpenCV, C ++.
Я только что написал это с помощью алгоритма 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);
И результаты здесь.
введите описание изображения здесь
Я бы не советовал брать что-то из Интернета и ожидать, что это даст вам правильный результат, если вы не понимаете, что происходит. Вместо того, чтобы использовать это, почему бы просто не использовать формула из документов OpenCV?
Для примера этого конкретного преобразования, см. Мой ответ Вот. Он использует точную формулу, упомянутую OpenCV в документах, связанных выше, для преобразования BGR в HSV. Это на Python, а не на C ++, но Python в любом случае довольно легко читать.
Других решений пока нет …