? ? ? ?圖像增強技術根據增強處理時所處的空間不同,基本可以分為兩類:空間域法和頻域法。空間域可以簡單地理解為包含圖像像素的空間,空間域法是指空間域中,也就是圖像本身,直接對圖像進行各種線性或非線性運算,對圖像的像素灰度值做增強處理。空間域法又分為點運算和模板處理兩大類。點運算是作用于單個像素鄰域的處理方法,包括圖像灰度變換、直方圖修正、偽彩色增強技術;模板處理是作用于像素領域的處理方法,包括圖像平滑、圖像銳化等技術。頻域法則是在圖像的變換域中把圖像看成一種二維信號,對其進行基于二維傅里葉變換的信號增強。對其進行基于二維傅里葉變換的信號增強。常用的方法包括低通濾波、高通濾波以及同態濾波等,如圖概括了常用的圖像增強的方法:
下面介紹一些Halcon中常用的圖像增強算子:
一、空間域
1、線性灰度變換:一般不改變像素點的坐標信息,只改變像素點的灰度值
主要使用算子:
- scale_image(Image : ImageScaled : Mult, Add : ) — 縮放圖像的灰度值
原理:算子scale_image對輸入的圖像(Image)進行如下變換:
? ? ? ?? ? ? ?? ? ? ? ? ?? ? ? ? ? ?? ? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?
通過參數3、4來改變圖像的像素灰度值,從而達到增強圖像對比度的目的,注:參數3/4設為1,0,則圖像灰度值未發生改變
目的:拉開圖像的對比度,讓圖像中黑的地方更黑,亮的地方更亮。
應用:例如,將圖像70灰度值以下全部置黑,將圖像200灰度值以上全部置白,可通過列方程組求得scale_image()中參數3、4的值。
? ? ? ?? ? ? ?? ? ? ? ? ?? ? ? ? ? ?? ? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
scale_image (Image, ImageScaled, 1.5, -150)
- emphasize(Image : ImageEmphasize : MaskWidth , MaskHeight, Factor : )
原理:首先,該過程使用低通(mean_image)進行過濾。由得到的灰度值(mean)和原始灰度值(orig)計算得到的灰度值(res)如下:
? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?? ? ? ?
通過參數3、4控制均值濾波模板的大小,數值越大,則圖像對比度越強,一般配合參數5—Factor(對比度強度)一起對圖像進行增強處理。
作用:增強圖像的高頻區域(邊緣和拐角),使圖像看起來更清晰。
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
emphasize (Image, ImageEmphasize, 7, 7, 1)
2、 非線性灰度變換
對數變換和指數變換。
主要使用算子:
- log_image(Image : LogImage : Base : ) — 對圖像做底數為Base 的對數變換
概念:圖像灰度的對數變換可以擴張數值較小的灰度范圍或者壓縮數值較大的灰度范圍。對數變換是一種有用的非線性映射交換函數,可以用于擴展圖像中范圍較窄的低灰度值像素,壓縮輸入圖像中范圍較寬的高灰度值像素,使得原本低灰度值的像素部分能更清晰的呈現出來。
原理:對圖像的灰度值取對數,得到新的灰度值,第3個參數為對數的底,默認值為’e’
效果:
read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
log_image (Image, LogImage,'e')
- pow_image(Image : PowImage : Exponent : ) — 對圖像做伽馬為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( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : ) — 在頻域生成高斯濾波器(注意這里是頻域的,而對圖像進行平滑處理的高斯濾波是時域的高斯濾波器,其使用卷積模板濾除噪聲)
原理:首先產生一個高斯核,然后根據輸入的參數對這個高斯核矩陣做傅里葉變換(實現從空域或時域到頻域的轉換工具),得到特定模式和特定分辨率的所謂頻域的濾波器,例如我要進行rft_generic的變換,那么我的高斯濾波器模式就要寫為‘rft’。并通過設置參數保持頻域濾波器和原圖像一致。
參數:
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(Image : ImageFFT : Direction, Norm, ResultType, Width : ) — 計算圖像的實值快速傅里葉變換,一般需要使用兩次,因為在頻域處理完之后,還需要轉換成空間域。
原理:其實gen_gauss_filter得到的濾波器,就是一個圖像,雖然是頻域濾波器,但是單純看物理意義,他就是一個圖像。與時域空間卷積核的物理意義是相同的。對這幅頻域圖進行卷積(卷積過程與時域無差別),卷積之后圖像就產生了變化,比如外環得到減弱,內環得到保留(高低通濾波器的效果),或者在某個方向上得到保留(gabor濾波器的效果),再還原到時域,發現跟原圖變化很大。
參數:
Image:輸入圖像
ImageFFT(out) :傅里葉變換輸入圖像
Direction:計算正向或反向變換。‘to_freq’是空間域—>頻域的變換,ResultType一般選擇’complex’;‘from_freq’是頻域—>空間域的變換,ResultType一般選擇’byte’(灰度圖像)。
Norm:變換的歸一化因子
ResultType:輸出圖像的圖像類型,配合Direction參數設置
Width :輸入圖像的寬度 - 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)
?
?
?
參考:
《HALCON數字圖像處理》
? halcon視覺缺陷檢測系列(2)頻域和空間域轉換的方法詳解
?
戳戳小手幫忙點個免費的贊和關注吧,嘿嘿。