最近在做一個用unet神經網絡識別種子出苗率的項目(種子賊小,分辨率還賊低),由於識別的效果不太好,只能對圖像做預處理了。。。預處理選用的是ps中的色階處理,可是cv2等圖像庫中沒有現成的函數,只能自己一點一點搜資料,找到了ps中色階調整的計算公式。
以下是ps中的色階窗口
左邊黑三角叫做黑場,中間叫做灰場,右邊叫做白場。上面的圖是分布直方圖,表示每個色階的數量,開始我天真的以為色階調整是把低於黑場的像素值設置為0,高於白場的設為255就行,后來這么寫出來后,發現事情並不簡單,根本不是想要的效果,然后又去各種搜博客,**終於**,我發現了一位老哥的博客:https://blog.csdn.net/maozefa/article/details/43971063
太感謝這位老哥了,大家有公式不懂的可以去看看。
根據他給的公式,我用python實現了一下:
''' 用於圖像預處理,模擬ps的色階調整 img:傳入的圖片 Highlight:白場(Shadow-255) Shadow:黑場(0-Highlight) 0 <= Shadow < Highlight <= 255 返回一張圖片 ''' def Whiite_Black_Level_Pretreatment(self, img, Shadow,Highlight): if Highlight > 255: Highlight = 255 if Shadow < 0: Shadow = 0 if Shadow >= Highlight: Shadow = Highlight - 2 # 轉類型 img = np.array(img, dtype=int) # 計算白場黑場離差 Diff = Highlight - Shadow # 計算系數 coe = 255.0 / Diff rgbDiff = img - Shadow rgbDiff = np.maximum(rgbDiff, 0) img = rgbDiff * coe # 四舍五入到整數 img = np.around(img, 0) # 變為int型 img = img.astype(int) return img
注意:我這里沒有關系到中間的灰場和輸出色階,我的灰場默認為1.0,如果需要用到灰場,需要實現這里:

效果:當黑場為81,白場為161時:
原圖:
處理后:
