Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Python ʵÏÖ Canny ±ßÔµ¼ì²âËã·¨
 
×÷Õߣº caoqi95
  3720  次浏览      32
 2020-8-21
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËÒ»Ì×±ßÔµ¼ì²âµÄÀíÂÛ£¬·Ö½×¶ÎµÄ½âÊÍÈçºÎʵÏÖ±ßÔµ¼ì²â£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­£¬ÍƼö¡£

Canny ±ßÔµ¼ì²âËã·¨ÓɼÆËã»ú¿ÆÑ§¼Ò John F. Canny ÓÚ 1986 ÄêÌá³öµÄ¡£Æä²»½öÌṩÁËËã·¨£¬»¹´øÀ´ÁËÒ»Ì×±ßÔµ¼ì²âµÄÀíÂÛ£¬·Ö½×¶ÎµÄ½âÊÍÈçºÎʵÏÖ±ßÔµ¼ì²â¡£Canny ¼ì²âËã·¨°üº¬ÏÂÃæ¼¸¸ö½×¶Î£º

1.»Ò¶È»¯

2.¸ß˹ģºý

3.¼ÆËãͼƬÌݶȷùÖµ

4.·Ç¼«´óÖµÒÖÖÆ

5.Ë«ãÐֵѡȡ

»Ò¶È»¯

»Ò¶È»¯Êµ¼ÊÉÏÊÇÒ»ÖÖ½µÎ¬µÄ²Ù×÷£¬¿ÉÒÔ¼õÉÙ¼ÆËã¡£Èç¹ûËã·¨²»½øÐÐÉ«²ÊÏà¹ØµÄʶ±ðµÄ»°£¬²»»Ò¶È»¯£¬Ò²¿ÉÒÔÖ±½Ó½øÐкóÃæµÄ½×¶Î¡£

# »Ò¶È»¯
def gray(self, img_path):
"""
¼ÆË㹫ʽ£º
Gray(i,j) = [R(i,j) + G(i,j) + B(i,j)] / 3
or :
Gray(i,j) = 0.299 * R(i,j) + 0.587 * G(i,j) + 0.114 * B(i,j)
"""
# ¶ÁȡͼƬ
img = plt.imread(img_path)
# BGR ת»»³É RGB ¸ñʽ
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# »Ò¶È»¯
img_gray = np.dot(img_rgb[...,:3], [0.299, 0.587, 0.114])

return img_gray

¸ß˹ģºý

ÔÚʵ¼ÊµÄͼƬÖУ¬¶¼»á°üº¬ÔëÉù¡£µ«ÓÐʱºò£¬Í¼Æ¬ÖеÄÔëÉù»áµ¼ÖÂͼƬÖбßÔµÐÅÏ¢µÄÏûʧ¡£¶Ô´ËµÄ½â¾ö·½°¸¾ÍÊÇʹÓøß˹ƽ»¬À´¼õÉÙÔëÉù£¬¼´½øÐиß˹ģºý²Ù×÷¡£¸Ã²Ù×÷ÊÇÒ»ÖÖÂ˲¨²Ù×÷£¬Óë¸ß˹·Ö²¼Óйأ¬ÏÂÃæÊÇÒ»¸ö¶þάµÄ¸ß˹º¯Êý£¬ÆäÖÐ (x, y) Îª×ø±ê£¬¦Ò Ϊ±ê×¼²î£º

½øÐиß˹Â˲¨Ö®Ç°£¬ÐèÒªÏȵõ½Ò»¸ö¸ß˹Â˲¨Æ÷£¨kernel£©¡£ÈçºÎµÃµ½Ò»¸ö¸ß˹Â˲¨Æ÷£¿Æäʵ¾ÍÊǽ«¸ß˹º¯ÊýÀëÉ¢»¯£¬½«Â˲¨Æ÷ÖжÔÓ¦µÄºá×Ý×ø±êË÷Òý´úÈë¸ß˹º¯Êý£¬¼´¿ÉµÃµ½¶ÔÓ¦µÄÖµ¡£²»Í¬³ß´çµÄÂ˲¨Æ÷£¬µÃµ½µÄÖµÒ²²»Í¬£¬ÏÂÃæÊÇ (2k+1)x(2k+1) Â˲¨Æ÷µÄ¼ÆË㹫ʽ :

³£ÓóߴçΪ 5x5£¬¦Ò=1.4 µÄ¸ß˹Â˲¨Æ÷¡£ÏÂÃæÊÇ 5x5 ¸ß˹Â˲¨Æ÷µÄʵÏÖ´úÂ룺

