Python基于OpenCV的土壤裂缝分割系统[源码&部署教程]
1.圖片演示
2.視頻演示
3.項目背景
在一幅圖像中包括的內(nèi)容有很多,除了目標物體之外,還有背景信息以及各類噪聲信息。那么要想能夠從多種內(nèi)容的數(shù)字圖像當中直接提取出我們所需要的目標物體,就需要加強目標的圖像特征,削弱干擾物的圖像特征。圖像分割中的二值化分割就能實現(xiàn)如上的功能。
圖像二值化分割就是將圖像上的像素點的灰度值根據(jù)某種或某些算法設(shè)置為0或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果。將采集的圖像信息灰度化之后仍不能較為清晰的識別裂縫信息,采用圖像二值化分割可以明顯的反映出裂縫信息與背景信息,十分直觀的識別出裂縫。常用的二值化方法有全局二值化和局部自適應二值化。
(1)全局二值化
最為常見的二值化分割方法是全局二值化分割。具體實現(xiàn)原理是設(shè)置一個全局閾值T,用該閾值T將圖像中的像素數(shù)據(jù)信息分成兩個部分,即像素值大于T的像素群和像素值小于T的像素群。例如,我們可以將像素值大于T的像素群中的像素設(shè)定為白色(或者為黑色),像素值小于T的像素群中的像素設(shè)定為黑色(或者為白色)。
選擇合適的閾值將裂縫信息與背景信息及干擾物信息有效地進行分割。
但實際操作中由于受光線的影響,采集圖像的明暗難以掌握,很難選擇統(tǒng)的閾值進行分割。
(2)局部自適應二值化
為了改善全局二值化的缺陷,局部二值化方法應運而生。
局部二值化方法,就是根據(jù)某些預先指定的規(guī)則,將整幅圖像按照條件劃分為若干個窗口,然后將這些窗口中的每一個窗口中的圖像的每一個像素點,根據(jù)其像素值使用同一個的閾值T將該窗口內(nèi)的圖像的像素劃分為兩個部分,從而進行二值化處理。
當然,局部二值化也有其自身的不足,這個不足就是需要對閾值T的取值進行預先的選定。然而,這個閾值的選定過程是沒有任何理論支持的,以往的學看的一般做法為僅僅取該窗口中像素點的像素值的平局值,或者是根據(jù)某些實際實驗中得出閾值T。
4.Canny邊緣檢測
CV2提供了提取圖像邊緣的函數(shù)canny。其算法思想如下:
高斯濾波
gaussian = cv2.GaussianBlur(color_img, (gaussian_ksize,gaussian_ksize), gaussian_sigmax)color_img 輸入圖片
gaussian_ksize 高斯核大小,可以為方形矩陣,也可以為矩形
gaussian_sigmax X方向上的高斯核標準偏差
Canny邊緣檢測器是一種被廣泛使用的算法,并被認為是邊緣檢測最優(yōu)的算法,該方法使用了比高斯差分算法更復雜的技巧,如多向灰度梯度和滯后閾值化
步驟
平滑圖像:使用高斯濾波器與圖像進行卷積,平滑圖像,以減少邊緣檢測器上明顯的噪聲影響
計算圖像的梯度和方向:圖像中的邊緣可以指向各個方向,這里計算圖像的梯度,并將梯度分類為垂直、水平和斜對角。
非最大值抑制:利用上一步計算出來的梯度方向,檢測某一像素在梯度的正方向和負方向上是否是局部最大值,如果是,則該像素點保留為邊緣點,否則該像素點將被抑制。
雙閾值算法檢測和連接邊緣:仍然存在由于噪聲和顏色變化引起的一些邊緣像素。為了解決這些雜散響應,必須用弱梯度值過濾邊緣像素,并保留具有高梯度值的邊緣像素,可以通過選擇高低閾值來實現(xiàn)
5.Sobel邊緣檢測
Sobel算子:是離散微分算子(discrete differentiation operator),用來計算圖像灰度的近似梯度,梯度越大越有可能是邊緣。
Soble算子的功能集合了高斯平滑和微分求導,又被稱為一階微分算子,求導算子,在水平和垂直兩個方向上求導,得到的是圖像在X方法與Y方向梯度圖像。
缺點:比較敏感,容易受影響,要通過高斯模糊(平滑)來降噪。
算子是通過權(quán)重不同來擴大差異。
(1)梯度計算:(在兩個方向求導,假設(shè)被作用圖像為 I)
水平變化: 將 I 與一個奇數(shù)大小的內(nèi)核 Gx進行卷積。比如,當內(nèi)核大小為3時, Gx的計算結(jié)果為:
垂直變化: 將 I 與一個奇數(shù)大小的內(nèi)核 Gy進行卷積。比如,當內(nèi)核大小為3時, Gy的計算結(jié)果為:
在圖像的每一像素上,結(jié)合以上兩個結(jié)果求出近似梯度:
有時也用下面更簡單公式代替,計算速度快:(最終圖像梯度)。
(2)Scharr:當內(nèi)核大小為3時, 以上Sobel內(nèi)核可能產(chǎn)生比較明顯的誤差(畢竟,Sobel算子只是求取了導數(shù)的近似值)。 為解決這一問題,OpenCV提供了 Scharr 函數(shù),但該函數(shù)僅作用于大小為3的內(nèi)核。該函數(shù)的運算與Sobel函數(shù)一樣快,但結(jié)果卻更加精確,不怕干擾,其內(nèi)核為:
(3)Sobel/Scharr提取邊緣(求導)步驟:
1)高斯模糊平滑降噪:
GaussianBlur( src, dst, Size(3,3), 0, 0, BORDER_DEFAULT );
2)轉(zhuǎn)灰度:
cvtColor( src, gray, COLOR_RGB2GRAY );
3)求X和Y方向的梯度(求導):
Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);
Sobel(gray_src, ygrad, CV_16S, 0, 1, 3);
Scharr(gray_src, xgrad, CV_16S, 1, 0);
Scharr(gray_src, ygrad, CV_16S, 0, 1);
4)像素取絕對值:
convertScaleAbs(A, B); //計算圖像A的像素絕對值,輸出到圖像B
[圖片上傳失敗…(image-4ea8ad-1662621323461)]
5)相加X和Y,得到綜合梯度,稱為振幅圖像:
addWeighted( A, 0.5,B, 0.5, 0, AB); //混合權(quán)重相加,效果較差
6.Laplacian算子邊緣檢測
Laplacian算子利用二階導數(shù)信息,具有各向同性,即與坐標軸方向無關(guān),坐標軸旋轉(zhuǎn)后梯度結(jié)果不變。使得圖像經(jīng)過二階微分后,在邊緣處產(chǎn)生一個陡峭的零交叉點,根據(jù)這個對零交叉點判斷邊緣。其4鄰域系統(tǒng)和8鄰域系統(tǒng)的Laplacian算子的模板分別如圖所示。
通常使用的拉普拉斯算子3×3模板如圖所示:
Laplacian算子對噪聲比較敏感,Laplacian算子有一個缺點是它對圖像中的某些邊緣產(chǎn)生雙重響應。所以圖像一般先經(jīng)過平滑處理,通常把Laplacian算子和平滑算子結(jié)合起來生成一個新的模板。
7.代碼實現(xiàn)
I=imread('lena.bmp'); I=im2double(I); %figure; %imshow(I);title('org img');[height width R]=size(I); for i=2:height-1for j=2:width-1L(i,j)=4*I(i,j)-I(i-1,j)-I(i+1,j)-I(i,j-1)-I(i,j+1);end end %figure; %imshow(L,[]);%G(i,j)=0.3*L(i,j)+0.7*I(i,j); %figure; %imshow(G,[]);for i=1:height-1for j=1:width-1if (L(i,j)<0.2)L(i,j)=1;else L(i,j)=0;endend end figure; imshow(L,[]);8.系統(tǒng)整合
9.完整源碼&環(huán)境部署視頻教程&自定義UI界面
10.參考文獻
- [1]農(nóng)田土壤表面干縮裂縫的隨機分布統(tǒng)計特征[J]. 張展羽,朱文淵,朱成立,王策,吳春輝,司涵. 農(nóng)業(yè)工程學報. 2013(16)
- [2]牛肉大理石花紋圖像特征信息提取及自動分級方法[J]. 周彤,彭彥昆. 農(nóng)業(yè)工程學報. 2013(15)
- [3]元謀干熱河谷區(qū)退化坡地土壤裂縫形態(tài)發(fā)育的影響因子[J]. 熊東紅,楊丹,李佳佳,蘇正安,董一帆,翟娟. 農(nóng)業(yè)工程學報. 2013(01)
- [4]影響?zhàn)ば酝帘砻娓煽s裂縫結(jié)構(gòu)形態(tài)的因素及定量分析[J]. 唐朝生,施斌,劉春,王寶軍. 水利學報. 2007(10)
- [5]考慮裂隙及雨水入滲影響的膨脹土邊坡穩(wěn)定性分析[J]. 姚海林,鄭少河,陳守義. 巖土工程學報. 2001(05)
總結(jié)
以上是生活随笔為你收集整理的Python基于OpenCV的土壤裂缝分割系统[源码&部署教程]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经济学计算机是必修课吗,大学中经济学专业
- 下一篇: Shiro在线刷新权限