from PIL import Image import matplotlib.pyplot as plt # 黑白照片(灰度圖)識別 def isGrayMap(img, threshold = 15): """ 入參: img:PIL讀入的圖像 threshold:判斷閾值,圖片3個通道間差的方差均值小於閾值則判斷為灰度圖。 閾值設置的越小,容忍出現彩色面積越小;設置的越大,那么就可以容忍出現一定面積的彩色,例如微博截圖。 如果閾值設置的過小,某些灰度圖片會被漏檢,這是因為某些黑白照片存在偏色,例如發黃的黑白老照片、 噪聲干擾導致灰度圖不同通道間值出現偏差(理論上真正的灰度圖是RGB三個通道的值完全相等或者只有一個通道, 然而實際上各通道間像素值略微有偏差看起來仍是灰度圖) 出參: bool值 """ if len(img.getbands()) == 1: return True img1 = np.asarray(img.getchannel(channel=0), dtype=np.int16) img2 = np.asarray(img.getchannel(channel=1), dtype=np.int16) img3 = np.asarray(img.getchannel(channel=2), dtype=np.int16) diff1 = (img1 - img2).var() diff2 = (img2 - img3).var() diff3 = (img3 - img1).var() diff_sum = (diff1 + diff2 + diff3) / 3.0 if diff_sum <= threshold: return True else: return False