【问题标题】:How to manipulate the brightness of an image using L*a*b* color space?如何使用 L*a*b* 颜色空间控制图像的亮度?
【发布时间】:2021-02-01 10:54:06
【问题描述】:

我正在尝试更改 L*a*b* 色彩空间中图像的 L* 值。但最终的图像不是我所期望的。我应该如何使用L*a*b* 值更改图像的亮度?

我的代码:

imd = np.asarray(ibuffer).copy()
imgb = cv2.cvtColor(imd, cv2.COLOR_BGR2Lab)
value = 255 * (int(bvalue)/100)
imgb[:,:,0] += int(value)
imgb = cv2.cvtColor(imgb,cv2.COLOR_LAB2BGR)
photo = Image.fromarray(imgb)
photo = resize(photo)
photo = ImageTk.PhotoImage(photo)
canvas.photo = photo
canvas.create_image(0,0,anchor="nw",image = photo) 

原图:

修改后的图片:

【问题讨论】:

    标签: python opencv image-processing brightness lab-color-space


    【解决方案1】:

    您正在向已经存在的 L* 值添加一些值,这将导致整数溢出,从而导致意外行为。你真正想要的——至少,据我的理解——是在原始L* 值的 0% 到 100% 之间进行缩放,所以是这样的:

    因此,只需将原始 L* 值乘以您输入的百分比(完整代码重现上述输出):

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img = cv2.imread('path/to/your/image.png')
    img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)
    
    plt.figure(0, figsize=(18, 9))
    for i, a in enumerate([0, 20, 40, 60, 80, 100]):
        img_mod = img_lab.copy()
        img_mod[:, :, 0] = (a/100 * img_mod[:, :, 0]).astype(np.uint8)
        img_mod = cv2.cvtColor(img_mod, cv2.COLOR_Lab2BGR)
        plt.subplot(2, 3, i+1)
        plt.imshow(img_mod[:, :, [2, 1, 0]])
        plt.title('L = {}'.format(a))
    plt.tight_layout()
    plt.show()
    
    ----------------------------------------
    System information
    ----------------------------------------
    Platform:      Windows-10-10.0.16299-SP0
    Python:        3.8.5
    Matplotlib:    3.3.3
    NumPy:         1.19.5
    OpenCV:        4.5.1
    ----------------------------------------
    

    【讨论】:

      猜你喜欢
      • 2017-07-16
      • 2015-01-30
      • 2012-06-18
      • 2015-04-29
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2018-03-29
      • 2019-03-16
      相关资源
      最近更新 更多