拍出来的图片有色彩偏差怎么办?图像颜色校正

大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:

上边左侧图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。

左侧图片是有色差的图片拍摄的标准色卡图片,右侧是标准色卡的正常图片,其实我们只要拿到两张色卡的颜色转换关系就可以解决这个问题了。

当然,我们的第一张色卡有些畸变,最好做一个校正,我这里为了演示效果没有做这方面的处理。但白平衡是必须的:

### 白平衡演示代码: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:


玫瑰再绽放
描写走的词语