大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:
上边左侧图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。
左侧图片是有色差的图片拍摄的标准色卡图片,右侧是标准色卡的正常图片,其实我们只要拿到两张色卡的颜色转换关系就可以解决这个问题了。
当然,我们的第一张色卡有些畸变,最好做一个校正,我这里为了演示效果没有做这方面的处理。但白平衡是必须的:
### 白平衡演示代码:defimage_balance(imagefile):
src=cv2.imread(imagefile)
src_copy=src.copy()
b,g, r = cv2.split(src)
r_avg=cv2.mean(r)[0]
g_avg=cv2.mean(g)[0]
b_avg=cv2.mean(b)[0]
# 求各个通道所占增益
k=(r_avg + g_avg + b_avg) / 3
kr=k / r_avg
kg=k / g_avg
kb=k / b_avg
r=cv2.addWeighted(src1=r, alpha=kr, src2=0, beta=0, gamma=0)
g=cv2.addWeighted(src1=g, alpha=kg, src2=0, beta=0, gamma=0)
b=cv2.addWeighted(src1=b, alpha=kb, src2=0, beta=0, gamma=0)
balance_img=cv2.merge([b, g, r])
imgs=np.hstack([src_copy, balance_img])
cv2.namedWindow("imgs",0)
cv2.imshow("imgs",imgs)
cv2.waitKey(0)defimage_balance_v2(imagefile):
src=cv2.imread(imagefile)
src_copy=src.copy()
final=cv2.cvtColor(src,cv2.COLOR_BGR2LAB)
avg_a=np.average(final[:, :, 1])
avg_b=np.average(final[:, :, 2])
forx in range(final.shape[0]):
fory in range(final.shape[1]):
l,a,b=final[x,y,:]
l*=100/255.0
final[x,y, 1] = a - ((avg_a - 128)*(l/100)*1.1)
final[x,y, 2] = b - ((avg_b - 128) * (l / 100) * 1.1)
final=cv2.cvtColor(final,cv2.COLOR_LAB2BGR)
imgs=np.hstack([src_copy, final])
cv2.namedWindow("imgs",0)
cv2.imshow("imgs",imgs)
cv2.waitKey(0)
最后我选择完美反射算法进行白平衡处理。再接下来就是对两张色卡图片进行拟合,获得转换系数,这个很简单就不具体说了,拟合效果如下:
最终颜色校正效果:左侧是原始图像,右侧是经颜色校正后的图像。
示例1:
示例2:
示例3: