1. 程式人生 > >影象處理六:預處理方法

影象處理六:預處理方法

一、標準化處理與歸一化

        對影象做資料預處理,最常見的對影象預處理方法有兩種:

(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(imagenbins=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()