±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁË 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) |
|