# È¥³ýÔëÒô - ʹÓà 5x5 µÄ¸ß˹Â˲¨Æ÷
def smooth(self, img_gray):

# Éú³É¸ß˹Â˲¨Æ÷
"""
ÒªÉú³ÉÒ»¸ö (2k+1)x(2k+1) µÄ¸ß˹Â˲¨Æ÷£¬Â˲¨Æ÷µÄ¸÷¸öÔªËØ¼ÆË㹫ʽÈçÏ£º

H[i, j] = (1/(2*pi*sigma**2))*exp(-1/2*sigma**2((i-k-1)**2 + (j-k-1)**2))
"""
sigma1 = sigma2 = 1.4
gau_sum = 0
gaussian = np.zeros([5, 5])
for i in range(5):
for j in range(5):
gaussian[i, j] = math.exp((-1/(2*sigma1*sigma2))*(np.square(i-3)
+ np.square(j-3)))/(2*math.pi*sigma1*sigma2)
gau_sum = gau_sum + gaussian[i, j]

# ¹éÒ»»¯´¦Àí
gaussian = gaussian / gau_sum

# ¸ß˹Â˲¨
W, H = img_gray.shape
new_gray = np.zeros([W-5, H-5])

for i in range(W-5):
for j in range(H-5):
new_gray[i, j] = np.sum(img_gray[i:i+5, j:j+5] * gaussian)

return new_gray

ͼƬÌݶȷùÖµ

±ßÔµÊÇͼÏñÇ¿¶È¿ìËٱ仯µÄµØ·½£¬¿ÉÒÔͨ¹ýͼÏñÌݶȷùÖµ£¬¼´¼ÆËãͼÏñÇ¿¶ÈµÄÒ»½×µ¼ÊýÀ´Ê¶±ðÕâЩµØ·½¡£ÓÉÓÚͼƬÊÇÀëÉ¢µÄ£¬¿ÉÒÔÓÃÓÐÏÞµ¼ÊýÀ´½üËÆÍ¼Æ¬µÄÌݶȣº

ͼƬÌݶȷùֵΪ£º

Ìݶȷ½ÏòΪ£º

ʵÏÖ´úÂëÈçÏ£º

# ¼ÆËãÌݶȷùÖµ
def gradients(self, new_gray):
"""
:type: image which after smooth
:rtype:
dx: gradient in the x direction
dy: gradient in the y direction
M: gradient magnitude
theta: gradient direction
"""

W, H = new_gray.shape
dx = np.zeros([W-1, H-1])
dy = np.zeros([W-1, H-1])
M = np.zeros([W-1, H-1])
theta = np.zeros([W-1, H-1])

for i in range(W-1):
for j in range(H-1):
dx[i, j] = new_gray[i+1, j] - new_gray[i, j]
dy[i, j] = new_gray[i, j+1] - new_gray[i, j]
# ͼÏñÌݶȷùÖµ×÷ΪͼÏñÇ¿¶ÈÖµ
M[i, j] = np.sqrt(np.square(dx[i, j]) + np.square(dy[i, j]))
# ¼ÆËã ¦È - artan(dx/dy)
theta[i, j] = math.atan(dx[i, j] / (dy[i, j] + 0.000000001))

return dx, dy, M, theta

·Ç¼«´óÖµÒÖÖÆ£¨NMS£©

ÀíÏëÇé¿öÏ£¬×îÖյõ½µÄ±ßÔµÓ¦¸ÃÊǺÜϸµÄ¡£Òò´Ë£¬ÐèÒªÖ´ÐзǼ«´óÖµÒÖÖÆÒÔʹ±ßÔµ±äϸ¡£Ô­ÀíºÜ¼òµ¥£º±éÀúÌݶȾØÕóÉϵÄËùÓе㣬²¢±£Áô±ßÔµ·½ÏòÉϾßÓм«´óÖµµÄÏñËØ¡£

Ìݶȷ½ÏòÓë±ßÔµ·½ÏòÏ໥´¹Ö±

ÏÂÃæËµËµ NMS µÄϸ½ÚÄÚÈÝ¡£NMS ÔÚ 4 ¸ö·½ÏòÉϽøÐУ¬·Ö±ðÊÇ 0£¬90£¬45£¬135£¬Ã»ÓнǶȰüº¬Á½¸öÁìÓò£¬Òò´Ë£¬Ò»¹²Óð˸öÁìÓò£ºÉÏ£¬Ï£¬×ó£¬ÓÒ£¬×óÉÏ£¬×óÏ£¬ÓÒÉÏ£¬ÓÒÏ£¬ÈçÏÂͼËùʾ£¬C ÖÜΧµÄ 8 ¸öµã¾ÍÊÇÆä¸½½üµÄ°Ë¸öÁìÓò¡£

