什麼是直方圖呢?通過直方圖你可以對整幅圖像的灰度分布有一個整體的感覺了解。直方圖的 x 軸是灰度值(0 到 255),y軸是圖片中具有同一個灰度值的 點的數目。可以通過下面的圖像感受一下
直方圖是處理當中非常常用的一種手段,opencv也有現成的方法,cv2.calcHist
用法:cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
def show_hist(cv2_img):
""" 顯示直方圖 """
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([cv2_img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.legend()
plt.xlim([0,256])
plt.xticks([]), plt.yticks([])
plt.show()
通過直方圖我們可以觀察該直方圖了解需要如何調整亮度分布。下面的圖藍色分量在200 ~ 250較高,應該就是天空的顔色,因為對應亮度最大。
我們可以通過前幾章分享的知識,對應主題進行分離,看看亮度在3維空間的分布情況。
首先,我們需要獲得二值圖像:我們先用默認值進行二值圖效果:
gray = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2GRAY)
blur = cv2.blur(gray, (10, 10))
k=np.ones((10, 10),np.uint8)
_, th = cv2.threshold(blur, 127, 255, cv2.THRESH_OTSU)
原圖:
mask:
通過邏輯運算獲得圖像:
img = cv2.bitwise_and(cv2_img, cv2_img, mask=~open)
分離顔色通道, 獲得像素值:這裡采用切片來處理:
img_b = cv2_img[:, :, 0].astype(np.int16)
img_g = cv2_img[:, :, 1].astype(np.int16)
img_r = cv2_img[:, :, 2].astype(np.int16)
三維空間顯示
我們可以看到顔色較深的橙色部分就是主題。再來看一個例子:
通過這幾個例子,關于亮度的影響就很深刻了,這對我們後面使用灰度直方圖有很大幫助。
### 顯示3D圖像
def showPiexlDist(imgArrs):
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
h, w, pimg = piexlDifvalue(imgArrs)
x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
X, Y = np.meshgrid(x, y)
Z = np.zeros(Y.shape, dtype=np.uint16)
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Z[i][j] = img_sum[i][j]
ax1.plot_surface(X, Y, Z, rstride=1, cstride=1,cmap=plt.get_cmap('rainbow'))
plt.show()
好了,本次就分享到這裡。歡迎大家評論、交流和轉發。
,