前言
一个简单的灰度图判定方法,因为项目需要需要做一个简单的灰度图判断,当然,如果是完整的一幅图,判断是否是灰度,当然是直接进行通道判断就行了,灰度图的通道数为一,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