本片文章将介绍一下基于opencv的图像灰度识别,主要介绍三通道的彩色图片的灰度识别,单通道图片无需判断。
对图片进行灰度识别我们要先明白一个基础知识,理论上讲,一张真正的灰度图应该是单通道或者RGB三通道值相等的,因此我们可以根据通道数或者像素RGB三通道值差异来判断。
接下来我们来介绍两种计算灰度值的方法。
方法一
def calculate_gray_value(img):
# 分割RGB通道
r, g, b = cv2.split(img)
# 转换成数组
r1 = np.asarray(r, np.int16)
g1 = np.asarray(g, np.int16)
b1 = np.asarray(b, np.int16)
# 令一种转换方式
# r = r.astype(np.int16)
# g = g.astype(np.int16)
# b = b.astype(np.int16)
# 计算各通道之间的方差
diff1 = (r1 - g1).var()
diff2 = (g1 - b1).var()
diff3 = (b1 - r1).var()
diff_sum = (diff1 + diff2 + diff3) / 3.0
return diff_num
该方法通过计算3个通道间差的方差来返回计算的灰度值,diff_num越小,图像越接近灰度图像,通过判断diff_num值我们可以得出图像是不是一个灰度图像,一张真正的灰度图,计算出来的diff_num值应该为0,但是在实际应用上来看,我们所获取到的一些图片多多少少会有一些色差,比如黑白照片发黄、扫描图片背景有略微变换等,通过测试发现该方法计算出来的diff_num设置在10~15以下,可以较为准确的识别出灰度图。
方法二
def calculate_gray_value(img):
# 分割RGB通道
r, g, b = cv2.split(img)
# 转换成数组
r = r.astype(np.int16)
g = g.astype(np.int16)
b = b.astype(np.int16)
# 计算
s_w, s_h = r.shape[:2]
x = (r + b + g) / 3
area_s = s_w * s_h
r_gray = abs(r - x)
g_gray = abs(g - x)
b_gray = abs(b - x)
r_sum = np.sum(r_gray) / area_s
g_sum = np.sum(g_gray) / area_s
b_sum = np.sum(b_gray) / area_s
diff_num = (r_sum + g_sum + b_sum) / 3
方法二与方法一原理类似,diff_num越小,图像越接近灰度图像,但是该方法对于灰色图像中的彩色区块不是很敏感,彩色区块面积较小的时候,diff_num值也比较小,对于有类似需求的,可以采用该方法
有问题可以留言评论,下篇文章将介绍图片二值化方法~