[轉載+原創]Emgu CV on C# (四) —— Emgu CV on 二值化

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

重點介紹了二值化原理及數學實現,並利用emgucv方法編程實現。

一、理論概述(轉載,如果懂影像處理,可以略過,僅用作科普,或者寫文章湊字數) 

1、概述

      映像二值化是影像處理中的一項基本技術,也是很多影像處理技術的預先處理過程。

      映像的預先處理在進行映像二值化操作前要對映像進行預先處理,包括彩色映像灰化和增強。由於選取閾值需要參照長條圖,因此在映像進行處理後,我們再擷取映像的長條圖以協助選取閾值。整個流程如下所示:  

      讀取映像→灰階映像→映像增強→映像長條圖→二值化處理

2、數學原理(轉載,基本可以不用看,具體參看《灰階映像二值化方法研究》)

    映像二值化是指用灰階變換來研究灰階映像的一種常用方法,即設定某一閾值將灰階映像的像素分成大於閾值的像素群和小於閾值的像素群兩部分。例如輸人灰階映像函數為,輸出二值映像函數為,則 

    

     閾值(threshold )是把目標和背景區分開的尺規,選取適當的閾值就是既要儘可能儲存映像資訊,又要儘可能減少背景和雜訊的幹擾,這是選擇閾值的原則。

     映像的二值化處理就是將映像上的點的灰階置為0或255,也就是使整個映像呈現出明顯的黑白效果。即將256個亮度等級的灰階映像通過適當的閥值選取而獲得仍然可以反映映像整體和局部特徵的二值化映像。  

     灰階映像的二值化處理有很多種方法,主要分為全域閾值法和局部閾值法。

全域閾值法

    全域閾值法是指在二值化過程中只使用一個全域閾值的方法。它將映像的每個像素的灰階值與進行比較,若大於,則取為前景色彩(白色);否則,取為背景色。根據文本映像的長條圖或灰階空間分布確定一個閾值,以此實現灰階文本映像到二值映像的轉化。其中全域閾值法又可分為基於點的閾值法和基於地區的閾值法。閾值分割法的結果很大程度上依賴於對閾值的選擇,因此該方法的關鍵是如何選擇合適的閾值。

    典型的全域閾值方法包括Otsu方法、最大熵方法等。全域閾值法演算法簡單,對於目標和背景明顯分離、長條圖分布呈雙峰的映像效果良好,但對於由於光照不均勻、雜訊幹擾較大等原因使長條圖分布不呈雙峰的映像,二值化效果明顯變差。若目標與背景之間灰階差不明顯,可能出現大塊黑色地區,甚至丟失整幅映像的資訊;僅利用一維灰階長條圖分布,沒有結合映像的空間相關資訊,處理效果不好;當映像中有斷裂現象或者背景有一定雜訊時,無法得到預期效果。 

    為了滿足影像處理應用系統自動化及即時性要求,映像二值化的閾值的選擇最好由電腦自動來完成。下面列舉幾個閾值的自動選擇演算法:

       (1) 平均灰階值法:以映像中所有像素灰階值的平均值為閾值。

       (2) 大津法:又稱最大類間差法,是基於整幅映像的統計特性,實現閾值的自動選取。其原理是把映像長條圖用某一灰階值分割成兩類,分別計算這兩類的像素點數和灰階平均值,然後計算它們的類間方差。當被分割成的兩類類間方差最大時,此灰階值就作為映像二值化處理的閾值。大津法的使用範圍比較廣,不論映像的長條圖有無明顯的雙峰,都能得到較滿意的結果,在很多領域得到了應用和發展。但此方法依然存在一些不足,主要表現在:若目標與背景之間灰階差不明顯,可能出現大塊黑色地區,甚至丟失整幅映像的資訊;僅利用一維灰階長條圖分布,沒有結合映像的空間相關資訊,處理效果不好;當映像中有斷裂現象或者背景有一定雜訊時,無法得到預期效果。

       (3) 邊緣運算元法:採用Laplace運算元、Robert運算元、Sober運算元等對像素點進行灰階級增強或減弱的變換。對於灰階均勻分布的地區內的像素點,這些運算元對其進行灰階減弱;對於在邊緣附近的像素點,這些運算元對其進行灰階增強。

局部閾值法

    由當前像素灰階值與該像素周圍點局部灰階特徵來確定像素的閾值。例如可以將原映像劃分為一些不相交的小塊,將各塊映像的灰階均值作為該部塊映像的閾值,在局部上採用上面的整體閾值法。

    對於目標和背景比較清楚的映像,全域閾值化方法可以取得較好結果。但是如果映像的背景不均勻,或目標灰階變動率比較大,全域方法便不再適用。局部閾值法是用像素灰階值和此像素鄰域的局部灰階特性來確定該像素的閾值的。當照明不均勻、有突發雜訊,或者背景灰階變化較大時,局部閾值確定技術必鬚根據像素的座標位置關係自動確定不同閾值,實施動態自適應二值化處理。局部閾值選取一般將映像劃分為若干子映像,在每個子映像地區上使用整體閾值法,從而可以構成整幅映像的局部閾值法(根據每個子映像確定相應的閾值,具體的閾值確定方法同全域閾值的確定類似)。用這種方法分割後的映像在不同子映像的邊界處有灰階的不連續分布,因此必須採用平滑技術來消除灰階的不連續性。  

    局部閾值法一般用於識別幹擾比較嚴重、品質較差的映像,相對整體閾值方法有更廣泛的應用,但也存在缺點和問題,如實現速度慢、不能保證字元筆畫連通性以及容易出現偽影現象(即在背景域受到噪音幹擾得到筆畫結果)等。比較典型的局部二值化演算法有Bernsen方法、多閾值的梯度強度法、基於紋理映像的方法、最大方差法等。

3、優點

    在數位影像處理中,二值映像佔有非常重要的地位,特別是在實用的影像處理中,以二值影像處理實現而構成的系統是很多的,要進行二值映像的處理與分析,首先要把灰階映像二值化,得到二值化映像,這樣子有利於再對映像做進一步處理時,映像的集合性質只與像素的值為0或255的點的位置有關,不再涉及像素的多級值,使處理變得簡單,而且資料的處理和壓縮量小。二值映像在映像分析中應用非常廣泛,二值映像就是指只有兩個灰階級的映像,二值映像具有儲存空間小,處理速度快,可以方便地對映像進行布爾邏輯運算等特點。更重要的是,在二值映像的基礎上,還可以進一步對影像處理,獲得該映像的一些幾何特徵或者其他更多特徵。

二、程式實現

 opencv編程方法可參看《映像的二值化和灰階化》和《【OpenCV入門指南】第四篇 映像的二值化》

 emgucv編程方法可參看《C# OpenCV學習筆記四之映像二值化》

1、關鍵函數

根據《C# OpenCV學習筆記四之映像二值化》提供的方法,emgucv可以用兩種函數實現二值化。

一種是cvThreshold,另一種是ThresholdBinary,下面分別介紹。

cvThreshold方法 

函數功能:採用Canny方法對映像進行邊緣檢測 

函數原型:

C#
public static double cvThreshold(IntPtr src,IntPtr dst,double threshold,double maxValue,THRESH thresholdType)

函數說明:

第一個參數表示輸入映像,必須為單通道灰階圖。

第二個參數表示輸出的邊緣映像,為單通道黑白圖。

第三個參數表示閾值

第四個參數表示最大值。

第五個參數表示運算方法。

在Emgu.CV.CvEnum.THRESH中可以找到運算方法。

  Value Description
  CV_THRESH_BINARY 0 value = value > threshold ? max_value : 0
  CV_THRESH_BINARY_INV 1 value = value > threshold ? 0 : max_value
  CV_THRESH_TRUNC 2 value = value > threshold ? threshold : value
  CV_THRESH_TOZERO 3 value = value > threshold ? value : 0
  CV_THRESH_TOZERO_INV 4 value = value > threshold ? 0 : value
  CV_THRESH_MASK 7  
  CV_THRESH_OTSU 8 use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values

給表單添加第四個PictureBox,並將SizeModel設定為Zoom

在均衡化功能函數後直接添加下段程式函數,閾值為30,so easy。

//二值化Image<Gray, Byte> threshimg = new Image<Gray, Byte>(histmi.width, histmi.height);CvInvoke.cvThreshold(histimage, threshimg, 30, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);pictureBox4.Image = threshimg.ToBitmap();

ThresholdBinary函數

emgucv提供的方法解釋:Threshold the image such that: dst(x,y) = max_value, if src(x,y)>threshold; 0, otherwise。其實和cvThreshold函數中的第一種運算方法,即CV_THRESH_BINARY一樣。

Image<Gray, Byte> threshimg= grayimg.ThresholdBinary(new Gray(128), new Gray(255));

三、結果分析

與文章《【OpenCV入門指南】第四篇 映像的二值化》演算法進行比對,不同方法片的處理結果。

原文章取閾值為111,實現的二值化效果。

利用emgucv編程,設定閾值為111擷取的二值化。

由於未能擷取原始映像,只是通過擷取的圖片,不知過程中是否有圖片損失。

通過肉眼比較,部分細節還是有些差別。

根據應用需要,調整閾值,從而擷取最優效果。

轉載請標明出處,原文地址:http://www.cnblogs.com/MobileBo/p/3918119.html

四、遺憾

閾值自適應調整目前還木有時間學習,抽時間看看吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.