【文章內(nèi)容簡介】
,1200]時:當(dāng)H在[1200,2400]時: 當(dāng)H在[2400,3600]之間時:(10)圖像銳化在圖像系統(tǒng)中由于攝影系統(tǒng)的聚焦不良和信號傳輸系統(tǒng)信號頻帶過窄,造成圖像中目標輪廓的模糊是必然的。圖像的模糊實際上是由于頒率高的空間頻率成分低于頻率低的空間頻率成分而造成的,這一影響表現(xiàn)于均勻灰度區(qū)域間的邊界部分(邊緣),如圖1611所示。因此要消除模糊,必須增強圖像中頻率高的空間頻率成分,即圖像的銳化(或細微層次強調(diào))。圖1611 模糊邊緣帶來的影響圖像銳化(Image Sharpening)是一種使圖像具有的信息讓人們易于觀察的圖像質(zhì)量改善方法,從數(shù)學(xué)角度上講就是對圖像進行微分化處理。在圖像中,邊緣是由灰度級和相鄰域點不同的像素點構(gòu)成的。因而,若想增強邊緣,就應(yīng)該突出相鄰點間的灰度級的變化。微分運算可用來求信號的變化率,因而具有加強高頻分量的作用。如果將其應(yīng)用在圖像上,可使圖像的輪廓清晰。由于常常無法事先確定輪廓的取向,因而挑選用于輪廓增強的微分算子時,必須選擇那些不具備空間方向性的和具有旋轉(zhuǎn)不變的線性微分算子。用這種方法可以去掉引起圖像質(zhì)量劣化的原因之一模糊,并把圖像變得輪廓分明。卷積是實現(xiàn)銳化的一個很好的變通。卷積可以看成是加權(quán)求和的過程,卷積時使用一個很小的矩陣來表示,矩陣的維數(shù)為奇數(shù),該矩陣體現(xiàn)在程序中就是模板概念,區(qū)域中的每個像素分別與模板中相應(yīng)的元素相乘,相乘之和即為區(qū)域中心像素新值,例如一個33的區(qū)域A和模板P卷積后,區(qū)域A的中心像素A5像素值表示為:其中, 不同的模板可以得到不同的效果,一般所用模板采用33矩陣,在采用模板操作時必須解決兩個問題,即邊界點問題,一般可以忽略第一列和最后一列像素的操作,或者直接進行邊界像素的拷貝,還有一個問題即是越界問題,必須保證中心像素點的各分量在0~255范圍。銳化的常用模板如下: , , (11)圖像平滑在輸入圖像的過程中,圖像可能存在各種寄生效應(yīng),如可能受到各種噪聲源的干擾,混入各種高頻噪聲。另外如光電轉(zhuǎn)換過程中的噪聲、照片顆粒噪聲和信息傳輸中的誤差等,從而不能保證正確地求出數(shù)字圖像的密度信息。要求得正確的圖像信息則必須消除噪聲。此外在印刷彩色復(fù)制過程中為了保證諸如膚色、絲綢質(zhì)感之類的復(fù)制及藝術(shù)再現(xiàn)需要,亦需要圖像平滑、柔和、降低銳度。因此這種消除圖像的噪聲及滿足彩色復(fù)制特殊需要的方法,在圖像處理中稱為圖像平滑。亦即采用依據(jù)小區(qū)域平均化方法的濾波,從數(shù)學(xué)上講就是采用一種具有能夠除去高頻成分性質(zhì)的積分運算。圖像平滑亦分為空間域處理和頻譜域處理兩種。主要有鄰域平均法,低通濾波法,和多圖像濾波法等,本節(jié)主要介紹鄰域平均法。鄰域平均法是一種在空間域上對圖像進行平滑處理的最常用方法。該方法的核心是求出圖像中以某點為中心的一個鄰域范圍內(nèi)的圖像像素之平均值,并以此平均值來作為該中心點的灰度值,假定一幅個像素的圖像,平滑后處理得到一幅圖像,則:式中,S是點鄰域中心的點的集合,但是其中不包括點,M是集合內(nèi)點的總數(shù)。一般的鄰域有四點鄰域和八點鄰域,八點鄰域效果要好于四點鄰域,和銳化一樣,采用模板來編制程序。圖像平滑的模板大致有以下幾個:,(12)中值濾波中值濾波是把數(shù)字圖像中的一點的值用該點的一個領(lǐng)域的各個點的值的中值代替,中值的定義如下:一組數(shù)假如排序如下:為數(shù)為數(shù)y稱為的中值,加入一個序列(10,20,30,40,50,60,70)則中值為40。把一個點的特定長度或形狀的鄰域稱作窗口,在一維的時候,中值濾波器是一個奇數(shù)個像素的滑動窗口,窗口正中間的值用窗口內(nèi)各個像素的中值代替。設(shè)輸入為{},則濾波器的輸出為:如果推廣到二維,則可以定義輸出為:對于二維的中值濾波,一般采用33或者55的窗口來進行濾波。下面的實例是用33的窗口進行中值濾波,讀者也可以自己設(shè)置窗口大小。(13)Hough變換Hough變換用來在圖像中查找直線。它的原理很簡單:假設(shè)有一條與原點距離為s,方向角為θ的一條直線,如圖1612所示。圖1612 一條與原點距離為s,方向角為θ的一條直線直線上的每一點都滿足方程:利用這個事實,可以找出某條直線來。(14)邊緣檢測我們給出一個模板和一幅圖像,進行模板操作后的結(jié)果如下:不難發(fā)現(xiàn)原圖中左邊暗,右邊亮,中間存在著一條明顯的邊界,第三四列比其他列的灰度值高很多,人眼觀察時,就能發(fā)現(xiàn)一條很明顯的亮邊,其他區(qū)域都很暗,這樣就起到了邊沿檢測的目的。為什么會這樣呢?仔細看看那個模板就明白了,它的意思是將右鄰點的灰度值減左鄰點的灰度值作為該點的灰度值。在灰度相近的區(qū)域內(nèi),這么做的結(jié)果使得該點的灰度值接近于0,而在邊界附近,灰度值有明顯的跳變,這么做的結(jié)果使得該點的灰度值很大,這樣就出現(xiàn)了上面的結(jié)果。這種模板就是一種邊沿檢測器,它在數(shù)學(xué)上的涵義是一種基于梯度的濾波器,又稱邊沿算子,讀者沒有必要知道梯度的確切涵義,只要有這個概念就可以了。梯度是有方向的,和邊沿的方向總是正交(垂直)的,例如,對于圖像的轉(zhuǎn)置圖像,邊是水平方向的,可以用梯度是垂直方向的模板 檢測它的邊沿。同理梯度為45度方向模板,可以檢測出135度方向的邊沿。常用的邊緣檢測算子有如下幾種。① Sobel算子在邊沿檢測中,常用的一種模板是sobel 算子。有兩個,一個是檢測水平邊沿的即,一個是檢測垂直平邊沿的即。與和 相比,sobel算子對于像素的位置的影響做了加權(quán),因此效果更好。Sobel算子另一種形式是Isotropic Sobel算子,也有兩個,一個是檢測水平邊沿的即,一個是檢測豎直平邊沿的即。② Prewitte 算子Prewitte 算子采用的是兩個模板和,分別處理后得到的像素點的較大值,每一個模板的實現(xiàn)和Sobel算子的實現(xiàn)原理一樣。③ 高斯拉普拉斯算子由于噪聲點(灰度與周圍點相差很大的點)對邊沿檢測有一定的影響,所以效果更好的邊沿檢測器是高斯拉普拉斯(LOG)算子。它把我們在第3講中介紹的高斯平滑濾波器和拉普拉斯銳化濾波器結(jié)合了起來,先平滑掉噪聲,再進行邊沿檢測,所以效果會更好。常用的LOG算子是5*5的模板,即。(15)輪廓提取所謂輪廓提取就是掏空圖形的內(nèi)部點:如果原圖中有一點為黑,且它的8個相鄰點都是黑色時(此時該點是內(nèi)部點),則將該點刪除。要注意的是,我們處理的雖然是二值圖,但實際上是256級灰度圖,不過只用到了0和255兩種顏色。 實例演示本實例演示將在介紹實例實現(xiàn)時介紹實例的運行。 實例實現(xiàn)本系統(tǒng)功能比較強大,因此包含了大量的文件,下面列出一些重點的文件:(1),該文件為系統(tǒng)的主界面,由菜單和工具欄組成 ;(2),該文件為圖像打印設(shè)置窗體;(3),該文件為圖像材質(zhì)編輯窗體;(4),該文件為圖像縮放設(shè)置窗體;(6),該文件為圖像屬性顯示窗體;(7),該文件為放大圖形時,快速查看目標圖像的窗體;(8),該文件用于對文件進行旋轉(zhuǎn)設(shè)置、以及進行水平和垂直鏡像;(9),該文件用于查看圖像應(yīng)用各種濾鏡后的效果;(10),該文件為打開圖片時進行圖片預(yù)覽;(11),該文件為類模塊,用于進行圖像的基本操作;(12),該文件為類模塊,用于對圖像顏色進行各種操作;(13),該文件為類模塊,用于對圖像進行各種濾鏡操作;(14),該文件為類模塊,用于對圖像的模板進行處理; (15),該文件為類模塊,用于對將當(dāng)前的圖像保存成其他文件格式;(16),該文件為類模塊,用于操作內(nèi)存中的圖像數(shù)據(jù);(17),該文件為基本模塊,用于進行系統(tǒng)的各種設(shè)置;(18),該文件為基本模塊,用于對鼠標的滾輪進行處理;(19),該文件為基本模塊,用于對文件進行處理;(20),該文件為基本模塊,用于讀寫INI文件;(21),該文件為基本模塊,用于進行HSL、RGB等顏色的轉(zhuǎn)換;(22),該文件為基本模塊,用于聲明各種GDI函數(shù)和變量;(23),該文件為基本模塊,用于創(chuàng)建打開圖像文件對話框,并且能夠進行圖像預(yù)覽;(24),該文件為基本模塊,用于選擇圖像中的文件;(25),該文件為基本模塊,用于選擇文件夾;(26),該文件為自定義控件,用于作為圖像的畫布;(27),該文件為自定義控件,用于顯示圖像處理的各種信息;(28),該文件為自定義控件,用于顯示圖像處理的進度;(29),該文件為自定義控件,用于顯示系統(tǒng)的工具欄。下面學(xué)習(xí)本系統(tǒng)中的重要代碼。1.fMain窗體首先要來學(xué)習(xí)系統(tǒng)的主窗體的核心代碼。因為本系統(tǒng)功能非常強大,因此很多功能都是集成在其他的類模塊、基本模塊中。 39。代碼省略2.CDIB類模塊CDIB類是本系統(tǒng)圖像處理的基本類,后面的很多類都是在此基礎(chǔ)上進行的。在該類中利用了大量的API函數(shù),在編程原理中已經(jīng)有介紹,這里就不再介紹了。DIB的含義就是設(shè)備無關(guān)的位圖。 (1)Create函數(shù),該函數(shù)創(chuàng)建一個位圖空間;Public Function Create(ByVal NewWidth As Long, ByVal NewHeight As Long, Optional ByVal BackColor As Long = vbBlack) As Boolean Dim tRect As RECT2 Dim hBrush As Long 39?!獎h除原先的DIB Call 39。—創(chuàng)建位圖頭 With m_tBIH .biSize = Len(m_tBIH) .biPlanes = 1 .biBitCount = 32 .biWidth = NewWidth .biHeight = NewHeight .biSizeImage = (4 * NewWidth) * NewHeight End With 39。—創(chuàng)建DIB空間 m_hDC = CreateCompatibleDC(0) If (m_hDC 0) Then 39。—創(chuàng)建DIB m_hDIB = CreateDIBSection(m_hDC, m_tBIH, DIB_RGB_COLORS,m_lpBits,0, 0) If (m_hDIB 0) Then 39。—將位圖寫入位圖空間m_hdc m_hOldDIB = SelectObject(m_hDC, m_hDIB) 39?!O(shè)置背景顏色 Call SetRect(tRect, 0, 0, NewWidth, NewHeight) hBrush = CreateSolidBrush(BackColor) Call FillRect(m_hDC, tRect, hBrush) Call DeleteObject(hBrush) Else Call End If End If 39?!獎?chuàng)建成功 Create = (m_hDIB 0)End FunctionCreate函數(shù)用于創(chuàng)建一個設(shè)備無關(guān)的位圖該函數(shù)是通過CreateCompatibleDC 和CreateDIBSection函數(shù)來實現(xiàn)的。通常在創(chuàng)建一個新的位圖、或者對一個圖像進行旋轉(zhuǎn)、鏡像等處理時,都需要創(chuàng)建DIB位圖。(2)Orientation函數(shù),該函數(shù)用于對圖像進行旋轉(zhuǎn)或者對圖像進行鏡像處理。39。代碼省略(3)CreateFromStdPicture函數(shù),該函數(shù)根據(jù)源圖像創(chuàng)建一個新圖像;Public Function CreateFromStdPicture(Picture As StdPicture, Pal As cDIBPal, Dither As cDIBDither) As Long Dim tBI As Bitmap Dim lhDC As Long Dim lhOldBmp As Long Dim nColors As Integer Dim tBIH As BITMAPINFOHEADER Dim aData() As Byte If (Not Picture Is Nothing) Then 39。如果圖像不為空 If (GetObjectType(Picture) = OBJ_BITMAP) Then 39。如果是BMP位圖 Call GetObject(, Len(tBI), tBI) If (Create(, )) Then 39。創(chuàng)建DIB lhDC = CreateCompatibleDC(0) If (lhDC 0) Then lhOldBmp = SelectObject(lhDC, ) 39。—載入源圖像數(shù)據(jù) Call BitBlt(m_hDC, 0, 0, , , lhDC, 0, 0, SRCCOPY) 39?!d入調(diào)色板 If ( =