简体   繁体   English

OpenCv反转:将BGR转换为HSV,然后再返回BGR-我是否应该获得相同的图像?

[英]OpenCv inversion: BGR to HSV then back to BGR - shouldn't I get the same image?

For example, when I run this: 例如,当我运行此命令时:

import cv2
import numpy as np
from collections import Counter

# load image, calculate some basic stats
path = 'path/to/my/image.png'
bgr_img = cv2.imread(path)
h, w, c = bgr_img.shape
print("There are %d entries in this %d channel image" % (h*w*c, c))

# convert and then invert, we should get the same image
bgr_img2 = cv2.cvtColor(cv2.cvtColor(bgr_img, cv2.COLOR_BGR2HSV), cv2.COLOR_HSV2BGR)
print("all entries match: %s" % np.all(bgr_img == bgr_img2))

# hmm, we don't. let's see where the differences are
mismatches = np.where(bgr_img != bgr_img2)
print("there are %d mismatched entries" % len(mismatches[0]))
print("mismatches are along the following channels: %s" % Counter(mismatches[2]))

# ok, clearly lots of them. maybe they're all just off by 1 or 2?
mm = zip(mismatches[0], mismatches[1], mismatches[2])
differences = []
for x, y, c in mm:
    diff = bgr_img[x, y, c] - bgr_img2[x, y, c]
    differences.append(diff)

print(differences)

I get the following output: 我得到以下输出:

There are 1228800 entries in this 3 channel image
all entries match: False
there are 524511 mismatched entries
mismatches are along the following channels: Counter({1: 270572, 0: 253939})
[1, 1, 1, 254, 1, 254, 1, 3, 1, 3, 1, 3, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 1, 3, 1, 3, 1, 3, 1, 254, 1, 254, 254, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, ...]

I see a couple possibilities. 我看到了几种可能性。 First is that BGR -> HSV conversion isn't strictly invertible. 首先是BGR-> HSV转换不是严格可逆的。 Other is that I'm using OpenCV incorrectly. 其他是我使用的OpenCV不正确。 Which is it? 哪有

You should get pretty much the same image, but not, except in edge cases, identical bits. 您应该获得几乎相同的图像,但除了边缘情况外,不会获得相同的位。 BGR to HSV (and back) involve a transformation between spaces that don't have identical representations for all values in the other space. 从BGR到HSV(以及向后)涉及到空间之间的转换,这些空间对于其他空间中的所有值没有相同的表示形式。 Small rounding errors will creep in. 小数舍入误差将蔓延。

See the note in https://docs.opencv.org/3.4/df/d9d/tutorial_py_colorspaces.html about the Hue range being [0, 179]. 请参阅https://docs.opencv.org/3.4/df/d9d/tutorial_py_colorspaces.html中有关色调范围[0,179]的注释。 If you think about it, that implies information loss when converting from BGR (or RGB). 如果您考虑一下,这意味着从BGR(或RGB)转换时会丢失信息。 You can't get those bits back reliably. 您无法可靠地收回这些位。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM