Programming 2

Counting Pixels with Histograms

1.histogram:

(1) Computing the image histogram. (2) Equalize the image. (3) Applying Look-up Tables to Modify Image Appearance. 

2.使用 getHistogram 函式將影像的直方圖內容儲存在 histo 中並輸出文字,接著使用 getHistogramImage 函式產生直方圖。

3.在直方圖上畫一條垂直線,該線位於像素值為70的位置,目的是為了在視覺化直方圖時,更容易地看到直方圖中的峰值位置。line 函式中,第一個參數 hi 是直方圖所在的影像 image,第二個和第三個參數則是線的起點和終點,最後一個參數則是指定線的顏色,128即灰色。

4.接著將影像二值化,將影像中大於70的像素值設為255,小於或等於70的像素值設為0,產生一個二值化的影像 thresholded,並顯示。接著再將 thresholded 反相顯示,即將255的像素值變成0,0變成255,屬於反白的概念,並將其存為一個名為 "binary" 的 bmp 影像。

5.使用 equalize 函式對影像進行直方圖均衡化,將結果存放於 eq 中。

6.使用 stretch 函式,將影像進行對比度拉伸,並將結果存在 str。

7.建立一個 Look-up Table,實現反轉影像的效果,並使用 applyLookUp 顯示

結果分析:

getHistogram:可用來了解影像中像素值的分布狀況,並從中分析出一些資訊,例如影像的對比度、明暗程度等。

thresholded:可將影像二值化,將灰階影像轉換成只有黑白兩種值的影像,方便後續進行圖像分割等處理。

equalize:可對影像進行直方圖均衡化處理,增強影像的對比度,使影像中的細節更加明顯。

stretch:可對影像的像素值範圍進行調整,使影像中最暗和最亮的部分能更好地顯示出來,從而增強影像的對比度和細節。

遇到的問題:

解決方法:

查看課程材料中的README.txt了解在這次program中對應的程式碼需要的檔案以及影像,並將其分別加入至每個專案中解決此問題。

2.原本使用此圖輸出的直方圖黑色部分處於很小面積,檢查影像尺寸、格式有沒有出錯並想找出造成此結果的原因。

解決方法:

由於原本使用的影像整體偏暗,觀察到直方圖數據顯示有大量的數據集中於其中幾個低強度的bin內而導致不好觀察,在我換了另一張分布範圍比較沒這麼集中的影像時,解決了這個問題,我認為這樣對此主題比較有觀察意義。

2.contentfinder.cpp:Backprojecting a Histogram to Detect Specific Image Content. 

1.將 green-blue 讀入為灰階影像,接著定義了一個ROI範圍,也就是目標區域並顯示。

2.使用 Histogram1D 物件 h 的 getHistogram() 方法計算 ROI 區域的灰階直方圖,並使用 getHistogramImage() 方法將直方圖轉換成圖像並顯示。

3.使用 ContentFinder 物件,設定了直方圖、閥值、反向投影及轉換等參數。


4.將閥值設定為 0.12f再次進行反向投影。

5.接著,使用 rectangle 在圖像上繪製一個矩形,該矩形是定義 ROI 的矩形。

6.利用直方圖在彩色圖像中檢測特定的顏色。

7.讀取並顯示第二張彩色影像 green-blue3.jpg ,並且沿用相同的直方圖和閥值設定,對這張影像進行反向投影。

8.設定直方圖的 bin 數量為 256,並且計算 ROI 區域的 ab 色彩空間的直方圖。計算出直方圖後,將它轉換成 8 位元,並將像素值縮放到 0 到 255 的範圍並顯示。接著設置直方圖及閥值。

9.將兩張影像 green-blue 以及 green-blue3 轉換為 Lab 色彩空間的格式,宣告一個整數陣列 ch,包含 1 和 2,代表只取 Lab 色彩空間中的 a 和 b 兩個通道的值。接著使用剛剛從 ROI 產生的 ab 直方圖分別對兩張影像反向投影並顯示。

10.在 green-blue 影像上畫出 ROI 的範圍並顯示,接著將 bin 設為 180 階並生成先前設定雲域 ROI 的 Hue 直方圖 colorhist。

11.使用Hue通道進行直方圖反向投影 green-blue 以及 green-blue3 並顯示。

結果分析:

3.finder.cpp: Using the Mean-shift Algorithm to Find an Object.  

1.讀取彩色影像 GEM.jpg ,設定矩形並繪製,並將其設為 ROI 。

2.設定搜尋範圍及閥值。

3.對輸入的彩色圖像做一些前處理,以便在後面使用顏色直方圖對其進行目標檢測和跟蹤。

4.讀取並顯示第二張彩色影像 GEM2.jpg 後將其轉換為 HSV 色彩空間的形式。

