RGB图像中给定区域是否为灰度图的判定

前言

一个简单的灰度图判定方法,因为项目需要需要做一个简单的灰度图判断,当然,如果是完整的一幅图,判断是否是灰度,当然是直接进行通道判断就行了,灰度图的通道数为一,rgb图片的通道数为三。问题是如何判断一个rgb图片中其中一部分是否是灰度图,故而有了本次简单的文档说明。

方法一:

灰度图的定义中,有RGB三个通道是相等的则是灰度图,即R=G=B,值的大小体现了灰度的大小,即从白到黑。然而仅仅根据RGB图像下,三通道值是否相等是无法进行区块是否为灰度图的。因为,就算不等值,差异不大的情况,在人眼看来其实也是灰度图,只能说并非是完全的灰度图。故给出的第一种判定方式是:计算像素点的,rgb均值,获取其三通道与均值的差异,以这个差值作为灰度图与否的判定标准:原理如下

(\overline x) = (r+g+b)/3
result= \sum(|r-(\overline x)|+|g-(\overline x)|+|b-(\overline x)|)

python代码如下:

def checkGray(chip):
    chip_gray = cv2.cvtColor(chip,cv2.COLOR_BGR2GRAY)
    r,g,b = cv2.split(chip)
    r = r.astype(np.float32)
    g = g.astype(np.float32)
    b = b.astype(np.float32)
    s_w, s_h = r.shape[:2]
    x = (r+b+g)/3
    # x = chip_gray
    r_gray = abs(r-x)
    g_gray = abs(g-x)
    b_gray=  abs(b-x)
    r_sum = np.sum(r_gray)/(s_w * s_h)
    g_sum = np.sum(g_gray)/(s_w * s_h)
    b_sum = np.sum(b_gray)/(s_w * s_h)
    gray_degree = (r_sum+g_sum+b_sum)/3
    if gray_degree <10:
        print "Gray"
    else:
        print "NOT Gray"

方法二:

通过使用HSV颜色空间中的S通道进行判断。为此,要将rgb模式转换为hsb模式再去判断,其中:h色相,s饱和度,b对比度。
转换为hsb后,判断饱和度,如果s<10%即可认为是灰度图,至于这个阈值是10%还是15%,需要根据实际情况来做判断;

python 代码如下

def checkGray(chip):
    img_hsv = cv2.cvtColor(chip, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(img_hsv)
    s_w, s_h = s.shape[:2]
    s_sum = np.sum(s) / (s_w * s_h)
    if s_sum>10:
        pass

ps:

实际在测试中,这种在一个RGB图片中,区分其中一小块是否是灰度图,上述的两种方法在一定程度上是可行的,但是,请注意但是,实际上这种方式一方面对于摄像头的要求比较高,并非性能越好的摄像头表现结果越好,在我进行实际测试中,我自己性能好的摄像头反而表现结果很差,没有什么区分度,反而是在一些另类摄像头表现效果较好,区分度较为明显。

本文转自:CSDN - Binbin_Sun,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:https://blog.csdn.net/Binbin_Sun/article/details/80765425

最新文章