一管闷、照明與圖像
光通量(Φ 流明 lm):光通量指人眼所能感覺到的輻射功率套媚,它等于單位時間內(nèi)某一波段的輻射能量和該波段的相對視見率的乘積仪或。
輻照度(E 勒克斯 lux):輻照度指投射到一平表面上的輻射通量密度宗侦。指到達一表平面上颖系,單位時間嗅剖,單位面積上的輻射能。
1lux = 1 lm /m3
RGB與CMYK顏色模型
RGB:紅綠藍三原色
CMYK:品紅 黃 青 三補色
HSI顏色模型
- 色調(diào)H是描述純色的屬性(如紅色嘁扼、黃色等)
- 飽和度S表示的是一種純色被白光稀釋的程度的度量
- 亮度體現(xiàn)了無色的光強度概念信粮,是一個主觀的描述
OpenCV顏色空間轉(zhuǎn)換
dst = cv.cvtColor(src, dst, code)
*src:輸入
dst:輸出
code:色彩空間轉(zhuǎn)換模式
- OpenCV中,彩色圖像缺省為BGR格式趁啸,顏色三通道順序為B强缘,G,R不傅,分別對應(yīng)索引0旅掂,1,2
- OpenCV中访娶,HSI/HSV顏色空間中H的取值范圍是0-180商虐,其他兩個是0-255
- 兩個相似的概念:HSI和HSV空間。HSV里面的v指的是RGB里面的最大的值崖疤,v=max(r秘车,g,b)劫哼;而HSI的是平均值叮趴,l=(r+g+b)/3;另外兩個分量應(yīng)該是一樣的
二权烧、圖像平滑濾波
圖像的卷積
- 圖像濾波由卷積定義:
- 若濾波器對稱:
- 圖像卷積操作眯亦,由卷積核逐點乘積后累加得到
- 圖像卷積操作需要事先將濾波器上下左右反轉(zhuǎn)再計算
平均濾波
- 在一個小區(qū)域內(nèi)像素值平均:
使圖像邊緣變得平滑伤溉,損失了圖像的細節(jié),核越大妻率,圖像越模糊乱顾,對椒鹽噪聲效果不佳
加權(quán)平均濾波
- 在一個小區(qū)域內(nèi)像素值加權(quán)平均:
高斯濾波:根據(jù)像素位置賦不同的權(quán)值,臨近的像素具有更高的重要度
使圖像邊緣變得平滑的同時不損失圖像的細節(jié)舌涨,應(yīng)用廣泛
雙邊濾波
- 權(quán)值同時與像素位置和灰度值有關(guān)
其中
分別為空域核(高斯核)和值域核(類階躍高斯核)
中值濾波
- 確定窗口及位置(含有奇數(shù)個像素)
- 窗口內(nèi)像素按灰度大小排序
- 取中間值代替原窗口中心像素值
對孤立噪聲特別有效糯耍,核越大圖像越模糊扔字,核必須是奇數(shù)
三囊嘉、數(shù)學(xué)形態(tài)學(xué)濾波
膨脹
腐蝕
腐蝕:灰度值大的變小(圖像變暗)
膨脹:灰度值大的變大(圖像變亮)
膨脹腐蝕都會使圖像顆粮镂化
開閉運算
開運算:先腐蝕后膨脹
閉運算:先膨脹后腐蝕
先開后閉:可有效去除噪聲
OpenCV 圖像濾波
濾波函數(shù)
dst = cv2.filter2D(src , ddepth, kernel, dst, anchor, delta, borderType)
src:輸入圖像
ddepth:目標圖像的所需深度扭粱,包括CV_16S/CV_32F/CV_64F等
kernel:卷積核(或相當于相關(guān)核),單通道浮點矩陣震檩;如果要將不同的內(nèi)核應(yīng)用于不同的通道琢蛤,請使用拆分將圖像拆分為單獨的顏色平面,然后單獨處理它們
dst:輸出圖像抛虏,與輸入圖像尺寸和通道數(shù)相同
anchor:內(nèi)核的錨點博其,指示內(nèi)核中過濾點的相對位置;錨應(yīng)位于內(nèi)核中;默認值(-1,-1) 表示錨位于內(nèi)核中心
delta:在將它們存儲在dst中之前迂猴,將可選值添加到已過濾的像素中慕淡。類似于偏置
borderType:卷積填充方式,包括BORDER_CONSTANT, BORDER_REPLICATE, BORDER_REFLECT 等
常用濾波函數(shù)
- 平均濾波
dst=cv2.blur(src沸毁,ksizel峰髓,dst,anchor息尺,borderType)
- 高斯平滑濾波
dst=cv2.GaussianBlur(src携兵,ksize,sigmaX搂誉,dst徐紧,sigmaY,borderType)
- 中值濾波
dst=cv2.medianBlur(src炭懊,ksizeL并级,dst)
參數(shù) 描述 ksize
濾波器大小,如(5,5)
- 雙邊濾波
dst=cv2. bilateralFilter(src, d, sigmaColor, sigmaSpace, dst, borderType)
參數(shù) 描述 src
原始圖像:8-bit或floating-point凛虽,1-channel或3-channel dst
目標圖像:size和type與原始圖像相同 d
過濾期間使用的各像素鄰域的直徑 sigmacolor
色彩空間的sigma參數(shù)死遭,該參數(shù)較大時,各像素鄰域內(nèi)相距較遠的顏色會被混合到一起凯旋,從而造成更大范圍的半相等顏色 sigmaSpace
坐標空間的sigma參數(shù)呀潭,該參數(shù)較大時钉迷,只要顏色相近,越遠的像素會相互影響 borderType
卷積填充方式钠署,包括BORDER_CONSTANT糠聪,BORDERREPLICATE, BORDER_REFLECT等
四、邊緣檢測
計算過程
- 1.使用相應(yīng)邊緣檢測濾波器(如果是卷積核需要進行上下左右翻轉(zhuǎn))谐鼎;
- 2.進行卷積運算計算邊緣檢測結(jié)果
基本算子
- Robert算子卷積核
- Sobel 算子卷積核(常用)
- Laplace算子
- LoG算子
- 邊緣檢測即圖像差分
- 常見邊緣檢測算子包括Robert算子舰蟆,Sobel算子,LoG 算子等狸棍,其中Sobel算子最為常用
- 二維圖像的邊緣具有強度和方向兩個性質(zhì)
-
Canny算子
優(yōu)點:邊緣可自動連通
- 算法步驟:
1.平滑圖像
- 使用高斯函數(shù)完成平滑,以 5×5 為例
2.計算梯度(幅值和方向)
- 使用Sobel邊緣檢測算子對平滑圖像進行xy方向的邊緣檢測身害,假設(shè)得到結(jié)果分別為,
- 進一步計算梯度幅值和方向:
- 方向離散化
3.梯度幅值進行非極大值抑制
細化梯度幅值圖像中的屋脊帶草戈,只保留幅值局部變化最大的點
4.自動邊緣連接
- 對上一步得到的圖像使用低塌鸯、高閾值閾值化,得到三幅圖像
對應(yīng)假邊緣唐片,去除
對應(yīng)真邊緣丙猬,全部保留
連接:臨接像素中是否有屬于的像素- 通過查看弱邊緣像素及其8個鄰域像素,只要其中一個為強 邊緣像素费韭,則該弱邊緣點就可以保留為真實的邊緣茧球。
數(shù)學(xué)形態(tài)學(xué)邊緣檢測
- 邊緣梯度(gradient)
定義:灰度膨脹圖像與灰度腐蝕圖像的差值
- 頂帽與黑帽變換
頂帽變換(tophat)定義為圖像與其開運算的差值:
黑帽變換(blackhat)定義為圖像閉運算與自身的差值:
頂帽變換和底帽變換的結(jié)合使用能夠應(yīng)用于灰度圖像的對比度增強
常用做法:將源圖像加上頂帽變換再減去底帽變換 →增強對比度
- 擊中或擊不中變換(HMT)
輸出圖像由所有在中匹配的像素(擊中)和未在中匹配的像素(擊不中)組成
OpenCV實現(xiàn)邊緣檢測
- Sobel算子邊緣檢測
dst = cv2.Sobel(src , ddepth , dx , dy [, dst [, ksize [, scale [, delta [, borderType ]]]]] )
- Laplace算子
dst = cv2.Laplacian( src , ddepth [, dst [, ksize [, scale [, delta [, borderType ]]]]] )
- Canny算子
dst = cv2.Canny( image , threshold1 , threshold2 [, edges [, apertureSize [, L2gradient ]]] )
參數(shù) 描述 ddepth 目標圖像的所需深度,包括CV_16S/CV_32F/CV_64F等 ksize 濾波器大小星持,通城缆瘢可選為(5,5)或(3,3),或直接使用缺省
- 形態(tài)學(xué)濾波
dst = cv2.morphologyEx( src , op , kernel [, dst [, anchor [, iterations [, borderType [, borderValue ]]]]] )
參數(shù) 描述 src 原圖像 op 形態(tài)學(xué)操作钉汗,包括MORPH_ERODE, MORPH_DILATE, MORPH_OPEN, MORPH_CLOSE,MORPH_GRADIENT, MORPH_TOPHAT, MORPH_BLACKHAT, MORPH_HITMISS kernel 濾波結(jié)構(gòu)元素羹令,參見getStructuringElement iterations 進行操作的次數(shù)
dst = cv2.getStructuringElement(shape , ksize [, anchor ] )
這個函數(shù)的第一個參數(shù)表示內(nèi)核的形狀,有三種形狀可以選擇损痰。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
橢圓形:MORPH_ELLIPSE;
1.OpenCV提供了Sobel福侈,Canny等函數(shù)用于邊緣檢測
2. OpenCV提供了MorphologyEx函數(shù)用于形態(tài)學(xué)濾波
五、圖像變換
常見幾何變換
- 放縮
- 平移
- 旋轉(zhuǎn)
- 鏡像
距離變換
- 通常作用于二值圖像上卢未,描述的是該位置像素點到最近的區(qū)域邊界的距離肪凛。如果假設(shè)背景為黑(對應(yīng)值為0),則為到最近0值的距離
對數(shù)極坐標變換(Log-Polar變換)
- 將圖像像素坐標轉(zhuǎn)換為極坐標辽社,然后對距離取對數(shù)
變換公式:
反變換公式:
Log-Polar變換應(yīng)用:全景展開
六伟墙、灰度直方圖
灰度直方圖是關(guān)于灰度級分布的函數(shù),是對圖像中灰度級分布的統(tǒng)計滴铅〈量灰度直方圖是將數(shù)字圖像中的所有像素,按照灰度值的大小汉匙,統(tǒng)計其出現(xiàn)的頻率拱烁∩希灰度直方圖是灰度級的函數(shù),它表示圖像中具有某種灰度級的像素的個數(shù)戏自,反映了圖像中某種灰度出現(xiàn)的頻率邦投。通過直方圖可判斷圖像曝光及對比度等情況 .
越集中對比度越低
直方圖均衡化
- 直方圖均衡化的作用就是圖像增強
需要滿足條件:亮的依然亮,暗的依然暗擅笔。 - 直方圖映射方法:
局部直方圖均衡化
- 在圖像的一個小鄰域內(nèi)使用直方圖均衡化志衣,直方圖均衡可增加圖像對比度
缺點:在照度正常區(qū)域?qū)Ρ榷壤笕菀壮霈F(xiàn)明暗相間條紋
利用局部直方圖統(tǒng)計進行灰度增強
- 在圖像的每個小鄰域內(nèi),計算局部直方圖猛们,進而計算灰度和方差念脯;
- 根據(jù)需求,對圖像的亮部或暗部進行增強阅懦。如前例需對暗部增強和二,
(1)計算局部均值,與全局均值耳胎,如,則認為該點是候選點
(2)進一步計算局部方差與全局方差惕它,如怕午,且(對標準差為0的區(qū)域不增強)淹魄,則滿足增強條件
(3)對同時滿足(1)郁惜,(2)條件的點進行增強:
七、霍夫(Hough)變換
- 功能:確定圖像中哪些點對應(yīng)一條直線
- 核心思想:將原坐標(x甲锡,y)轉(zhuǎn)換到參數(shù)空間中表示兆蕉,進一步利用投票機制解決魯棒性問題。
- 直線方程表達:
(1)斜率/截距:每一條直線對應(yīng)一個缤沦,
(2)法線式:
- 直角坐標系的一點,對應(yīng)參數(shù)空間中一條近似正弦曲線:
- 同一條直線上的多個點包蓝,在空間中必相交于一點
Hough變換步驟
- 將空間量化成許多小格
- 根據(jù)平面每一個點代入的量化值测萎,算出各個
- 將對應(yīng)格計數(shù)累加
- 當全部點變換后,對小格進行檢驗(投票機制)届巩。設(shè)置累計閾值硅瞧,計數(shù)器大于的小格對應(yīng)于共線點,其可以用作直線擬合參數(shù)恕汇。小于T的反映非共線點腕唧,丟棄不用
圖像變換OpenCV函數(shù)
- 距離變換
dst = cv.distanceTransform( src, distanceType , maskSize [ , dst [, dstType ]] )
參數(shù) | 功能 |
---|---|
distanceType |
距離計算方式冒嫡,DIST_L1 , DIST_L2 或 DIST_C
|
maskSize |
掩模尺寸四苇,可取DIST_MASK_PRECISE 或DIST_MASK_3孝凌,5 等 |
- Log-polar變換
dst = cv.logPolar( src , center , M , flags [, dst] )
參數(shù) | 功能 |
---|---|
center |
變換中心點 |
M |
幅值尺度參數(shù) |
flags |
標志位,是插值方法和下面選項的組合:CV_WARP_FILL_OUTLIERS 填充目標圖像中的所 有像素月腋;CV_WARP_INVERSE_MAP 表示矩陣是從目標圖像到源圖像的反變換 |
- 計算直方圖
matplotlib.pyplot.hist( x, bins=None, range=None, ...)
參數(shù) | 功能 |
---|---|
bins |
多少個柱 |
range |
顯示的范圍 |
- 直方圖均衡化
dst = cv.equalizeHist( src [, dst] )
- 標準Hough變換
lines = cv.HoughLines( image , rho , theta , threshold [, lines [, srn [, stn [, min_theta [, max_theta ]]]]] )
參數(shù) | 功能 |
---|---|
image |
輸入圖像蟀架,應(yīng)為二值圖像,通常使用邊緣檢測結(jié)果榆骚; |
rho |
線段以像素為單位的距離精度片拍,double類型的,推薦用1.0 |
theta |
線段以弧度為單位的角度精度妓肢,推薦用numpy.pi/180 |
threshod |
累加平面的閾值參數(shù)捌省,int類型,超過設(shè)定閾值才被檢測出線段碉钠,值越大纲缓,基本上意味著檢出的線 段越長,檢出的線段個數(shù)越少 |
- 累計概率Hough變換
lines = cv.HoughLinesP( image , rho , theta , threshold [, lines [, minLineLength [, maxLineGap ]]] )
效果更好喊废,能檢測大部分的直線線條祝高!
八、圖像分割
- 目標:將圖像劃分為不同區(qū)域
- 圖像分割是中層視覺的重要內(nèi)容污筷,具有廣泛應(yīng)用
- 圖像分割的主要方法包括閾值法工闺、區(qū)域法等
- 圖像標記為分割后的結(jié)果打上不同標簽,便于后續(xù)處理
灰度閾值分割
-
假設(shè):圖像中的目標區(qū)和背景區(qū)之間或者不同目 標區(qū)之間瓣蛀,灰度存在明顯差異
凡是灰度值包含于z的像素都變成某一灰度值陆蟆,其 他的變成另一個灰度值,則該圖像就以為界被分成兩個區(qū)域
特殊的惋增,如果=1和=0叠殷,分割后的圖像為二值圖像
自動閾值分割
自動確定最佳閾值,使背景和目標之間的差異 最大
- 大津(Otsu)算法原理I
根據(jù)統(tǒng)計分析理論器腋,最佳閾值確定的最佳二分類應(yīng)使類內(nèi)方差最小溪猿,等同于類間方差最大
大津算法基本思想:確定使灰度直方圖類間方差最大的最佳閾值假設(shè)灰度直方圖已經(jīng)歸一化,即
- 假設(shè)閾值將像素灰度劃為兩類:和纫塌,則每一類出現(xiàn)的概率:
其中 诊县。顯然有- 兩類的類內(nèi)方差:
對應(yīng)的類間方差:
- 顯然,是關(guān)于最佳閾值r的隱函數(shù)措左,應(yīng)選取:
- 大津算法是常用的一類灰度閾值自動選取方式依痊,目標是令類間方差最大
- 大津算法求解采用遍歷方式,思想直接,實現(xiàn)速度快胸嘁。
OpenCV邊緣輪廓分割
image , contours , hierarchy = cv.findContours( image, mode, method [, contours [, hierarchy [,offset ]]])
參數(shù) 含義 image
單通道圖像矩陣瓶摆,可以是灰度圖,但更常用的是經(jīng)過邊緣檢測算子處理后的二值圖像 contours
定義為 vector<vector<Point>>contours
性宏,是一個輪廓列表hierarchy
存在嵌套輪廓時群井,分別為第 i
個輪廓的后一個輪廓、前一個輪廓毫胜、父輪廓书斜、內(nèi)嵌輪廓的索引編號mode
定義輪廓的檢索模式, 包括 CV_RETR_EXTERNAL
只檢測最外圍輪廓,CV_RETR_LIST
檢測所有輪廓,但不建立等級關(guān)系等method
包括 CV_CHAIN_APPROX_SIMPLE
僅保存輪廓的拐點信息酵使,把所有輪廓拐點處的點保存入contours
等offset
所有的輪廓信息相對于原始圖像對應(yīng)點的偏移量, 缺省不設(shè)置
局部閾值分割
-
全局閾值法存在的問題
多閾值分割
1. 局部閾值法可有效解決照明不均的問題
2. 多閾值法是二值化分割方法的擴展荐吉,可解決多值目標 的分割問題
區(qū)域生長法分割
- 大津算法的局限性
對于漸變的圖像分割效果不佳
區(qū)域生長法:從種子點開始,按照一定準則(如 相鄰像素灰度相似性)向周圍擴散 口渔,將鄰域相似像素加入?yún)^(qū)域中
區(qū)域生長實現(xiàn)步驟:
- 對圖像順序掃描样屠。找到第1個還沒有歸屬的像素, 設(shè)該像素為;
- 以為中心, 考慮(的8鄰域像素,如果滿足生長 準則, 將與 合并, 同時將壓入堆棧;
- 從堆棧中取出一個像素, 把它當作返回到步驟2;
- 當堆棧為空時,返回到步驟1;
- 重復(fù)步驟1 - 4直到圖像中的每個點都有歸屬時。生長結(jié)束绢馍。
圖像分裂
- 對區(qū)域分裂合并法無需預(yù)先指定種子點,它按某種一致性準則分裂 或者合并區(qū)域。
- 可以先進行分裂運算,然后再進行合并運算;也可以分裂和合并運算 同時進行,經(jīng)過連續(xù)的分裂和合并,最后得到圖像的精確分割效果勤揩。
- 分裂合并法對分割復(fù)雜的場景圖像比較有效。
1. 區(qū)域生長法基于相鄰像素間的相似性秘蛔,由種子像素逐 步生長得到
2. 分裂-合并基于圖像塊內(nèi)在的相似性,通過不斷分裂得 到區(qū)域外邊界傍衡,通過合并將不同塊連接
分水嶺分割
- 如果以圖像位置為坐標深员,則圖像可以看作是地形俯視圖,其中“山峰的高度”與圖像中的 灰度值對應(yīng)蛙埂。
- 假設(shè)在每個“盆地”的最低點開始打洞讓水漫上來倦畅,并且讓水以均勻速率上升。那么绣的,當不同“盆地”的水開 始匯聚時叠赐,能通過修建一個“水壩”擋住這種聚合的弧線就是圖像的分界線
漫水原則
局部極小值點:該點對應(yīng)一個盆地的最低點,當我們在盆地滴一滴水的時候屡江,由于重力作用芭概,水最終會匯聚到該點。注意:可能存在一個最小值面惩嘉,該平面內(nèi)的都是最小值點罢洲。
盆地的其它位置點:該位置滴的水滴會匯聚到局部最小點。
盆地的邊緣點:是該盆地和其它盆地交接點文黎,在該點滴一滴水惹苗,會等概率的流向任何一個盆地殿较。
分水嶺算法的過分割問題
由于噪聲點或者其它干擾因素的存在,使用分水嶺算法常常存在過度分 割的現(xiàn)象桩蓉,這是因為很多很小的局部極值點的存在
在初始時給marker淋纲,改善過分割問題,為了解決過度分割的問題院究,可以使用基于標記(mark)圖像的分水嶺算法洽瞬,就是指定mark 圖像,在這個區(qū)域的洪水淹沒過程中儡首,水平面都是從定義的marker開始的片任,這樣可以避 免一些很小的噪聲極值區(qū)域的分割。
Opencv實現(xiàn)
區(qū)域生長法:
retval , image , mask , rect = cv.floodFill( image , mask , seedPoint , newVal [, loDiff [, upDiff [, flags]]] )
分水嶺算法:markers = cv.watershed( image, markers
#marker種子點