影象處理六:預處理方法
阿新 • • 發佈:2018-12-10
一、標準化處理與歸一化
對影象做資料預處理,最常見的對影象預處理方法有兩種:
(1)白化處理(影象標準化處理);
影象標準化是將資料通過去均值實現中心化的處理,根據凸優化理論與資料概率分佈相關知識,資料中心化符合資料分佈規律,更容易取得訓練之後的泛化效果,資料標準化是資料預處理的常見方法之一。
(2)歸一化處理。
歸一化不會改變影象本身的資訊儲存,取值範圍從0~255已經轉化為0~1之間。
原始碼:
import numpy as np import cv2 pic_path = 'F:/a.jpg' def normalization(input): pic = cv2.imread(input) pic = pic.astype(np.float32) # zero-center pic -= [np.mean(pic[..., 0]), np.mean(pic[..., 1]), np.mean(pic[..., 2])] # normalize pic /= [np.std(pic[..., 0]), np.std(pic[..., 1]), np.std(pic[..., 2])] print(pic[..., 0]) pic *= (pic>0) pic *= 100 pic = pic * (pic<=255) + 255 * (pic>255) pic = pic.astype(np.uint8) print(pic[..., 0]) #cv2.imshow('', pic) cv2.imwrite('F:/b.jpg',pic) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': # 均值0中心化(zero-center), 規範化(normalize) normalization(pic_path)
二、直方圖與均衡化
直方圖在影象處理中非常重要,利用影象直方圖對對比度進行調整的方法。
基本思想:把原始圖的直方圖變換為均勻分佈的形式,這樣就增加了畫素灰度值的動態範圍,從而達到增強影象整體對比度的效果。
1. skimage
skimage.exposure.histogram(image, nbins=256)
skimage程式自帶了一些示例圖片:
2. 繪製直方圖
import numpy as np from skimage import exposure,data #image = skimage.io.imread('F:/a.jpg') image =data.camera()*1.0 hist1=np.histogram(image, bins=2) #用numpy包計算直方圖 hist2=exposure.histogram(image, nbins=2) #用skimage計算直方圖 print(hist1) print(hist2) from skimage import data import matplotlib.pyplot as plt img=data.camera() plt.figure("hist") arr=img.flatten() n, bins, patches = plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') plt.show() from skimage import data import matplotlib.pyplot as plt img=data.chelsea() ar=img[:,:,0].flatten() plt.hist(ar, bins=256, normed=1,facecolor='r',edgecolor='r',hold=1) ag=img[:,:,1].flatten() plt.hist(ag, bins=256, normed=1, facecolor='g',edgecolor='g',hold=1) ab=img[:,:,2].flatten() plt.hist(ab, bins=256, normed=1, facecolor='b',edgecolor='b') plt.show()
3. 直方圖均衡化
from skimage import data,exposure import matplotlib.pyplot as plt import skimage.io #img=data.chelsea() img = skimage.io.imread('F:/a.jpg') plt.figure("hist",figsize=(8,8)) arr=img.flatten() plt.subplot(221) plt.imshow(img,plt.cm.gray) #原始影象 plt.subplot(222) plt.hist(arr, bins=256, normed=1,edgecolor='None',facecolor='red') #原始影象直方圖 img1=exposure.equalize_hist(img) arr1=img1.flatten() plt.subplot(223) plt.imshow(img1,plt.cm.gray) #均衡化影象 plt.subplot(224) plt.hist(arr1, bins=256, normed=1,edgecolor='None',facecolor='red') #均衡化直方圖 plt.show()