1 简介
在中医智能舌诊项目中,用户使用移动设备采集图片。不同采集设备获取的图像像素差异非常大,并且用户采集图像时所处的环境并不固定,因此用户舌象图片的光照强度很有可能不能达到中e诊舌象数据库中舌象图片统一的光照强度。若是如此,用户进行舌象诊断的结果准确性将会大打折扣。因此,在舌象诊断前进行亮度自动调节是非常有必要的。
2 实现细节
本小组利用伽马校正(Gamma Correction)进行舌象图片亮度的自动校正。伽马校正又叫伽马非线性化或伽马编码,是用来针对影片或是影响系统里对于光线的辉度或是三色刺激值所进行的非线性的运算或反运算。具体公式讲解与示意图如下:
(1)当γ<1时,在低灰度值区域内,动态范围变大,进而图像对比度增强;在高灰度值区域内,动态范围变小,图像对比度降低。
(2)γ>1时,低灰度值区域的动态范围变小,高灰度值区域在动态范围变大,降低了低灰度值区域对比度,提高了高灰度值区域图像对比度。同时,图像整体的灰度值变小。
在代码中首先将图像的所有像素值进行归一化,后进行预补偿处理,即根据公式求出像素归一化后的数据以1/gamma为指数的对应值。最后进行反归一化处理,将预补偿的数值反变换为0~255之间的整数值。
本小组利用Python中的opencv库对舌象图片进行处理并编写算法代码实现舌象图片自适应亮度校正功能。功能实现效果如下图所示:
3 代码
import cv2 import numpy as np import math def gamma_trans(img, gamma): # gamma函数处理 gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)] # 建立映射表 gamma_table = np.round(np.array(gamma_table)).astype(np.uint8) # 颜色值为整数 return cv2.LUT(img, gamma_table) # 图片颜色查表。另外可以根据光强(颜色)均匀化原则设计自适应算法。 def nothing(x): pass file_path = r"E:\ITEM_TIME\project\Tongue\JPEGImages\637.jpg" img_gray=cv2.imread(file_path,0) # 灰度图读取,用于计算gamma值 img = cv2.imread(file_path) # 原图读取 mean = np.mean(img_gray) gamma_val = math.log10(0.5)/math.log10(mean/255) # 公式计算gamma image_gamma_correct = gamma_trans(img, gamma_val) # gamma变换 # print(mean,np.mean(image_gamma_correct)) cv2.imwrite(r'C:\Users\13267\Desktop\test.jpg',img) #cv2.imshow('image_raw', img) #cv2.imshow('image_gamma', image_gamma_correct) #cv2.waitKey(0)