#以下為教學程式,因為是黑狗,採用Lab或HSV色彩空間equalize效果不好,顏色嚴重失真,用RGB各channel equalize效果還可以。使用了opencv的calcHist, split, equalizeHist, merge 以及 numpy的簡易統計函數與matplotlib.pyplot並自訂函數。
opencv秀圖
- import cv2
- import numpy as np
- import matplotlib.pyplot as plt
用split分割channel
- im=cv2.imread('shiba_inu.jpg')
- cv2.imshow('original',im)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
計算不同色階的統計量,用numpy
- BGR=cv2.split(im)
- color=('b','g','r')
處理與計算histogram,如果參數equalized==True就各色階equalizeHist
- def print_sta(i):
- #都使用numpy的簡易統計函數
- print('==========\n',color[i],': min=', np.min(BGR[i]),',max=', np.max(BGR[i]),'\n')
- print('mean=', np.mean(BGR[i]),',median=', np.median(BGR[i]), ', std=', np.std(BGR[i]),'\n')
再來就是要呼叫histogram(),各色階equalizeHist後的BGR重新merge
- def histogram(equalized=False):
- for i in range(3):
- if equalized==True:
- BGR[i]=cv2.equalizeHist(BGR[i])
- print_sta(i)
- # 計算直方圖每個 bin 的數值
- hist = cv2.calcHist(BGR, [i], None, [256], [0, 256])
- plt.plot(hist, color = color[i])
- plt.xlim([0, 256])
- plt.show()
在函數histogram採用opencv的calcHist(這就針對圖的channel資料),用numpy的histogram改寫看看使用廣!
- histogram()
- histogram(True)
- im2=cv2.merge(BGR)
沒有留言:
張貼留言