5.使用 ContentFinder 對 hsv 圖像進行直方圖反向投影,不使用閾值進行二值化,並顯示。

定義一個整數陣列 ch,值為 0,表示只使用 H 通道的直方圖進行反向投影。

將 ContentFinder 的閾值設置為-1.0f,表示不進行閾值處理。

對 hsv 圖像進行直方圖反向投影,0.0f 為H通道的最小值,180.0f 為最大值,第四個參數是用於指定使用哪些通道進行反向投影。這裡只使用了H通道,因此傳入的是 ch。

6.使用 Mean-Shift 演算法完成目標跟蹤後,將跟蹤的結果視覺化出來。

Mean-Shift:

Mean-Shift 演算法會計算當前窗口的重心,並以此不斷更新窗口的位置。

重心計算方式為對窗口中的所有像素進行權重平均,權重是像素值的概率分布,即目標直方圖中每個bin的值除以窗口中所有像素數量。

計算完成移動窗口,直到窗口位置不再改變或達到最大迭代次數,或者認為目標已經被跟蹤成功。如果窗口位置不再改變,則認為目標已經穩定,跟蹤成功;否則則視為跟蹤失敗。

結果分析:

遇到的問題:

解決方法:

以尋找同一環境條件下用相同攝影設備拍攝出的不同影像為主。

解決方法:

由於原本解析度就不同,又必須確保調整後臉部的大小一致,只能在縮放與剪裁當中分成多次步驟完成。

4.retrieve.cpp: Retrieving Similar Images using Histogram Comparison 

1.讀取彩色影像 reference.jpg 作為參考影像並顯示。

2.分別讀入 1~8 影像,進行與參考圖像的比較,輸出相似度分數。

結果分析:

5.integral.cpp: Create a binary image by adaptively setting a threshold

1.將原圖讀取為灰階影像並顯示。

2.進行二值化處理,閥值 70 最大值 255,結果存在 binaryFixed 並顯示。

3.使用 adaptiveThreshold 函數來進行自適應閾值處理,將灰階圖像轉換成二值化圖像,結果存在binaryAdaptive 並顯示。

4.兩種方式計算積分影像。

5.使用 Mat 的 clone 函式,複製了一個 image 的副本,存到 binary 中,數據完全相同但內存地址是不同的,代表修改 binary 的數據時不會影響到 image 的數據。

6.使用 integral 函數計算輸入影像 image 的積分影像,輸出結果是一個和輸入影像同樣大小的 iimage 形式的矩陣。CV_32S 是輸出矩陣的數據類型,表示輸出矩陣的元素是 32 位有號整數。

7.這兩個迴圈是在進行自適應區塊二值化,透過計算每個像素周圍一定區域內的平均值來決定閥值,將該像素二值化為黑或白。

8.將影像邊緣處理為白色,使得邊緣區域不受影像處理算法的影響,避免因邊緣像素的不確定性對算法產生干擾。

9.輸出計時結果以及自適應區塊閾值處理結果。

10.使用 boxFilter 函數對 image 變量進行了模糊處理,產生一個經過平均濾波器的影像,並存儲在filtered變量中。

11.使用image >= (filtered-threshold)將 image 變量二值化,生成一個二值影像並存在 binaryFiltered 中並輸出。

結果分析:

6.tracking.cpp: Locate an object in the image

1.讀取第一張影像為灰階影像 image ,並且通過多次測試找到 ROI 的區域為 (193,120),寬度25高度30的矩形,並且計算此矩形像素總和並輸出sum。

2.將影像使用 integral 函式處理成積分影像,並且從此積分影像找出 ROI 區域並輸出。

3.使用 getHistogram 產生 ROI 的直方圖,並將bin設定為16個階段。

4.將影像轉換為二進位平面影像,然後使用積分影像計算指定區域的直方圖,再將直方圖轉換為圖像及顯示。

5.讀取第二章影像為灰階影像 secondImage,將其轉換為16平面二進制影像,並使用積分影像的方式計算直方圖數據 intHistogram,接著取出先前 ROI 位置的直方圖並顯示。

6.使用 compareHist 函數來計算第一張影像和第二章影像直方圖之間的距離並輸出。

7.接著對設定的範圍逐一比對及輸出,最後將 maxSimilarity 內的最大相似度輸出。

......

8.最後我們將這些實驗步驟的所有輸出清楚的顯示出來觀察。

原影像之 ROI 區域。

結果分析與問題:

ReferenceOpenCV 4 Computer Vision Application Programming Cookbook CH4, by D. M. Escrivá, R. Laganiere, Fourth Edition, Packt Publishing, 2019.[Book URL]  [GitHub