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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
OpenCV ÖеÄͼÏñ´¦Àí ²¿·Ö IV (Èý£©
 
×÷Õߣº _Undo
  1768  次浏览      28
 2020-2-18
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁË Canny ±ßÔµ¼ì²âµÄÔ­ÀíÒÔ¼°Ñ§Ï°Í¼Ïñ½ð×ÖËþÈçºÎʹÓýð×ÖËþ½øÐÐͼÏñÈںϣ¬ Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

19 Canny ±ßÔµ¼ì²â

Ä¿±ê

Á˽â Canny ±ßÔµ¼ì²âµÄ¸ÅÄî

ѧϰº¯Êý cv2.Canny()

19.1 Ô­Àí

Canny ±ßÔµ¼ì²âÊÇÒ»Öַdz£Á÷ÐеıßÔµ¼ì²âËã·¨£¬ÊÇ John F.Canny ÔÚ1986 ÄêÌá³öµÄ¡£ËüÊÇÒ»¸öÓкܶಽ¹¹³ÉµÄËã·¨£¬ÎÒÃǽÓÏÂÀ´»áÖð²½½éÉÜ¡£

19.1.1 ÔëÉùÈ¥³ý

ÓÉÓÚ±ßÔµ¼ì²âºÜÈÝÒ×Êܵ½ÔëÉùÓ°Ï죬ËùÒÔµÚÒ»²½ÊÇʹÓà 5x5 µÄ¸ß˹Â˲¨Æ÷È¥³ýÔëÉù£¬Õâ¸öÇ°ÃæÎÒÃÇÒѾ­Ñ§¹ýÁË¡£

19.1.2 ¼ÆËãͼÏñÌݶÈ

¶Ôƽ»¬ºóµÄͼÏñʹÓà Sobel Ëã×Ó¼ÆËãˮƽ·½ÏòºÍÊúÖ±·½ÏòµÄÒ»½×µ¼Êý£¨Í¼ÏñÌݶȣ©£¨Gx ºÍ Gy£©¡£¸ù¾ÝµÃµ½µÄÕâÁ½·ùÌݶÈͼ£¨Gx ºÍ Gy£©ÕÒµ½±ß½çµÄÌݶȺͷ½Ïò£¬¹«Ê½ÈçÏ£º

Ìݶȵķ½ÏòÒ»°ã×ÜÊÇÓë±ß½ç´¹Ö±¡£Ìݶȷ½Ïò±»¹éΪËÄÀࣺ´¹Ö±£¬Ë®Æ½£¬ºÍÁ½¸ö¶Ô½ÇÏß¡£

19.1.3 ·Ç¼«´óÖµÒÖÖÆ

ÔÚ»ñµÃÌݶȵķ½ÏòºÍ´óС֮ºó£¬Ó¦¸Ã¶ÔÕû·ùͼÏñ×öÒ»¸öɨÃ裬ȥ³ýÄÇЩ·Ç±ß½çÉϵĵ㡣¶Ôÿһ¸öÏñËØ½øÐмì²é£¬¿´Õâ¸öµãµÄÌݶÈÊDz»ÊÇÖÜΧ¾ßÓÐÏàͬÌݶȷ½ÏòµÄµãÖÐ×î´óµÄ¡£ÈçÏÂͼËùʾ£º

ÏÖÔÚÄãµÃµ½µÄÊÇÒ»¸ö°üº¬¡°Õ­±ß½ç¡±µÄ¶þֵͼÏñ¡£

19.1.4 ÖͺóãÐÖµ

ÏÖÔÚҪȷ¶¨ÄÇЩ±ß½ç²ÅÊÇÕæÕýµÄ±ß½ç¡£ÕâʱÎÒÃÇÐèÒªÉèÖÃÁ½¸öãÐÖµ£ºminVal ºÍ maxVal¡£µ±Í¼ÏñµÄ»Ò¶ÈÌݶȸßÓÚ maxVal ʱ±»ÈÏΪÊÇÕæµÄ±ß½ç£¬ÄÇЩµÍÓÚ minVal µÄ±ß½ç»á±»Åׯú¡£Èç¹û½éÓÚÁ½ÕßÖ®¼äµÄ»°£¬¾ÍÒª¿´Õâ¸öµãÊÇ·ñÓëij¸ö±»È·¶¨ÎªÕæÕýµÄ±ß½çµãÏàÁ¬£¬Èç¹ûÊǾÍÈÏΪËüÒ²ÊDZ߽çµã£¬Èç¹û²»ÊǾÍÅׯú¡£ÈçÏÂͼ£º

A ¸ßÓÚãÐÖµ maxVal ËùÒÔÊÇÕæÕýµÄ±ß½çµã£¬C ËäÈ»µÍÓÚ maxVal µ«¸ßÓÚminVal ²¢ÇÒÓë A ÏàÁ¬£¬ËùÒÔÒ²±»ÈÏΪÊÇÕæÕýµÄ±ß½çµã¡£¶ø B ¾Í»á±»Åׯú£¬ÒòΪËû²»½öµÍÓÚ maxVal ¶øÇÒ²»ÓëÕæÕýµÄ±ß½çµãÏàÁ¬¡£ËùÒÔÑ¡ÔñºÏÊ浀 maxValºÍ minVal ¶ÔÓÚÄÜ·ñµÃµ½ºÃµÄ½á¹û·Ç³£ÖØÒª¡£

ÔÚÕâÒ»²½Ò»Ð©Ð¡µÄÔëÉùµãÒ²»á±»³ýÈ¥£¬ÒòΪÎÒÃǼÙÉè±ß½ç¶¼ÊÇһЩ³¤µÄÏ߶Ρ£

19.2 OpenCV ÖÐµÄ Canny ±ß½ç¼ì²â

ÔÚ OpenCV ÖÐÖ»ÐèÒªÒ»¸öº¯Êý£ºcv2.Canny()£¬¾Í¿ÉÒÔÍê³ÉÒÔÉϼ¸²½¡£

ÈÃÎÒÃÇ¿´ÈçºÎʹÓÃÕâ¸öº¯Êý¡£Õâ¸öº¯ÊýµÄµÚÒ»¸ö²ÎÊýÊÇÊäÈëͼÏñ¡£µÚ¶þºÍµÚÈý¸ö·Ö±ðÊÇ minVal ºÍ maxVal¡£µÚÈý¸ö²ÎÊýÉèÖÃÓÃÀ´¼ÆËãͼÏñÌÝ¶ÈµÄ Sobel¾í»ýºËµÄ´óС£¬Ä¬ÈÏֵΪ 3¡£×îºóÒ»¸ö²ÎÊýÊÇ L2gradient£¬Ëü¿ÉÒÔÓÃÀ´É趨ÇóÌݶȴóСµÄ·½³Ì¡£Èç¹ûÉèΪ True£¬¾Í»áʹÓÃÎÒÃÇÉÏÃæÌáµ½¹ýµÄ·½³Ì£¬·ñÔòʹÓ÷½³Ì£ºEdge\_Gradient \; (G) = |G_x| + |G_y|. ´úÌæ£¬Ä¬ÈÏֵΪ False¡£

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

½á¹û£º

ÎҵĽá¹û

¹Ù·½½á¹û

¸ü¶à×ÊÔ´

1. Canny edge detector at Wikipedia

2. Canny Edge Detection Tutorial by Bill Green, 2002.

Á·Ï°

1. дһ¸öС³ÌÐò£¬¿ÉÒÔͨ¹ýµ÷½Ú»¬¶¯ÌõÀ´ÉèÖÃãÐÖµ minVal ºÍ maxVal ½ø¶øÀ´½øÐÐ Canny ±ß½ç¼ì²â¡£ÕâÑùÄã¾Í»áÀí½âãÐÖµµÄÖØÒªÐÔÁË¡£

20 ͼÏñ½ð×ÖËþ

Ä¿±ê

ѧϰͼÏñ½ð×ÖËþ

ʹÓÃͼÏñ´´½¨Ò»¸öÐÂË®¹û£º¡°éÙ×ÓÆ»¹û¡±

½«ÒªÑ§Ï°µÄº¯ÊýÓУºcv2.pyrUp()£¬cv2.pyrDown()¡£

20.1 Ô­Àí

Ò»°ãÇé¿öÏ£¬ÎÒÃÇÒª´¦ÀíÊÇÒ»¸±¾ßÓй̶¨·Ö±æÂʵÄͼÏñ¡£µ«ÊÇÓÐЩÇé¿öÏ£¬ÎÒÃÇÐèÒª¶ÔͬһͼÏñµÄ²»Í¬·Ö±æÂʵÄ×ÓͼÏñ½øÐд¦Àí¡£±ÈÈ磬ÎÒÃÇÒªÔÚÒ»·ùͼÏñÖвéÕÒij¸öÄ¿±ê£¬±ÈÈçÁ³£¬ÎÒÃDz»ÖªµÀÄ¿±êÔÚͼÏñÖеijߴç´óС¡£ÕâÖÖÇé¿öÏ£¬ÎÒÃÇÐèÒª´´½¨´´½¨Ò»×éͼÏñ£¬ÕâЩͼÏñÊǾßÓв»Í¬·Ö±æÂʵÄԭʼͼÏñ¡£ÎÒÃǰÑÕâ×éͼÏñ½Ð×öͼÏñ½ð×ÖËþ£¨¼òµ¥À´Ëµ¾ÍÊÇͬһͼÏñµÄ²»Í¬·Ö±æÂʵÄ×Óͼ¼¯ºÏ£©¡£Èç¹ûÎÒÃǰÑ×î´óµÄͼÏñ·ÅÔڵײ¿£¬×îСµÄ·ÅÔÚ¶¥²¿£¬¿´ÆðÀ´ÏñÒ»×ù½ð×ÖËþ£¬¹Ê¶øµÃÃûͼÏñ½ð×ÖËþ¡£

ÓÐÁ½ÀàͼÏñ½ð×ÖËþ£º¸ß˹½ð×ÖËþºÍÀ­ÆÕÀ­Ë¹½ð×ÖËþ¡£

¸ß˹½ð×ÖËþµÄ¶¥²¿ÊÇͨ¹ý½«µ×²¿Í¼ÏñÖеÄÁ¬ÐøµÄÐкÍÁÐÈ¥³ýµÃµ½µÄ¡£¶¥²¿Í¼ÏñÖеÄÿ¸öÏñËØÖµµÈÓÚÏÂÒ»²ãͼÏñÖÐ 5 ¸öÏñËØµÄ¸ß˹¼ÓȨƽ¾ùÖµ¡£ÕâÑù²Ù×÷Ò»´ÎÒ»¸ö MxN µÄͼÏñ¾Í±ä³ÉÁËÒ»¸ö M/2xN/2 µÄͼÏñ¡£ËùÒÔÕâ·ùͼÏñµÄÃæ»ý¾Í±äΪԭÀ´Í¼ÏñÃæ»ýµÄËÄ·ÖÖ®Ò»¡£Õâ±»³ÆÎª Octave¡£Á¬Ðø½øÐÐÕâÑùµÄ²Ù×÷ÎÒÃǾͻáµÃµ½Ò»¸ö·Ö±æÂʲ»¶ÏϽµµÄͼÏñ½ð×ÖËþ¡£ÎÒÃÇ¿ÉÒÔʹÓú¯Êýcv2.pyrDown() ºÍ cv2.pyrUp() ¹¹½¨Í¼Ïñ½ð×ÖËþ¡£

º¯Êý cv2.pyrDown() ´ÓÒ»¸ö¸ß·Ö±æÂÊ´ó³ß´çµÄͼÏñÏòÉϹ¹½¨Ò»¸ö½ð×ÓËþ£¨³ß´ç±äС£¬·Ö±æÂʽµµÍ£©¡£

img = cv2.imread('messi5.jpg')
lower_reso = cv2.pyrDown(higher_reso)

ÏÂͼÊÇÒ»¸öËIJãµÄͼÏñ½ð×ÖËþ¡£

º¯Êý cv2.pyrUp() ´ÓÒ»¸öµÍ·Ö±æÂÊС³ß´çµÄͼÏñÏòϹ¹½¨Ò»¸ö½ð×ÓËþ£¨³ß´ç±ä´ó£¬µ«·Ö±æÂʲ»»áÔö¼Ó£©¡£

higher_reso2 = cv2.pyrUp(lower_reso)

ÄãÒª¼ÇסµÄÊÇÊÇ higher_reso2 ºÍ higher_reso ÊDz»Í¬µÄ¡£ÒòΪһµ©Ê¹Óà cv2.pyrDown()£¬Í¼ÏñµÄ·Ö±æÂʾͻήµÍ£¬ÐÅÏ¢¾Í»á±»¶ªÊ§¡£ÏÂͼ¾ÍÊÇ´Ó cv2.pyrDown() ²úÉúµÄͼÏñ½ð×ÖËþµÄ£¨ÓÉϵ½ÉÏ£©µÚÈý²ãͼÏñʹÓú¯Êýcv2.pyrUp() µÃµ½µÄͼÏñ£¬ÓëԭͼÏñÏà±È·Ö±æÂʲîÁ˺ܶࡣ

À­ÆÕÀ­Ë¹½ð×ÖËþ¿ÉÒÔÓиß˹½ð×ÖËþ¼ÆËãµÃÀ´£¬¹«Ê½ÈçÏ£º

À­ÆÕÀ­½ð×ÖËþµÄͼÏñ¿´ÆðÀ´¾ÍÏñ±ß½çͼ£¬ÆäÖкܶàÏñËØ¶¼ÊÇ 0¡£ËûÃǾ­³£±»ÓÃÔÚͼÏñѹËõÖС£ÏÂͼ¾ÍÊÇÒ»¸öÈý²ãµÄÀ­ÆÕÀ­Ë¹½ð×ÖËþ£º

20.2 ʹÓýð×ÖËþ½øÐÐͼÏñÈÚºÏ

ͼÏñ½ð×ÖËþµÄÒ»¸öÓ¦ÓÃÊÇͼÏñÈںϡ£ÀýÈ磬ÔÚͼÏñ·ìºÏÖУ¬ÄãÐèÒª½«Á½·ùͼµþÔÚÒ»Æð£¬µ«ÊÇÓÉÓÚÁ¬½ÓÇøÓòͼÏñÏñËØµÄ²»Á¬ÐøÐÔ£¬Õû·ùͼµÄЧ¹û¿´ÆðÀ´»áºÜ²î¡£ÕâʱͼÏñ½ð×ÖËþ¾Í¿ÉÒÔÅÅÉÏÓó¡ÁË£¬Ëû¿ÉÒÔ°ïÄãʵÏÖÎÞ·ìÁ¬½Ó¡£ÕâÀïµÄÒ»¸ö¾­µä°¸Àý¾ÍÊǽ«Á½¸öË®¹ûÈںϳÉÒ»¸ö£¬¿´¿´ÏÂͼҲÐíÄã¾ÍÃ÷°×ÎÒÔÚ½²Ê²Ã´ÁË¡£

Äã¿ÉÒÔͨ¹ýÔĶÁºó±ßµÄ¸ü¶à×ÊÔ´À´Á˽â¸ü¶à¹ØÓÚͼÏñÈںϣ¬À­ÆÕÀ­Ë¹½ð×ÖËþµÄϸ½Ú¡£

ʵÏÖÉÏÊöЧ¹ûµÄ²½ÖèÈçÏ£º

1. ¶ÁÈëÁ½·ùͼÏñ£¬Æ»¹ûºÍ¾ä×Ó

2. ¹¹½¨Æ»¹ûºÍéÙ×ӵĸß˹½ð×ÖËþ£¨6 ²ã£©

3. ¸ù¾Ý¸ß˹½ð×ÖËþ¼ÆËãÀ­ÆÕÀ­Ë¹½ð×ÖËþ

4. ÔÚÀ­ÆÕÀ­Ë¹µÄÿһ²ã½øÐÐͼÏñÈںϣ¨Æ»¹ûµÄ×ó±ßÓëéÙ×ÓµÄÓÒ±ßÈںϣ©

5. ¸ù¾ÝÈںϺóµÄͼÏñ½ð×ÖËþÖØ½¨Ô­Ê¼Í¼Ïñ¡£

ÏÂͼÊÇÕª×Ô¡¶Ñ§Ï° OpenCV¡·Õ¹Ê¾Á˽ð×ÓËþµÄ¹¹½¨£¬ÒÔ¼°ÈçºÎ´Ó½ð×ÖËþÖØ½¨Ô­Ê¼Í¼ÏñµÄ¹ý³Ì¡£

Õû¸ö¹ý³ÌµÄ´úÂëÈçÏ¡££¨ÎªÁ˼òµ¥£¬Ã¿Ò»²½¶¼ÊǶÀÁ¢Íê³ÉµÄ£¬Õâ»ØÏûºÄ¸ü¶à¡¢µÄÄڴ棬Èç¹ûÄãÔ¸ÒâµÄ»°¿ÉÒÔ¶ÔËû½øÐÐÓÅ»¯£©

import cv2
import numpy as np,sys
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.jpg')
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in xrange(6):
G = cv2.pyrDown(G)
gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in xrange(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)
# Now add left and right halves of images in each level
LS = []
for la,lb in zip(lpA,lpB):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
LS.append(ls)
# now reconstruct
ls_ = LS[0]
for i in xrange(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])
# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)
   
