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)
原图:
编辑后的图像:
您正在向已有的L*
值添加一些值,这将导致整数溢出,从而导致意外的行为。根据我的理解,你真正想要的 \xe2\x80\x93 至少是在原始值的 0 % \xe2\x80\x93 100 % 之间进行缩放L*
,所以像这样:
因此,只需将原始L*
值乘以您输入的百分比(重现上述输出的完整代码):
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