python實現黑白圖、灰度圖識別(也可以識別微博、微信截圖、表情包、圖表、文字圖片等)


【版權所有,轉載請注明出處。出處:https://www.cnblogs.com/zwq-zju/p/9721613.html

基本原理

灰度圖分兩種情況:

  • 單通道的圖片
  • RGB 三通道的圖片,但是每個通道的值相等

對於單通道的圖片只需要判斷圖片的通道值是否為1

對於RGB模式的圖片,情況稍稍復雜些。理論上只需判斷RGB三個通道的值是否相等,但是現實中灰度圖常常各通道間存在輕微差異,但是人眼難以察覺,依舊可以認為是灰度圖。所以現實中,應該判斷三個通道間的差異大小比較合理。
這里采取的策略是計算三個通道間像素值的差的方差的均值,小於一定閾值的就判斷為灰度圖。

實現

下面用python做個示例:
只需要用到 PIL 和 numpy

代碼:

# 黑白照片(灰度圖)識別
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

測試

更多被判斷為灰度圖的例子:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM