數字圖像的距離變換算法

2021-02-13 帥帥Go

一、圖像數位化

通過傳感器獲得的圖像是平面坐標(x,y)的連續函數f(x,y),它的值圖像對應位置的亮度。為了能夠讓計算機來處理,需要對圖像進行採樣,並且對亮度值進行量化。

1、採樣。對連續函數f(x,y)進行採樣,就是分別對x軸和y軸,按照固定間隔取值,得到平面坐標上的M×N個點,將其函數值作為元素生成M行N列的矩陣。

2、量化亮度值。將f(x,y)的值轉化為等價的整數值的過程稱為量化,量化的級別越高,圖像越細緻。通常將亮度值表示為0-255之間的整數。

這樣,在計算機中通常以矩陣表示數字圖像,矩陣的元素對應圖像的亮度信息。

二、距離

滿足以下三個條件的函數D稱作距離

(1)同一性:

(2)對稱性:

(3)三角不等式:

數字圖像的距離有多種定義方式,包括歐式距離、城市街區距離、棋盤距離等。以下以兩坐標點a=(i,j)和b=(k,l)的距離為例,來說明各種距離的定義方式。

歐式距離DE就是通常所說的距離,它定義為

歐式距離在事實上比較直觀,但是平方根計算比較費時,且距離可能不是數。

城市街區距離D4,它定義為在只允許橫向和縱向運動的情況下,從起點到終點的移動步數。用公式表示為

符號D4中的4表示在這種定義下,像素點是4鄰接的,即每個點只與它的上、下、左、右相鄰的4個點之間的距離為1。

如果允許橫向、縱向和沿對角線方向移動,則可以得到棋盤距離D8的定義

符號D8中的8表示在這種定義下,像素點是8鄰接的,即每個點只與它的上、下、左、右、四個對角線方向相鄰的8個點之間的距離為1。

顯然,以上三種距離的定義都滿足距離的定義條件。

三、距離變換

距離變換也叫作距離函數或者斜切算法。它是距離概念的一個應用,圖像處理的一些算法以距離變換為基礎。距離變換描述的是圖像中像素點與某個區域塊的距離,區域塊中的像素點值為0,臨近區域塊的像素點有較小的值,離它越遠值越大。

以二值圖像為例,其中區域塊內部的像素值為1,其他像素值為0。距離變換給出每個像素點到最近的區域塊邊界的距離,區域塊內部的距離變換結果為0。輸入圖像如圖1所示,D4距離的距離變換結果如圖2所示。

圖1:輸入圖像

圖2:D4距離下距離變換結果

下面來討論距離變換算法,其核心是利用兩個小的局部掩膜遍歷圖像。第一遍利用掩模1,左上角開始,從左往右,從上往下。第二遍利用第二個掩模,右下角開始,從右往左,從下往上。掩模形狀如下圖所示:

按照某種距離(如:D4距離或D8距離)對大小為M×N的圖像中的區域塊作距離變換,算法過程如下:

1、建立一個大小為M×N的數組F,作如下的初始化:將區域塊中的元素設置為0,其餘元素設置為無窮;

2、利用掩模1(mask1),左上角開始,從左往右,從上往下遍歷數組,將掩模中P點對應的元素的值作如下更新:

3、利用掩模2(mask2),右下角開始,從右往左,從下往上遍歷數組,將掩模中P點對應的元素的值作如下更新:

最終得到的更新後的數組即為距離變換的結果。

這個算法過程在圖像編邊界需要做出調整,因為在邊界處,掩模不能全部覆蓋圖像,這時可以將掩模中沒有對應元素的位置的值當作0來處理。

四、OpenCV代碼實現

這個算法過程經過很多的改進,但基本原理並沒有區別。開源計算機視覺庫OpenCV中,距離變換算法有相應的實現,聲明如下:

CV_EXPORTS_W void distanceTransform( InputArray src, OutputArray dst,
                                     int distanceType, int maskSize, int dstType=CV_32F);

參數詳解:

InputArray src:輸入圖像,一般為二值圖像;

OutputArray dst:輸出的圖像,距離變換結果;

int distanceType:用於距離變換的距離類型(歐氏距離:DIST_L2 = 2;$D_4$距離:DIST_L1 = 1;$D_8$距離:DIST_C = 3等);

int mask_size:距離變換掩模的大小,一般為3或5;

int dstType:輸出圖像的數據類型,可以為CV_8U或CV_32F。

下面我們用一個具體的例子來展示距離變換的效果。將大小為480*480,其中有三個像素點設置為1,其餘都為0的一張圖片作為輸入圖像,分別在歐式距離、$D_4$距離和$D_8$距離下,距離變換的結果。

