# 計算窗口中每一行的像素值總和 以下直接使用此鳥瞰圖截圖做示範: ![](https://hackmd.io/_uploads/rkNyJ-6fT.png) 可以將此圖片下載下來並存成 0.png ## 將圖片直接做灰階化 因為上圖直接複製下來時是三通道(彩色圖片),所以 RGB 各有其值,我們直接做灰階化的用意就是將它變成單通道,等一下在觀察像素值總和時才不會有太多無關數字出現。 >使用套件 ```python= import cv2 import numpy as np ``` >讀取圖像並做灰階化與二值化 ```python= image = cv2.imread('0.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret2, image = cv2.threshold(gray, 0, 1,cv2.THRESH_BINARY + cv2.THRESH_OTSU) ``` ## 接下來繪製窗口 我們把目標聚焦在左下角的軌道線上,繪製一個窗口(與原程式相同) >創建窗口 ```python= window = {'x0': 0, 'y0': image.shape[0], 'width': image.shape[1] / 2, 'height': image.shape[0] / 3} mask_window = image[round(window['y0']-window['height']):round(window['y0']), round(window['x0']):round(window['x0']+window['width'])] ``` ## 計算垂直行的像素總和 >我們的目的是找到線的起始點,左邊的道路線起始點是垂直總和最大的那一條的索引值,所以要先有每一條的總和才能做判斷 ```python= histogram = np.sum(mask_window,axis=0) # print(histogram) ``` 可以嘗試 print出結果,發現看起來很不直觀,每一項數值都是垂直像素的總和,而白線就是出現數字的那排,共11組像素(x軸)組成的寬。 ![](https://hackmd.io/_uploads/ryO0CSCf6.png) ## 數據顯化 我們要讓數據便於觀看,並且讓陣列不要堆在一起,所以使用numpy的特殊顯示不換行來解決此問題。 >上述數值很難去判斷誰最大,我們統一縮小尺度,也就是同時除以255 ```python= histogram = histogram / 255.0 matrix = np.array(histogram) np.set_printoptions(threshold=np.inf, linewidth=np.inf, precision=2) print(matrix) ``` 最後輸出結果,很直觀的看到軌道線在圖中的細節,左右兩側都稍微淺了點,而往中間越深 也會發現數據為何是小數的原因在於同時縮放尺度。 ![](https://hackmd.io/_uploads/H1ggkIRfp.png) ppt-圖 ![](https://hackmd.io/_uploads/SJjGkWRMp.png) ## 找出起始點 為了找出左側線的起始點,使用 np.argmax 函式來找出第一個最大值的 index ```python= centroid = np.argmax(histogram) print(centroid) ``` 輸出索引值為 32,而我們就可以根據這一個點來當作下一個窗口的起始點繪製出軌道線 ![](https://hackmd.io/_uploads/HJmlBbaG6.png)