如何解决如何使用 L*a*b* 色彩空间操纵图像的亮度?
我正在尝试更改 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,anchor="nw",image = photo)
原图:
已编辑的图片:
解决方法
您正在向现有的 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
----------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。