1. 程式人生 > 其它 >Halcon——影象增強運算元以及分類

Halcon——影象增強運算元以及分類

摘要

影象增強就是指通過某種影象處理方法對退化的某些影象特徵,如邊緣、輪廓、對比度等進行處理,以改善影象的視覺效果,提高影象的清晰度,或是突出影象中的某些“有用”,壓縮其他“無用”資訊,將影象轉換為更適合人或計算機分析處理的形式。

影象增強技術根據增強處理時所處的空間不同,基本可以分為兩類:空間域法頻域法

  • 空間域可以簡單地理解為包含影象畫素的空間,空間域法是指空間域中,也就是影象本身,直接對影象進行各種線性或非線性運算,對影象的畫素灰度值做增強處理。空間域法又分為點運算模板處理兩大類。
  1. 點運算是作用於單個畫素鄰域的處理方法,包括影象灰度變換、直方圖修正、偽彩色增強技術;
  2. 模板處理是作用於畫素領域的處理方法,包括影象平滑、影象銳化等技術。
  • 頻域法則是在影象的變換域中把影象看成一種二維訊號,對其進行基於二維傅立葉變換的訊號增強。對其進行基於二維傅立葉變換的訊號增強。常用的方法包括低通濾波、高通濾波以及同態濾波等。

如圖概括了常用的影象增強的方法:

下面介紹一些Halcon中常用的影象增強運算元。


一、空間域

1、線性灰度變換:一般不改變畫素點的座標資訊,只改變畫素點的灰度值

  • scale_image— 縮放影象的灰度值
scale_image(Image : ImageScaled : Mult, Add : ) 

原理:運算元scale_image對輸入的影象(Image)進行如下變換:
g’ := g * Mult + Add


通過引數3、4來改變影象的畫素灰度值,從而達到增強影象對比度的目的,注:引數3/4設為1,0,則影象灰度值未發生改變
作用:拉開影象的對比度,讓影象中黑的地方更黑,亮的地方更亮。
效果:

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
scale_image (Image, ImageScaled, 1.5, -150)
  • emphasize——影象增強
emphasize(Image : ImageEmphasize : MaskWidth , MaskHeight, Factor : )

原理:首先,該過程使用低通(mean_image)進行過濾。由得到的灰度值(mean)和原始灰度值(orig)計算得到的灰度值(res)如下:

res := round((orig - mean) * Factor) + orig
通過引數3、4控制均值濾波模板的大小,數值越大,則影象對比度越強,一般配合引數5—Factor(對比度強度)一起對影象進行增強處理。
作用:增強影象的高頻區域(邊緣和拐角),使影象看起來更清晰。
效果:

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
emphasize (Image, ImageEmphasize, 7, 7, 1)

2、 非線性灰度變換

單純的線性灰度變換可以在一定程度上解決視覺上的影象整體對比度問題,但是對影象細節部分的增強較為有限,結合非線性變換技術可以解決這一問題。非線性變換不是對影象的整個灰度範圍進行擴充套件,而是有選擇的對某一灰度範圍進行擴充套件,其他範圍的灰度則有可能被壓縮。常用的非線性變換有對數變換指數變換

  • log_image— 對影象做底數為Base 的對數變換
log_image(Image : LogImage : Base : )

概念:影象灰度的對數變換可以擴張數值較小的灰度範圍或者壓縮數值較大的灰度範圍。對數變換是一種有用的非線性對映交換函式,可以用於擴充套件影象中範圍較窄的低灰度值畫素,壓縮輸入影象中範圍較寬的高灰度值畫素,使得原本低灰度值的畫素部分能更清晰的呈現出來。
原理:對影象的灰度值取對數,得到新的灰度值,第3個引數為對數的底,預設值為’e’
效果

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
log_image (Image, LogImage,'e')
  • pow_image— 對影象做伽馬為Exponent的指數變換
pow_image(Image : PowImage : Exponent : )

概念:指數變換對映關係與對數變換的不同之處在於,指數變換可以根據伽馬Exponent 的不同取值有選擇性地增強低灰度區域的對比度或是高灰度區域的對比度

效果

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
pow_image (Image, PowImage, 2)

2、直方圖均衡化

直方圖均衡化是一種最常見的直方圖修正法。這種方法的思想是把原始影象的直方圖為均勻分佈的形式,增加畫素灰度值的動態範圍。也就是說直方圖均衡化是使原影象中具有相近灰度且佔有大量畫素點的區域的灰度範圍展寬,使大區域中的微小灰度變化呈現出來,增強影象整體對比度效果,使影象更加清晰。

equ_histo_image(Image : ImageEquHisto : : ) 

效果

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
equ_histo_image (Image, ImageEquHisto)

二、頻域

頻率特徵是影象的灰度變化特徵,低頻特徵是灰度變化不明顯,例如影象整體輪廓,高頻特徵是影象灰度變化劇烈,如影象邊緣和噪聲。