ÕâÑù×öµÄºÃ´¦ÊǼòµ¥£¬ µ«ÊÇÕâÖÖ¼ò»¯µÄ·½·¨ÎÞ·¨´ïµ½×îºÃµÄЧ¹û£¬ ÒòΪ£¬×ÔȻͼÏñÖеıßÔµÌݶȷ½Ïò²»Ò»¶¨ÊÇÑØ×ÅÕâËĸö·½ÏòµÄ¡£Òò´Ë£¬¾ÍÓкܴóµÄ±ØÒª½øÐвåÖµ£¬ÕÒ³öÔÚÒ»¸öÏñËØµãÉÏ×îÄÜÎÇºÏÆäËùÔÚÌݶȷ½ÏòµÄÁ½²àµÄÏñËØÖµ¡£

NMS ÊÇÒªÕÒ³ö¾Ö²¿×î´óÖµ£¬Òò´Ë£¬ÐèÒª½«µ±Ç°µÄÏñËØµÄÌݶȣ¬ÓëÆäËû·½Ïò½øÐбȽϡ£ÈçÏÂͼËùʾ£¬g1£¬g2£¬g3£¬g4 ·Ö±ðÊÇ C °Ë¸öÁìÓòÖÐµÄ 4 ¸öµã£¬À¶ÏßÊÇ C µÄÌݶȷ½Ïò¡£Èç¹û C ÊǾֲ¿×î´óÖµµÄ»°£¬C µãµÄÌݶȷùÖµ¾ÍÒª´óÓÚÌݶȷ½ÏòÖ±ÏßÓë g1g2£¬g4g3 Á½¸ö½»µãµÄÌݶȷùÖµ£¬¼´´óÓÚµã dTemp1 ºÍ dTemp2 µÄÌݶȷùÖµ¡£ÉÏÃæÌáµ½ÕâÖÖ·½·¨ÎÞ·¨´ïµ½×îºÃµÄЧ¹û£¬ÒòΪ dTemp1 ºÍ dTemp2 ²»ÊÇÕûÏñËØ£¬¶øÊÇÑÇÏñËØ¡£ÑÇÏñËØµÄÒâ˼¾ÍÊÇÔÚÁ½¸öÎïÀíÏñËØÖ®¼ä»¹ÓÐÏñËØ¡£

ÄÇô£¬ÑÇÏñËØµÄÌݶȷùÖµÔõôÇ󣿿ÉÒÔʹÓÃÏßÐÔ²åÖµµÄ·½·¨£¬¼ÆËã dTemp1 ÔÚ g1£¬g2 Ö®¼äµÄÈ¨ÖØ£¬¾Í¿ÉÒԵõ½ÆäÌݶȷùÖµ¡£¼ÆË㹫ʽÈçÏ£º

weight = |gx| / |gy| or |gy| / |gx|
dTemp1 = weight*g1 + (1-weight)*g2
dTemp2 = weight*g3 + (1-weight)*g4

ÏÂÃæÁ½·ùͼÊÇ y ·½ÏòÌݶÈÖµ±È½Ï´óµÄÇé¿ö£¬¼´Ìݶȷ½Ïò¿¿½ü y Öá¡£ËùÒÔ£¬g2 ºÍ g4 ÔÚ C µÄÉÏÏÂλÖ㬴Ëʱ weight = |gy| / |gx| ¡£×ó±ßµÄͼÊÇ x£¬y ·½ÏòÌݶȷûºÅÏàͬµÄÇé¿ö£¬ÓÒ±ßÊÇ x£¬y ·½ÏòÌݶȷûºÅÏà·´µÄÇé¿ö¡£

¶ÔÓÚ×ó±ßµÄͼÀ´Ëµ£¬ÒÔ C µãΪµ±Ç°Î»Öà - d[i, j] £¬ÄÇô g2 ÔÚ C µÄǰһÐУ¬g4 ÔÚ C µÄºóÒ»ÐУ¬ËùÒÔλÖÃ×ø±êÊÇ£º<br />g2 = d[i-1, j]£»g4 = d[i+1, j]¡£¸ù¾Ý×óͼµÄλÖùØÏµ¿ÉÒԵõ½£ºg1 = d[i-1, j-1]£»g3 = d[i+1, j+1]¡£

