本節將簡要介紹Halcon中有關圖像直方圖操作的算子,重點介紹直方圖獲取和顯示兩類算子,以及直方圖均衡化處理算子。
目錄
1. 引言
2. 獲取并顯示直方圖
2.1 獲取(灰度)直方圖
(1)?gray_histo算子
(2) gray_histo_abs算子
(3) gray_histo_range算子
(4)?histo_2dim
2.2 顯示直方圖
(1)?gen_region_histo算子
(2)?get_grayval_range算子
3. 直方圖操作
3.1 直方圖均衡
3.2 計算直方圖的統計特性
1. 引言
圖像直方圖(Histogram)是反映圖像像素分布的統計表,記為?(𝑘),橫坐標代表像素值的取值區間,縱坐標代表每一像素值在圖像中的像素總數(對應普通直方圖)或者所占的百分比(對應歸一化直方圖)。
歸一化直方圖(Uniform Histogram)是圖像灰度級的函數,用來描述每個灰度級在圖像矩陣中的發生的概率,記為𝑝(𝑘),它可以?(𝑘)用得到。
累計分布直方圖(Cumulitive Distribution?Histogram),簡稱累計直方圖,代表圖像組成成分在灰度級的累計概率分布情況,每一個概率值代表小于等于此灰度值的概率,記為𝑐(𝑘),它也可以用?(𝑘)得到。
以下是三種直方圖的定義:
式中,𝑘是圖像灰度級的取值,表示取值為𝑘的像素點數目,N是圖像內像素點的總數。
下圖是多幅圖像及其對應的直方圖情況,不難看出,灰度直方圖反映了圖像中的灰度分布規律,直觀地表現了圖像中各灰度級的占比,很好地體現出圖像的亮度和對比度信息:
- 灰度圖分布居中說明亮度正常,偏左說明亮度較暗,偏右表明亮度較高;
- 狹窄陡峭表明對比度降低,寬泛平緩表明對比度較高。
(從左至右分別是較暗、較亮、較黯淡,以及高對比度圖像及其直方圖示例)
2. 獲取并顯示直方圖
2.1 獲取(灰度)直方圖
(1)?gray_histo算子
在Halcon中使用gray_histo算子獲取圖像的直方圖。該算子計算圖像的灰度值分布,并返回直方圖的頻數。根據參數設置不同,可以獲取普通直方圖和歸一化直方圖。
算子聲明:
gray_histo(Image : : : AbsoluteHisto, RelativeHisto)
參數說明:
- Image:輸入圖像。
- AbsoluteHisto:絕對直方圖,表示每個灰度值的像素數量。
- RelativeHisto:歸一化直方圖,表示每個灰度值的像素比例(概率)。
注意事項:
- 如果輸入圖像是彩色的,需要先轉換為灰度圖像。
- 如果要顯示直方圖,需要使用gen_region_histo算子將直方圖轉換為圖像的函數,方便可視化。
(2) gray_histo_abs算子
除了計算全局直方圖信息外,Halcon還提供了gray_histo_abs算子用于獲取圖像局部區域的直方圖信息,非常方便。在此列出該算子的聲明和參數說明。
算子聲明:
gray_histo_abs(Region, Image : Histogram : : )
參數說明:
- Region: 輸入區域,指定要計算直方圖的圖像區域。
- Image: 輸入圖像,灰度圖像。
- Histogram: 輸出直方圖,返回一個包含灰度值分布的數組。
(3) gray_histo_range算子
Halcon使用gray_histo_range算子用于計算圖像中指定區域內灰度值在某個范圍內的直方圖信息。與 gray_histo_abs 不同,gray_histo_range 允許用戶指定一個灰度值范圍,并僅計算該范圍內的像素分布。
算子聲明:
gray_histo_range(Region, Image : Histogram : MinGray, MaxGray, NumBins : )
參數說明:
- Region: 輸入區域,指定要計算直方圖的圖像區域。
- Image: 輸入圖像,灰度圖像。
- Histogram: 輸出直方圖,返回一個數組,表示指定灰度范圍內的像素分布。
- MinGray: 輸入參數,指定灰度范圍的最小值。
- MaxGray: 輸入參數,指定灰度范圍的最大值。
- NumBins: 輸入參數,指定直方圖的區間數(即將灰度范圍分成多少個區間)。
(4)?histo_2dim
Halcon使用histo_2dim算子計算雙通道灰度值圖像的直方圖,即構建二維直方圖。
算子聲明:
histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )
參數說明:
- Regions:輸入區域,在此區域內計算直方圖。這些區域通常是從圖像中分割出來的一部分或多部分,即感興趣區域(ROI)。
- ImageCol:多通道圖像的第一個通道,其數據將被用于計算直方圖的第一維。
- ImageRow:多通道圖像的第二個通道,其數據將被用于計算直方圖的第二維。
- Histo2Dim:計算得出的二維直方圖。輸出是一個整數類型的圖像,其中的每個像素值代表了對應灰度級組合出現的頻率。
使用說明:
- histo_2dim算子計算的是輸入區域Regions內,由ImageCol和ImageRow兩個通道構成的二維特征空間的直方圖。
- 在這個二維特征空間中,ImageCol的灰度值被解釋為行索引,ImageRow的灰度值被解釋為列索引。
- 輸出圖像Histo2Dim中的每個點P(g1,g2)的灰度值表示(g1,g2)灰度值組合的頻率,其中g1表示行索引,g2表示列索引。
注意事項:
- 在使用histo_2dim算子時,需要確保輸入圖像的兩個通道具有相同的尺寸和數據類型。
2.2 顯示直方圖
(1)?gen_region_histo算子
Halcon使用gen_region_histo算子用于根據直方圖生成一個區域(Region)。該算子將直方圖的灰度值分布轉換為一個區域,通常用于可視化直方圖或基于直方圖的分析。
算子聲明:
gen_region_histo(Histogram : Region : Row, Column, Scale : )
參數說明:
- Histogram: 輸入直方圖,通常是一個數組,表示灰度值的分布。
- Region: 輸出區域,生成的區域表示直方圖的形狀。
- Row: 輸入參數,指定生成區域的起始行坐標。
- Column: 輸入參數,指定生成區域的起始列坐標。
- Scale: 輸入參數,指定直方圖的縮放比例。
使用方法:
- 計算直方圖: 使用 gray_histo 或 gray_histo_range 等算子計算圖像的直方圖。
- 設置起始坐標: 指定生成區域的起始位置(Row 和 Column)。
- 設置縮放比例: 指定直方圖的縮放比例(Scale),用于調整生成區域的大小。
- 生成區域: 使用 gen_region_histo 將直方圖轉換為區域。
- 可視化或進一步處理: 對生成的區域進行顯示或進一步分析。
實例:
* 讀取圖像
read_image(Image, 'example_image.png')* 轉換為灰度圖像
rgb1_to_gray(Image, GrayImage)* 計算灰度直方圖
gray_histo(GrayImage, GrayImage, Histogram)* 定義直方圖的起始位置和縮放因子
Row := 100
Column := 100
Scale := 1.0* 生成基于直方圖的區域
gen_region_histo(RegionHisto, Histogram, Row, Column, Scale)* 顯示生成的區域
dev_display(GrayImage)
dev_display(RegionHisto)
注意事項:
- 直方圖數據:確保輸入的直方圖數據是有效的數組。如果直方圖數據為空或無效,生成的區域可能為空。
- 起始坐標:確保 Row 和 Column 在圖像范圍內,否則生成的區域可能不可見。
- 縮放比例:縮放比例 Scale 影響生成區域的大小。較大的縮放比例會生成較大的區域。
(2)?get_grayval_range算子
在顯示直方圖信息時,Halcon使用了get_grayval_range算子用于獲取圖像中灰度值的范圍(最小值和最大值)。這個算子對于分析圖像的灰度分布非常有用,尤其是在直方圖計算和圖像增強等操作中。
算子聲明:
get_grayval_range(Image : : : MinGray, MaxGray)
參數說明:
- Image:輸入圖像(可以是灰度圖像或多通道圖像)。
- MinGray:圖像中灰度值的最小值。
- MaxGray:圖像中灰度值的最大值。
3. 直方圖操作
在Halcon中提供的直方圖操作主要是兩種,直方圖均衡和直方圖規定化。兩者都能實現特定的圖像增強目的,但又有區別。
3.1 直方圖均衡
直方圖均衡化(Histogram Equalization,簡稱直方圖均衡,HE)是一種簡單有效的圖像增強技術。根據直方圖的形態可以判斷圖像的質量,通過調控直方圖的形態可以改善圖像的質量。
直方圖均衡的基本思想是對圖像中占比大的灰度級進行展寬,而對占比小的灰度級進行壓縮,使圖像的直方圖分布較為均勻,擴大灰度值差別的動態范圍,從而增強圖像整體的對比度。
Halcon提供了equ_histo_image算子來實現直方圖均衡化。
算子聲明:
equ_histo_image(Image : ImageEquHisto : : )
參數說明:
- Image(輸入):輸入圖像(通常是灰度圖像)。
- ImageEquHisto(輸出):直方圖均衡化后的圖像。
以下是一個完整的Halcon代碼示例,展示如何實現直方圖均衡化。
* 讀取圖像
read_image(Image, 'example_image.jpg')* 將圖像轉換為灰度圖像
rgb1_to_gray(Image, GrayImage)* 顯示原始圖像
dev_display(GrayImage)
dev_set_window(0)
set_display_font(16, 'mono', 'true', 'false')
disp_message(0, 'Original Image', 'window', 12, 12, 'black', 'true')
dev_open_window(0, 512, 512, 512, 'black', WindowHandle1)
dev_set_window(WindowHandle1)
disp_message(WindowHandle1, 'Original Histogram', 'window', 12, 12, 'black', 'true')* 計算并顯示原始圖像的直方圖
gray_histo(GrayImage, GrayImage, AbsoluteHisto, RelativeHisto)
dev_display(GrayImage)
dev_set_window(WindowHandle1)
disp_histogram(AbsoluteHisto, 512, 512, 1, 1, 'absolute', 'true')* 進行直方圖均衡化
equ_histo_image(GrayImage, EquImage)* 顯示均衡化后的圖像
dev_open_window(512, 0, 512, 512, 'black', WindowHandle2)
dev_set_window(WindowHandle2)
dev_display(EquImage)
disp_message(WindowHandle2, 'Equalized Image', 'window', 12, 12, 'black', 'true')* 計算并顯示均衡化后的直方圖
gray_histo(EquImage, EquImage, AbsoluteHistoEqu, RelativeHistoEqu)
dev_open_window(512, 512, 512, 512, 'black', WindowHandle3)
dev_set_window(WindowHandle3)
disp_message(WindowHandle3, 'Equalized Histogram', 'window', 12, 12, 'black', 'true')
disp_histogram(AbsoluteHistoEqu, 512, 512, 1, 1, 'absolute', 'true')
注意事項:
- 輸入圖像:equ_histo_image 適用于灰度圖像。如果輸入是彩色圖像,需要先轉換為灰度圖像。
3.2 計算直方圖的統計特性
除了直方圖均衡化處理之外,在計算視覺特征時,還需要計算一些基于直方圖的統計特性。Halcon中并沒有提供計算這些統計特征量的算子。
附錄:算子列表
- gray_histo:計算直方圖
- gray_histo_abs:計算灰度值分布
- equ_histo_image:直方圖均衡化
- histo_2dim:計算量通道灰度圖像的直方圖
- gen_region_histo:將直方圖轉換為一個區域,用于展示直方圖
(初稿完成,最新更新2025-02-08)
本專欄將介紹基于Halcon的各種傳統經典的數字圖像處理技術,所介紹內容基本與Gonzalez的教材基本保持一致。作為學習和實踐DIP技術的入門教程。
感謝大家的支持和瀏覽,本專欄將持續更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,這樣大家閱讀起來也比較輕松。估計2025年上半年完成全部內容,歡迎加收藏。但由于到了假期,更新的速度不會很快。
在專欄全部完成之前,所有內容將一直免費。