1768 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

»ùÓÚͼ¾í»ýÍøÂçµÄͼÉî¶Èѧϰ
×Ô¶¯¼ÝÊ»ÖеÄ3DÄ¿±ê¼ì²â
¹¤Òµ»úÆ÷ÈË¿ØÖÆÏµÍ³¼Ü¹¹½éÉÜ
ÏîĿʵս£ºÈçºÎ¹¹½¨ÖªÊ¶Í¼Æ×
 
Ïà¹ØÎĵµ

5GÈ˹¤ÖÇÄÜÎïÁªÍøµÄµäÐÍÓ¦ÓÃ
Éî¶ÈѧϰÔÚ×Ô¶¯¼ÝÊ»ÖеÄÓ¦ÓÃ
ͼÉñ¾­ÍøÂçÔÚ½»²æÑ§¿ÆÁìÓòµÄÓ¦ÓÃÑо¿
ÎÞÈË»úϵͳԭÀí
Ïà¹Ø¿Î³Ì

È˹¤ÖÇÄÜ¡¢»úÆ÷ѧϰ&TensorFlow
»úÆ÷ÈËÈí¼þ¿ª·¢¼¼Êõ
È˹¤ÖÇÄÜ£¬»úÆ÷ѧϰºÍÉî¶Èѧϰ
ͼÏñ´¦ÀíËã·¨·½·¨Óëʵ¼ù