生活随笔
收集整理的這篇文章主要介紹了
数字图像处理之Canny编程实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Canny邊緣檢測算法的流程如下所示:
在某一角度范圍內(nèi),我們將這一范圍內(nèi)的最大值保留,其余的都置為0.
代碼如下:
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
()img
= cv
.imread
('E:/DataSolve/sc.jpg',0)
img_blur
= cv
.GaussianBlur
(img
,(5,5),2)
gradX
= cv
.Sobel
(img
,cv
.CV_64F
,1,0)
gradY
= cv
.Sobel
(img
,cv
.CV_64F
,0,1)
R
= np
.abs(gradX
)+np
.abs(gradY
)
T
= np
.arctan
(gradY
/(gradX
+1e-3))
h
,w
= R
.shape
img_thin
= np
.zeros_like
(R
)
for i
in range(1,h
-1):for j
in range(1,w
-1):theta
= T
[i
,j
]if -np
.pi
/8 <= theta
< np
.pi
/8:if R
[i
,j
] == max([R
[i
,j
],R
[i
,j
-1],R
[i
,j
+1]]):img_thin
[i
,j
]=R
[i
,j
]elif -3*np
.pi
/ 8 <= theta
<-np
.pi
/ 8:if R
[i
,j
] == max([R
[i
,j
],R
[i
-1,j
+1],R
[i
+1,j
-1]]):img_thin
[i
,j
]=R
[i
,j
]elif np
.pi
/ 8 <= theta
< 3*np
.pi
/ 8:if R
[i
,j
] == max([R
[i
,j
],R
[i
-1,j
-1],R
[i
+1,j
+1]]):img_thin
[i
,j
]=R
[i
,j
]else:if R
[i
,j
] == max([R
[i
,j
],R
[i
-1,j
],R
[i
+1,j
]]):img_thin
[i
, j
] = R
[i
, j
]
th1
= 10
th2
= 50
h
,w
= img_thin
.shape
img_edge
= np
.zeros_like
(img_thin
,dtype
=np
.uint8
)
for i
in range(1,h
-1):for j
in range(1,w
-1):if img_thin
[i
,j
]>=th2
:img_edge
[i
,j
]=255elif img_thin
[i
,j
]>th1
:around
= img_thin
[i
-1:i
+2,j
-1:j
+2]if(around
.max()>= th2
):img_edge
[i
,j
]=255
show
(np
.hstack
([img
,img_edge
]))
效果不是那么盡如人意,一方面是參數(shù)設(shè)置問題,另一方面就是opencv中封裝的方法是經(jīng)過優(yōu)化的,而我們自己實(shí)現(xiàn)的,則有些“粗糙”。不過思想是正確的,缺的就是方法上的改進(jìn)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的数字图像处理之Canny编程实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。