生活随笔
收集整理的這篇文章主要介紹了
数字图像处理之图像边缘
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖像邊緣主要包含下面幾個部分
導入庫
import numpy
as np
import matplotlib
.pyplot
as plt
import cv2
as cv
圖片輸出函數
def show(img
):if img
.ndim
== 2:plt
.imshow
(img
,cmap
='gray')else:plt
.imshow
(cv
.cvtColor
(img
,cv
.COLOR_RGB2BGR
))plt
.show
()
Premitt算子
Premitt算子一般包含以下兩種:
通過對水平方向和豎直方向的圖片進行處理,然后合成,看最終的效果如何。
kx
= np
.array
([[-1,0,1],[-1,0,1],[-1,0,1]
],dtype
=np
.float32
)
ky
= np
.array
([[-1,-1,-1],[0,0,0],[1,1,1]
],dtype
=np
.float32
)
imgX
= cv
.filter2D
(img
,cv
.CV_64F
,kx
)
imgY
= cv
.filter2D
(img
,cv
.CV_64F
,ky
)
imgXY2
= np
.abs(imgX
)+np
.abs(imgY
)
show
(np
.hstack
([img
,np
.abs(imgX
).clip
(0,255),np
.abs(imgY
).clip
(0,255),np
.abs(imgXY2
).clip
(0,255)]))
處理效果如下所示:
Roberts算子
Roberts算子也有兩種形式,跟Premitt算子大同小異。
kx
= np
.array
([[-1,0],[0,1]
],dtype
=np
.float32
)
ky
= np
.array
([[0,1],[1,0]
],dtype
=np
.float32
)
imgX
= cv
.filter2D
(img
,cv
.CV_64F
,kx
)
imgY
= cv
.filter2D
(img
,cv
.CV_64F
,ky
)
imgXY
= np
.sqrt
(imgX
**2+imgY
**2)
imgXY2
= np
.abs(imgX
)+np
.abs(imgY
)
show
(np
.hstack
([img
,np
.abs(imgX
).clip
(0,255),np
.abs(imgY
).clip
(0,255),np
.abs(imgXY2
).clip
(0,255)]))
但是效果不如前者
Sobel-Feldman、Scharr算子
這兩種算子與上面的兩種算子,卷積核不一樣,其余的地方大同小異,看看效果如何。
imgX
= cv
.Sobel
(img
,cv
.CV_16S
,1,0)
imgY
= cv
.Sobel
(img
,cv
.CV_16S
,0,1)
imgXY
= np
.abs(imgX
)+np
.abs(imgY
)
show
(np
.hstack
([img
,np
.abs(imgX
).clip
(0,255),np
.abs(imgY
).clip
(0,255),np
.abs(imgXY
).clip
(0,255)]))
imgX
= cv
.Scharr
(img
,cv
.CV_64F
,1,0)
imgY
= cv
.Scharr
(img
,cv
.CV_64F
,0,1)
imgXY
= np
.sqrt
(imgX
**2+imgY
**2)
show
(np
.hstack
([img
,np
.abs(imgX
).clip
(0,255),np
.abs(imgY
).clip
(0,255),np
.abs(imgXY
).clip
(0,255)]))
soble-feldmen算子
Scharr算子
Laplacian算子
Laplacian算子基本上卷積核如下圖所示:
opencv中有用來實現的方法
img_lap
= cv
.Laplacian
(img
,cv
.CV_64F
)
show
(np
.abs(img_lap
).clip
(10,255))
LoG算子
LoG算子,是高斯模糊和Laplacian算子結合而成的。
img_blur
= cv
.GaussianBlur
(img
,(3,3),1)
img_log
= cv
.Laplacian
(img_blur
,cv
.CV_64F
)
show
(np
.hstack
([np
.abs(img_lap
).clip
(0,255),np
.abs(img_log
).clip
(0,255)]))
和單純的Laplacian相比,去除了很多噪聲,emmm但是效果不是很好,可能是參數的問題。
Canny算法
Canny算法的處理方式:
opencv中自帶的方法:
img2
= cv
.Canny
(img
,20,200)
show
(np
.hstack
([img
,img2
]))
總結
以上是生活随笔為你收集整理的数字图像处理之图像边缘的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。