【问题标题】:NumPy convert 8-bit to 16/32-bit imageNumPy 将 8 位图像转换为 16/32 位图像
【发布时间】:2014-08-18 02:55:11
【问题描述】:

我正在使用 OpenCV 2 在 YCbCr 颜色空间中进行一些图像处理。目前我可以检测到由于转换 RGB -> YCbCr 然后是 YCbCr -> RGB 而产生的一些噪音,但正如 documentation 中所说:

如果对 8 位图像使用 cvtColor,转换会丢失一些信息。对于许多应用程序来说,这并不明显,但建议在需要全范围颜色或在操作前转换图像然后再转换回来的应用程序中使用 32 位图像。

所以我想将我的图像转换为 16 位或 32 位,但我没有找到如何使用 NumPy 进行转换。一些想法?

img = cv2.imread(imgNameIn)
# Here I want to convert img in 32 bits
cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB, img)
# Some image processing ...
cv2.cvtColor(img, cv2.COLOR_YCR_CB2BGR, img)
cv2.imwrite(imgNameOut, img, [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 0])

【问题讨论】:

  • 如果解决了您的问题,请将其写为答案并接受,以便将其标记为“已解决”。
  • 对不起,我没有看到任何接受答案并将问题标记为已解决的按钮,我该怎么办?
  • @user3263033 您需要发布您的问题的答案,然后单击您的答案旁边的勾号以接受它

标签: python opencv image-processing numpy


【解决方案1】:

感谢@moarningsun,问题已解决:

i = cv2.imread(imgNameIn, cv2.CV_LOAD_IMAGE_COLOR) # Need to be sure to have a 8-bit input
img = np.array(i, dtype=np.uint16) # This line only change the type, not values
img *= 256 # Now we get the good values in 16 bit format

【讨论】:

    【解决方案2】:

    接受的答案不准确。 16 位图像具有 65536 个强度级别 (2^16),因此,值范围从 065535

    如果想要从表示为float 数组(范围从0 到1)的图像中获得16 位图像,则必须将该数组的每个系数乘以65535

    此外,最好将最终结果的类型转换为执行操作的最后一步。 这主要有两个原因: - 如果您通过float 执行除法或乘法,结果将返回float,您需要再次更改类型。 - 一般而言(在术语的数学意义上),从浮点数到整数的转换会引入错误。在操作的最后进行类型转换可以防止错误传播。

    【讨论】:

    • "result f a multiplication ... 通常返回 float` -- 请您提供一些关于这种情况的演示?
    • @DanMašek 我的意思是数学意义上的“一般”——至少一次。我以更清晰的方式重写了我的想法。感谢您指出我的回答令人困惑。
    • 您也可以使用cv2.normalize(img, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX) 获取正确的 16 位值
    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多