ͬÀí£¬¸ù¾ÝÓÒͼµÄλÖùØÏµ¿ÉÒԵõ½£ºg1 = d[i-1, j+1]£»g3 = d[i+1, j-1]¡£

ÏÂÃæÁ½·ùͼÊÇ x ·½ÏòÌݶÈÖµ±È½Ï´óµÄÇé¿ö£¬¼´Ìݶȷ½Ïò¿¿½ü x Öá¡£ËùÒÔ£¬g2 ºÍ g4 ÔÚ C µÄ×óÓÒλÖ㬴Ëʱ weight = |gy| / |gx| ¡£×ó±ßµÄͼÊÇ x£¬y ·½ÏòÌݶȷûºÅÏàͬµÄÇé¿ö£¬ÓÒ±ßÊÇ x£¬y ·½ÏòÌݶȷûºÅÏà·´µÄÇé¿ö¡£

ÓÉÉÏÃæ¿ÉÖª£¬¿ÉÒԵõ½ÈçÏÂÐÅÏ¢£ºg2 = d[i, j-1]£»g4 = d[i, j+1]£»

×óͼ£ºg1 = d[i+1, j-1]£»g3 = d[i-1, j+1]£»

ÓÒͼ£ºg1 = d[i-1, j-1]£»g3 = d[i+1, j+1]¡£

ÏÂÃæµÄÕâÁ½·ùͼ£¬¿ÉÄÜ»á´øÀ´Àí½â°ïÖú£º

È»ºó£¬¸ù¾ÝÒÔÉÏÐÅÏ¢£¬´úÂëʵÏÖÈçÏ£º

def NMS(self, M, dx, dy):

d = np.copy(M)
W, H = M.shape
NMS = np.copy(d)
NMS[0, :] = NMS[W-1, :] = NMS[:, 0] = NMS[:, H-1] = 0

for i in range(1, W-1):
for j in range(1, H-1):

# Èç¹ûµ±Ç°ÌݶÈΪ0£¬¸Ãµã¾Í²»ÊDZßÔµµã
if M[i, j] == 0:
NMS[i, j] = 0

else:
gradX = dx[i, j] # µ±Ç°µã x ·½Ïòµ¼Êý
gradY = dy[i, j] # µ±Ç°µã y ·½Ïòµ¼Êý
gradTemp = d[i, j] # µ±Ç°Ìݶȵã

# Èç¹û y ·½ÏòÌݶÈÖµ±È½Ï´ó£¬ËµÃ÷µ¼Êý·½ÏòÇ÷ÏòÓÚ y ·ÖÁ¿
if np.abs(gradY) > np.abs(gradX):
weight = np.abs(gradX) / np.abs(gradY) # È¨ÖØ
grad2 = d[i-1, j]
grad4 = d[i+1, j]

# Èç¹û x, y ·½Ïòµ¼Êý·ûºÅÒ»ÖÂ
# ÏñËØµãλÖùØÏµ
# g1 g2
# c
# g4 g3
if gradX * gradY > 0:
grad1 = d[i-1, j-1]
grad3 = d[i+1, j+1]

# Èç¹û x£¬y ·½Ïòµ¼Êý·ûºÅÏà·´
# ÏñËØµãλÖùØÏµ
# g2 g1
# c
# g3 g4
else:
grad1 = d[i-1, j+1]
grad3 = d[i+1, j-1]

# Èç¹û x ·½ÏòÌݶÈÖµ±È½Ï´ó
else:
weight = np.abs(gradY) / np.abs(gradX)
grad2 = d[i, j-1]
grad4 = d[i, j+1]

# Èç¹û x, y ·½Ïòµ¼Êý·ûºÅÒ»ÖÂ
# ÏñËØµãλÖùØÏµ
# g3
# g2 c g4
# g1
if gradX * gradY > 0:

grad1 = d[i+1, j-1]
grad3 = d[i-1, j+1]

# Èç¹û x£¬y ·½Ïòµ¼Êý·ûºÅÏà·´
# ÏñËØµãλÖùØÏµ
# g1
# g2 c g4
# g3
else:
grad1 = d[i-1, j-1]
grad3 = d[i+1, j+1]

# ÀûÓà grad1-grad4 ¶ÔÌݶȽøÐвåÖµ
gradTemp1 = weight * grad1 + (1 - weight) * grad2
gradTemp2 = weight * grad3 + (1 - weight) * grad4

