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

Android相机实时取色_计算机视觉

相机拍出有色差的色卡图像

Android相机实时取色_人工智能_02

色卡图标准图像

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

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

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

Android相机实时取色_图像处理_03

''''

### 白平衡演示代码: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) / 3kr=k / r_avgkg=k / g_avgkb=k / b_avgr=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.0final[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)

''''

Android相机实时取色_图像处理_04

Android相机实时取色_Android相机实时取色_05

最后我选择完美反射算法进行白平衡处理。再接下来就是对两张色卡图片进行拟合,获得转换系数,这个很简单就不具体说了,拟合效果如下:

Android相机实时取色_图像处理_06

#### 颜色校准方法测试:url_path ="https://img2.baidu.com/it/u=3233561313,355379518&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=375"src = url2img(url_path)image_color_correction(src)

下面看一下具体结果:

示例1:

Android相机实时取色_大数据_07

示例2:

Android相机实时取色_图像处理_08

示例3:

Android相机实时取色_大数据_09

今天就分享到这里, 我是paperClub。