如何使用 L*a*b* 颜色空间操纵图像的亮度?

Kri*_*ish 1 python opencv image-processing brightness lab-color-space

我正在尝试更改颜色空间L*中图像的值L*a*b*。但最终的图像并不是我所期望的。我应该如何使用这些值更改图像的亮度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) 
Run Code Online (Sandbox Code Playgroud)

原图:

原图

编辑后的图像:

编辑图片

Han*_*rse 5

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

\n

输出

\n

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

\n
import cv2\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nimg = cv2.imread(\'path/to/your/image.png\')\nimg_lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)\n\nplt.figure(0, figsize=(18, 9))\nfor i, a in enumerate([0, 20, 40, 60, 80, 100]):\n    img_mod = img_lab.copy()\n    img_mod[:, :, 0] = (a/100 * img_mod[:, :, 0]).astype(np.uint8)\n    img_mod = cv2.cvtColor(img_mod, cv2.COLOR_Lab2BGR)\n    plt.subplot(2, 3, i+1)\n    plt.imshow(img_mod[:, :, [2, 1, 0]])\n    plt.title(\'L = {}\'.format(a))\nplt.tight_layout()\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n
----------------------------------------\nSystem information\n----------------------------------------\nPlatform:      Windows-10-10.0.16299-SP0\nPython:        3.8.5\nMatplotlib:    3.3.3\nNumPy:         1.19.5\nOpenCV:        4.5.1\n----------------------------------------\n
Run Code Online (Sandbox Code Playgroud)\n