Python - OpenCV 图像灰度识别

本片文章将介绍一下基于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值也比较小,对于有类似需求的,可以采用该方法

    有问题可以留言评论,下篇文章将介绍图片二值化方法~

     

 

你可能感兴趣的:(图像识别,opencv,计算机视觉,python,算法)