效果如下圖所示:

歐式距離下的距離變換

D4距離下的距離變換

D8距離下的距離變換

下面是代碼實現:

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
    
    Mat mat(480, 480, CV_8UC1, Scalar(0)), transMatE, transMatD4, transMatD8;

    
    mat.at<uchar>(100, 200) = 1;
    mat.at<uchar>(200, 100) = 1;
    mat.at<uchar>(300, 300) = 1;

    
    mat = 1 - mat;

    
    imshow("原始圖片", mat);

    
    distanceTransform(mat, transMatE, DIST_L2, 0);
    distanceTransform(mat, transMatD4, DIST_L1, 0, CV_8U);
    distanceTransform(mat, transMatD8, DIST_C, 0);

    
    transMatE.convertTo(transMatE, CV_8U);
    transMatD8.convertTo(transMatD8, CV_8U);

    
    imshow("歐式距離變換後的圖片", transMatE);
    imshow("D4距離變換後的圖片", transMatD4);
    imshow("D8距離變換後的圖片", transMatD8);


    waitKey();

    return 0;

相關焦點

  • 數字圖像處理中常用圖像分割算法有哪些?
    擊上方「新機器視覺」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達數字圖像處理中常用圖像分割算法有哪些
  • 經典的圖像匹配算法----SIFT
    1999年British Columbia大學大衛.勞伊( David G.Lowe)教授總結了現有的基於不變量技術的特徵檢測方法,並正式提出了一種基於尺度空間的、對圖像縮放、旋轉甚至仿射變換保持不變性的圖像局部特徵描述算子-SIFT(尺度不變特徵變換),這種算法在2004年被加以完善。
  • 圖像識別之KNN算法的理解與應用
    該算法既可以用於數據分類,也可以用於數據回歸預測,其核心思路是在訓練樣本中尋找距離最接近待分類樣本的K個樣本。然後,如果目的是分類,則統計這K個樣本中的各個類別數量,數量最多的類別即認為是待分類樣本的類別;如果目的是回歸預測,則計算這K個樣本的平均值作為預測值。圖像識別,本質上也是數據分類,也即把每一張圖像歸類,因此KNN算法可以應用於圖像識別。
  • 結合實例與代碼談數字圖像處理都研究什麼?
    下面給出的12個大的方向,系我認為可以看成是基礎性領域的部分,而且它們之間還互有交叉本文引用地址:http://www.eepw.com.cn/article/201702/344134.htm  1、圖像的灰度調節  圖像的灰度直方圖、線性變換、非線性變換(包括對數變換、冪次變換、指數變換等)、灰度拉伸、灰度均衡、直方圖規定化等等)。
  • OpenCV-Python 圖像分割與Watershed算法|三十四
    目標在本章中,我們將學習使用分水嶺算法實現基於標記的圖像分割我們將看到:cv.watershed()理論任何灰度圖像都可以看作是一個地形表面,其中高強度表示山峰,低強度表示山谷。你開始用不同顏色的水(標籤)填充每個孤立的山谷(局部最小值)。隨著水位的上升,根據附近的山峰(坡度),來自不同山谷的水明顯會開始合併,顏色也不同。
  • 圖像匹配幾種常見算法與實踐
    圖像匹配是指通過一定的匹配算法在兩幅或多幅圖像之間識別同名點。>是一種檢測局部特徵的算法,該算法通過求一幅圖中的特徵點(interest  points, or corner points)及其有關scale 和 orientation 的描述子得到特徵並進行圖像特徵點匹配SIFT特徵不只具有尺度不變性,即使改變旋轉角度,圖像亮度或拍攝視角,仍然能夠得到好的檢測效果。
  • 圖像去噪算法的優點和缺點
    圖像去噪算法的優點和缺點 會飛的碼 發表於 2020-05-04 18:36:00 圖像降噪算法總結 分析各種算法的優點和缺點 1、BM3D
  • 常用圖像邊緣檢測算法詳解
    邊緣檢測是圖像處理和計算機視覺中的基本問題,邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。經分析,由於Robert算子通常會在圖像邊緣附近的區域內產生較寬的響應,故採用上述算子檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。Sobel邊緣檢測算法索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術上,它是一離散性差分算子,用來運算圖像亮度函數的灰度之近似值。
  • 大神帶你玩轉matlab圖像處理(6)——Hough變換
    所以說有些知識說不定你那天就能夠使用到,秉持著「技多不壓身」的原則,本期跟隨過冷水了解一點點圖像處理方面的知識吧!之前公眾號作者:小豬豬有連載大神帶你玩轉matlab圖像處理推文。關於圖像處理的基礎知識過冷水就不再重複講解了,在其基礎上繼續深入學習數字圖像的轉變。
  • 圖像變換在三角函數中的應用
    (二)圖像變換中要注意的幾點:1、如何判定是縱坐標變換還是橫坐標變換?2、解析式變化與圖像變換之間存在怎樣的對應?(1)圖像變換要注意區分哪個是原始函數,哪個是變化後的函數。(2)對於x前面含有係數時,平移變換要注意係數產生的影響。
  • 輕鬆理解圖像縮放算法!最鄰近插值&&雙線性內插值!
    那現在不妨想一想,這簡單效果背後,是怎樣的算法思想呢?今天,將以一種非常簡單、直接的方式,為大家描述圖像縮放算法的基本思想。我們首先需要大概理解一下圖像的概念:有一種圖形格式(位圖),是利用像素點的方式,表述該點的顏色,看下面的圖。
  • 圖像算法工程師必備:圖像的特徵
    圖像處理的第二層境界是圖像分析,圖像分析的重要依據就是圖像特徵。特徵分為兩類,一類是自然特徵,一類人工特徵。自然特徵指的是人眼能看到的視覺特徵,比如亮度,邊緣,輪廓,顏色等。而第二類人工特徵就是上一節講的直方圖或者頻譜等經過圖像變換,人工合成的特徵。
  • MATLAB實驗——FFT變換
    實驗基本原理與設計1 應用傅立葉變換進行圖像處理傅立葉變換是線性系統分析的一個有力工具,它能夠定量地分析諸如數位化系統、採樣點、電子放大器、卷積濾波器、噪音和顯示點等的作用。通過實驗培養這項技能,將有助於解決大多數圖像處理問題。對任何想在工作中有效應用數字圖像處理技術的人來說,把時間用在學習和掌握博裡葉變換上是很有必要的。
  • 傅立葉變換算法(一)
    在實際應用中通常採用快速傅立葉變換以高效計算DFT。   為了在科學計算和數位訊號處理等領域使用計算機進行傅立葉變換,必須將函數xn定義在離散點而非連續域內,且須滿足有限性或周期性條件。這種情況下,使用離散傅立葉變換(DFT),將函數xn表示為下面的求和形式:
  • 一文講解圖像插值算法原理!附Python實現
    在圖像處理中,幾何變換是將一幅圖像映射到另外一幅圖像內的操作,可以大概分為放縮、翻轉、仿射(平移、旋轉)、透視、重映射幾部分。在幾何變換時,無法給有些像素點直接賦值,例如,將圖像放大兩倍,必然會多出一些無法被直接映射的像素點,對於這些像素點,通過插值決定它們的值。且不同插值方式的結果不同。在一幅輸入圖像[u,v]中,灰度值僅在整數位置上有定義。
  • 三角函數圖像變換
    前面已經介紹了三角函數的基本知識,本期進一步介紹三角函數的圖像變換。
  • 數字油畫製作中的k均值聚算法
    ,從理論上實現了類間距離最大的聚類原則.這樣選取的初始中心離散程度較大,能夠較好地體現出圖像中的顏色差異,且每次試驗均可得到相同的初始聚類中心,因而用AkMTI-CCI算法進行圖像顏色聚類不僅可以提高顏色聚類效果,保留更多的顏色細節,而且也增加了算法的穩定性.2)AkMTI-CCI算法收斂速度的提高依賴於下述兩個方面: 首先,傳統的k均值聚類算法中要計算n?
  • 基於圖像的目標區域分割算法研究
    Otsu算法的基本原理是使得分割出來的類間距離較大,而類內之間儘可能保持一定的聚合性,也就是各類中像素與類中心之間的距離儘量較小。根據以上要求,可以假設一個滿足上述要求的公式,即與各類之間的均值距離差成正比,與各類內間距離之和成反比。當取最大時,此時的t就為所求的最佳閾值。表達式如下:
  • 【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化
    】基本概念:亮度、對比度、飽和度、銳化、解析度【數字圖像處理系列二】圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】圖像數據集增強方式總結和實現【數字圖像處理系列四】在圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】一文中我們從圖像灰度變換的角度闡述了圖像增強的各種方式,本文我們將一起學習圖像處理中重點的方式:圖像濾波,圖像濾波分為空間域濾波和頻率域濾波,頻率域濾波我們將在下一節重點說明。
  • MATLAB比較圖像的相似度-圖像搜索算法
    關注我們獲得更多精彩內容一、圖像相似度計算相關原理通過圖片進行搜索相似圖標的算法實現是:利用感知「感知哈希算法」,就是每一張圖片都按照某種桂林生成唯一的「標識」,通過對「標識」進 比較,那麼可以判斷兩張照片是相似以及相似程度。