一個重要的經驗結論:低頻代表影象整體輪廓,高頻代表了影象噪聲,中頻代表影象邊緣、紋理等細節。什麼時候使用傅立葉變換進行頻域分析?
1、具有一定紋理特徵的影象,紋理可以理解為條紋,如布匹、木板、紙張等材質容易出現。
2、需要提取對比度低或者信噪比低的特徵。
3、影象尺寸較大或者需要與大尺寸濾波器進行計算,此時轉換至頻域計算,具有速度優勢。因為空間域濾波為卷積過程(加權求和),頻域計算直接相乘。
在halcon中,使用頻域進行檢測,有兩個步驟是比較關鍵的:①生成合適的濾波器;②空間域和頻域之間的轉換。
1、高通濾波法

影象中的邊緣或細條等細節部分與影象頻譜的高頻分量相對應,因此採用高通濾波讓高頻分量順利通過,使影象的邊緣或細條等細節變得清楚,實現影象的銳化。高通濾波可用空頻法或頻域法來實現。在空間域是用卷積方法,與空域低通濾波的鄰域平均法類似,不過其中的衝激響應方陣H不同。

  • gen_gauss_filter— 在頻域生成高斯濾波器
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )

引數
ImageGauss(out) :生成的濾波器影象
Sigma1:空域(畫素域)中,高斯分佈在濾波器主方向的標準差
Sigma2:空域(畫素域)中,高斯分佈在垂直於濾波器主方向的標準差。注:Sigma1和Sigma2確定空間域內高斯函式的平滑量
Phi:濾波器在空間域的主要方向
Norm:濾波器的歸一化因子。注:如果使用fft_image和fft_image_inv進行過濾,必須設定引數Norm = 'none’和Mode = ‘dc_center’(本文未使用)
Mode:頻率圖中心位置。注: 如果使用實值快速傅立葉變換運算元rft_generic, 則Mode = ‘rft’ ;如果使用快速傅立葉變換運算元fft_generic,則可以使用Mode = 'dc_edge’來提高效率
Width, Heigh:生成濾波影象的寬、高
原理:首先產生一個高斯核,然後根據輸入的引數對這個高斯核矩陣做傅立葉變換(實現從空域或時域到頻域的轉換工具),得到特定模式和特定解析度的所謂頻域的濾波器,例如我要進行rft_generic的變換,那麼我的高斯濾波器模式就要寫為‘rft’。並通過設定引數保持頻域濾波器和原影象一致。

  • rft_generic— 計算影象的實值快速傅立葉變換,一般需要使用兩次,因為在頻域處理完之後,還需要轉換成空間域。
rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : ) 

引數
Image:輸入影象
ImageFFT(out) :傅立葉變換輸入影象
Direction:計算正向或反向變換。‘to_freq’是空間域—>頻域的變換,ResultType一般選擇’complex’;‘from_freq’是頻域—>空間域的變換,ResultType一般選擇’byte’(灰度影象)。
Norm:變換的歸一化因子
ResultType:輸出影象的影象型別,配合Direction引數設定
Width :輸入影象的寬度

原理:其實gen_gauss_filter得到的濾波器,就是一個影象,雖然是頻域濾波器,但是單純看物理意義,他就是一個影象。與時域空間卷積核的物理意義是相同的。對這幅頻域圖進行卷積(卷積過程與時域無差別),卷積之後影象就產生了變化,比如外環得到減弱,內環得到保留(高低通濾波器的效果),或者在某個方向上得到保留(gabor濾波器的效果),再還原到時域,發現跟原圖變化很大。

  • convol_fft— 在頻域用濾波器對影象進行卷積
convol_fft(ImageFFT, ImageFilter : ImageConvol : : ) 

原理:將複合影象ImageFFT的畫素乘以濾波影象濾波器的對應畫素。

效果:

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
get_image_size (Image, Width, Height)
*在頻域中生成高斯濾波器
gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
*對影象進行傅立葉變換
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
*對傅立葉影象做卷積,使用之前建立的高斯濾波器作為卷積核
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*將卷積後的傅立葉影象還原為空間域影象。可見影象的突變部分得到了增強
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
sub_image (Image, ImageFFT1, ImageSub, 5, 100)
*對影象進行縮放,一般影象特別大的時候,縮放一下,提取效果會更好
zoom_image_factor (ImageSub, ImageZoomed, 0.4, 0.4, 'constant')
*將影象中的有灰度差異的線條提取出來
lines_gauss (ImageZoomed, Lines1, 0.2, 3, 8, 'light', 'true', 'gaussian', 'true')

注:當影象質量不理想時,提取線條的效果不好時,不妨試試這種方法,親測效果很好。

此外,還有一些影象增強的方法:

  • 灰度影象形態學(對灰度影象使用下面運算元)

①gray_opening:結構元素在影象中滑,灰度值最高的值作為新值,有使影象變亮的作用。 
②gray_closing:結構元素在影象中滑,灰度值最低的值作為新值,有使影象變暗的作用。 
③gray_range_rect:用一個矩形結構元素在影象中滑動,新值 = (矩形中最大的)灰度值-(矩形中最大的)最小的灰度值

  • mult_image(Image1, Image2 : ImageResult : Mult, Add : ) — 將影象變化較大的部位通過影象相減處理提取出來,再和原圖簡單相加

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
*圖二
mult_image (Image, Image, ImageResult, 0.05, 1)
*圖三
mult_image (Image, Image, ImageResult, 0.002, 1)

轉載博文:(2條訊息) [Halcon] 影象增強相關運算元及其分類_Loewen丶的小窩-CSDN部落格