# µ±Ç°ÏñËØµÄÌݶÈÊǾֲ¿µÄ×î´óÖµ£¬¿ÉÄÜÊDZßÔµµã
if gradTemp >= gradTemp1 and gradTemp >= gradTemp2:
NMS[i, j] = gradTemp

else:
# ²»¿ÉÄÜÊDZßÔµµã
NMS[i, j] = 0

return NMS

Ë«ãÐֵѡȡ

Õâ¸ö½×¶Î¾ö¶¨ÄÄЩ±ßÔµÊÇÕæÕýµÄ±ßÔµ£¬ÄÄЩ±ßÔµ²»ÊÇÕæÕýµÄ±ßÔµ¡£Îª´Ë£¬ÐèÒªÉèÖÃÁ½¸öãÐÖµ£¬minVal ºÍ maxVal¡£ÌݶȴóÓÚ maxVal µÄÈκαßÔµ¿Ï¶¨ÊÇÕæ±ßÔµ£¬¶ø minVal ÒÔϵıßÔµ¿Ï¶¨ÊǷDZßÔµ£¬Òò´Ë±»¶ªÆú¡£Î»ÓÚÕâÁ½¸öãÐÖµÖ®¼äµÄ±ßÔµ»á»ùÓÚÆäÁ¬Í¨ÐÔ¶ø·ÖÀàΪ±ßÔµ»ò·Ç±ßÔµ£¬Èç¹ûËüÃÇÁ¬½Óµ½¡°¿É¿¿±ßÔµ¡±ÏñËØ£¬ÔòËüÃDZ»ÊÓΪ±ßÔµµÄÒ»²¿·Ö¡£·ñÔò£¬Ò²»á±»¶ªÆú¡£

´úÂëÈçÏÂËùʾ£º

def double_threshold(self, NMS):

W, H = NMS.shape
DT = np.zeros([W, H])

# ¶¨Òå¸ßµÍãÐÖµ
TL = 0.1 * np.max(NMS)
TH = 0.3 * np.max(NMS)

for i in range(1, W-1):
for j in range(1, H-1):
# Ë«ãÐֵѡȡ
if (NMS[i, j] < TL):
DT[i, j] = 0

elif (NMS[i, j] > TH):
DT[i, j] = 1

# Á¬½Ó
elif (NMS[i-1, j-1:j+1] < TH).any() or (NMS[i+1, j-1:j+1].any()
or (NMS[i, [j-1, j+1]] < TH).any()):
DT[i, j] = 1


return DT

±ßÔµ¼ì²â½á¹û

¾­¹ýÒÔÉÏ 5 ¸ö¹ý³Ì£¬¿ÉÒԵõ½ÈçϽá¹û£º

½«ÆäÓë OpenCV£¬skimage Ëã·¨½øÐжԱȣº

ÎÒ¸öÈ˸оõ OpenCV µÄ½á¹ûÊÇ×îºÃµÄ£¬Æä´ÎÊÇ Skimage µÄ½á¹û¡£×Ô¼ºµÄËã·¨½á¹ûÓÐЩµØ·½»¹ÊÇÂù´Ö²ÚµÄ¡£

 
   
3720 ´Îä¯ÀÀ       32
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]
 
×îÐÂÎÄÕÂ
¼òÊöMatplotlib
PythonÈýά»æÍ¼--Matplotlib
PythonÊý¾ÝÇåϴʵ¼ù
PyTorchʵսָÄÏ
PythonÅÀ³æÓëÊý¾Ý¿ÉÊÓ»¯
×îпγÌ
PythonÓ¦Óÿª·¢×î¼Ñʵ¼ù
Python+Êý¾Ý·ÖÎö+tensorflow
Python ±à³Ì·½·¨ºÍÓ¦Óÿª·¢
È˹¤ÖÇÄÜ+Python£«´óÊý¾Ý
Python¼°Êý¾Ý·ÖÎö
³É¹¦°¸Àý
ijͨÐÅÉ豸ÆóÒµ PythonÊý¾Ý·ÖÎöÓëÍÚ¾ò
Ä³ÒøÐÐ È˹¤ÖÇÄÜ+Python+´óÊý¾Ý
ijÁìÏÈÊý×ÖµØÍ¼ÌṩÉÌ PythonÊý¾Ý·ÖÎöÓë»úÆ÷ѧϰ
±±¾© Python¼°Êý¾Ý·ÖÎö
ij½ðÈÚ¹«Ë¾ Python±à³Ì·½·¨Óëʵ¼ùÅàѵ