【问题标题】:Dark pieces in brightened HSV image亮化 HSV 图像中的暗片
【发布时间】:2021-02-21 19:11:55
【问题描述】:

我想要使图像更亮。所以我只是将它转换为 HSV 并将 V 值乘以我需要的系数。但是输出图像中有暗块。
原图:

出图:

代码:

import cv2
import numpy as np


real_4 = cv2.imread('data/data_4_real_cut.jpg')
k = 5

cv2.imshow('orig 4', real_4)
hsv_4 = cv2.cvtColor(real_4, cv2.COLOR_BGR2HSV)
hsv_4[:, :, 2] *= k
bgr_again = cv2.cvtColor(hsv_4, cv2.COLOR_HSV2BGR)
cv2.imshow('orig 4 high', bgr_again)

cv2.waitKey(0)

据我了解,当我将 V 值乘以所需系数时,它可能超出 0 - 255 范围。但我不确定它,我没有找到任何关于它的信息。当然,问题是 - 为什么图像中有暗块?谢谢!

【问题讨论】:

  • 您需要裁剪这些值。当你相乘时,它可以超出 V 或 S 中的 0-255,这会导致回绕,使 256 变为 0,等等。所以使用 .clip(0,255) 剪辑你的值

标签: python opencv hsv


【解决方案1】:

图像中的值存储为数据类型np.uint8,它只能存储无符号的 8 位整数 (0-255)。当乘法的结果超过 255 时,值将overflow 变为actual_result % 256,例如:np.uint8(266) == (266 % 256) == 10。为防止溢出,需要将结果裁剪为最大值 255,为此您可以使用cv2.multiply 方法:

import cv2

from skimage.io import imread

rgb = imread("https://i.stack.imgur.com/2tcDv.jpg")
bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)

k = 5

hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
# safe multiplication without overflow
hsv[..., 2] = cv2.multiply(hsv[..., 2], k)

bgr_again = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow("orig 4 high", bgr_again)

cv2.waitKey(0)

这将给出正确的输出结果:

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多