±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËÈçºÎѧϰÈçºÎ¶ÔͼÏñ½øÐÐÑÕÉ«¿Õ¼äת»»ÒÔ¼°¼òµ¥ãÐÖµ£¬×ÔÊÊÓ¦ãÐÖµ£¬Otsu¡¯s
¶þÖµ»¯£¬ Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
13 ÑÕÉ«¿Õ¼äת»»
Ä¿±ê
1.Ä㽫ѧϰÈçºÎ¶ÔͼÏñ½øÐÐÑÕÉ«¿Õ¼äת»»£¬±ÈÈç´Ó BGR µ½»Ò¶Èͼ£¬»òÕß´ÓBGR
µ½ HSV µÈ¡£
2.ÎÒû»¹Òª´´½¨Ò»¸ö³ÌÐòÓÃÀ´´ÓÒ»·ùͼÏñÖлñȡij¸öÌØ¶¨ÑÕÉ«µÄÎïÌå¡£
3.ÎÒÃǽ«ÒªÑ§Ï°µÄº¯ÊýÓУºcv2.cvtColor()£¬cv2.inRange()
µÈ¡£
13.1 ת»»ÑÕÉ«¿Õ¼ä
ÔÚ OpenCV ÖÐÓг¬¹ý 150 ÖнøÐÐÑÕÉ«¿Õ¼äת»»µÄ·½·¨¡£µ«ÊÇÄãÒÔºó¾Í»á¡¢·¢ÏÖÎÒÃǾ³£Óõ½µÄÒ²¾ÍÁ½ÖÖ£ºBGR?Gray
ºÍ BGR?HSV¡£
ÎÒÃÇÒªÓõ½µÄº¯ÊýÊÇ£ºcv2.cvtColor(input_image £¬flag)£¬ÆäÖÐ flag¾ÍÊÇת»»ÀàÐÍ¡£
¶ÔÓÚ BGR?Gray µÄת»»£¬ÎÒÃÇҪʹÓÃµÄ flag ¾ÍÊÇ cv2.COLOR_BGR2GRAY¡£
ͬÑù¶ÔÓÚ BGR?HSV µÄת»»£¬ÎÒÃÇÓÃµÄ flag ¾ÍÊÇ cv2.COLOR_BGR2HSV¡£
Ä㻹¿ÉÒÔͨ¹ýÏÂÃæµÄÃüÁîµÃµ½ËùÓпÉÓÃµÄ flag¡£
import cv2
flags=[i for in dir(cv2) if i startswith('COLOR_')]
print flags |
×¢Ò⣺ÔÚ OpenCV µÄ HSV ¸ñʽÖУ¬H£¨É«²Ê/É«¶È£©µÄȡֵ·¶Î§ÊÇ [0£¬179]£¬S£¨±¥ºÍ¶È£©µÄȡֵ·¶Î§
[0£¬255]£¬V£¨ÁÁ¶È£©µÄȡֵ·¶Î§ [0£¬255]¡£µ«ÊDz»Í¬µÄÈí¼þʹÓõÄÖµ¿ÉÄܲ»Í¬¡£ËùÒÔµ±ÄãÐèÒªÄÃ
OpenCV µÄ HSV ÖµÓëÆäËûÈí¼þµÄ HSV Öµ½øÐжԱÈʱ£¬Ò»¶¨Òª¼ÇµÃ¹éÒ»»¯¡£
13.2 ÎïÌå¸ú×Ù
ÏÖÔÚÎÒÃÇÖªµÀÔõÑù½«Ò»·ùͼÏñ´Ó BGR ת»»µ½ HSV ÁË£¬ÎÒÃÇ¿ÉÒÔÀûÓÃÕâÒ»µãÀ´ÌáÈ¡´øÓÐij¸öÌØ¶¨ÑÕÉ«µÄÎïÌå¡£ÔÚ
HSV ÑÕÉ«¿Õ¼äÖÐÒª±ÈÔÚ BGR ¿Õ¼äÖиüÈÝÒ×±íʾһ¸öÌØ¶¨ÑÕÉ«¡£ÔÚÎÒÃǵijÌÐòÖУ¬ÎÒÃÇÒªÌáÈ¡µÄÊÇÒ»¸öÀ¶É«µÄÎïÌå¡£ÏÂÃæ¾ÍÊǾÍÊÇÎÒÃÇÒª×öµÄ¼¸²½£º
1.´ÓÊÓÆµÖлñȡÿһ֡ͼÏñ
2.½«Í¼Ïñת»»µ½ HSV ¿Õ¼ä
3.ÉèÖà HSV ãÐÖµµ½À¶É«·¶Î§¡£
4.»ñÈ¡À¶É«ÎïÌ壬µ±È»ÎÒÃÇ»¹¿ÉÒÔ×öÆäËûÈκÎÎÒÃÇÏë×öµÄÊ£¬±ÈÈ磺ÔÚÀ¶É«ÎïÌåÖÜΧ»Ò»¸öȦ¡£
ÏÂÃæ¾ÍÊÇÎÒÃǵĴúÂ룺
import cv2
import numpy as np
cap = cv2.VideoCapture(r'ÄãµÄÊÓÆµÎļþ') while(1): # Take each frame
_, frame = cap.read() # Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255]) # Threshold the HSV image to get only blue
colors
mask = cv2.inRange(hsv, lower_blue, upper_blue) # Bitwise-AND mask and original image
res = cv2.bitwise_and(frame,frame, mask= mask) cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break cv2.destroyAllWindows() |
×¢Ò⣺ÕâÊÇÎïÌå¸ú×ÙÖÐ×î¼òµ¥µÄ·½·¨¡£µ±ÄãѧϰÁËÂÖÀªÖ®ºó£¬Äã¾Í»áѧµ½¸ü¶àÏà¹ØÖªÊ¶£¬ÄÇÊÇÄã¾Í¿ÉÒÔÕÒµ½ÎïÌåµÄÖØÐÄ£¬²¢¸ù¾ÝÖØÐÄÀ´¸ú×ÙÎïÌ壬½ö½öÔÚÉãÏñͷǰ»Ó»ÓÊ־ͿÉÒÔ»³öͬµÄͼÐΣ¬»òÕ߯äËû¸üÓÐȤµÄÊ¡£

13.3 ÔõÑùÕÒµ½Òª¸ú×Ù¶ÔÏóµÄ HSV Öµ£¿
ÕâÊÇÎÒÔÚstackoverflow.comÉÏÓöµ½µÄ×îÆÕ±éµÄÎÊÌâ¡£ÆäʵÕâÕæµÄºÜ¼òµ¥£¬º¯Êý
cv2.cvtColor() Ò²¿ÉÒÔÓõ½ÕâÀï¡£µ«ÊÇÏÖÔÚÄãÒª´«ÈëµÄ²ÎÊýÊÇ£¨ÄãÏëÒªµÄ£©BGR Öµ¶ø²»ÊÇÒ»¸±Í¼¡£ÀýÈ磬ÎÒÃÇÒªÕÒµ½ÂÌÉ«µÄ
HSV Öµ£¬ÎÒÃÇÖ»ÐèÔÚÖÕ¶ËÊäÈëÒÔÏÂÃüÁ
import cv2
import numpy as np
green=np.uint8([0,255,0])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
error: /builddir/build/BUILD/opencv-2.4.6.1/
modules/imgproc/src/color.cpp:3541:
error: (-215) (scn == 3 || scn == 4) &&
(depth == CV_8U || depth == CV_32F)
in function cvtColor
#scn (the number of channels of the source),
#i.e. self.img.channels(), is neither 3 nor 4.
#
#depth (of the source),
#i.e. self.img.depth(), is neither CV_8U nor CV_32F.
# ËùÒÔ²»ÄÜÓà [0,255,0] £¬¶øÒªÓà [[[0,255,0]]]
# ÕâÀïµÄÈý²ãÀ¨ºÅÓ¦¸Ã·Ö±ð¶ÔÓ¦ÓÚ cvArray £¬ cvMat £¬ IplImage
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
# [[[60 255 255]]] |
ÏÖÔÚÄã¿ÉÒÔ·Ö±ðÓà [H-100£¬100£¬100] ºÍ [H+100£¬255£¬255]
×öÉÏÏÂãÐÖµ¡£³ýÁËÕâ¸ö·½·¨Ö®Í⣬Äã¿ÉÒÔʹÓÃÈÎºÎÆäËûͼÏñ±à¼Èí¼þ£¨ÀýÈç GIMP£©»òÕßÔÚÏßת»»Èí¼þÕÒµ½ÏàÓ¦µÄ
HSV Öµ£¬µ«ÊÇ×îºó±ðÍüÁ˵÷½Ú HSV µÄ·¶Î§¡£
Á·Ï°
1. ³¢ÊÔͬʱÌáÈ¡¶à¸ö²»Í¬µÄÑÕÉ«ÎïÌ壬±ÈÈçͬʱÌáÈ¡ºì£¬À¶£¬ÂÌÈý¸ö²»Í¬ÑÕÉ«µÄÎïÌå¡£
14 ¼¸ºÎ±ä»»
Ä¿±ê
1.ѧϰ¶ÔͼÏñ½øÐи÷ÖÖ¼¸¸ö±ä»»£¬ÀýÈçÒÆ¶¯£¬Ðýת£¬·ÂÉä±ä»»µÈ¡£
2.½«ÒªÑ§µ½µÄº¯ÊýÓУºcv2.getPerspectiveTransform¡£
񄯯
OpenCV ÌṩÁËÁ½¸ö±ä»»º¯Êý£¬cv2.warpAffine ºÍ cv2.warpPerspective£¬Ê¹ÓÃÕâÁ½¸öº¯ÊýÄã¿ÉÒÔʵÏÖËùÓÐÀàÐ͵ı任¡£cv2.warpAffine
½ÓÊյIJÎÊýÊÇ2 ¡Á 3 µÄ±ä»»¾ØÕ󣬶ø cv2.warpPerspective ½ÓÊյIJÎÊýÊÇ 3 ¡Á
3 µÄ±ä»»¾ØÕó¡£
14.1 À©Õ¹Ëõ·Å
À©Õ¹Ëõ·ÅÖ»ÊǸıäͼÏñµÄ³ß´ç´óС¡£OpenCV ÌṩµÄº¯Êý cv2.resize()¿ÉÒÔʵÏÖÕâ¸ö¹¦ÄÜ¡£Í¼ÏñµÄ³ß´ç¿ÉÒÔ×Ô¼ºÊÖ¶¯ÉèÖã¬ÄãÒ²¿ÉÒÔÖ¸¶¨Ëõ·ÅÒò×Ó¡£ÎÒÃÇ¿ÉÒÔÑ¡ÔñʹÓò»Í¬µÄ²åÖµ·½·¨¡£ÔÚËõ·ÅʱÎÒÃÇÍÆ¼öʹÓÃ
cv2.INTER_AREA£¬ÔÚÀ©Õ¹Ê±ÎÒÃÇÍÆ¼öʹÓà v2.INTER_CUBIC£¨Âý) ºÍ v2.INTER_LINEAR¡£Ä¬ÈÏÇé¿öÏÂËùÓиıäͼÏñ³ß´ç´óСµÄ²Ù×÷ʹÓõIJåÖµ·½·¨¶¼ÊÇ
cv2.INTER_LINEAR¡£Äã¿ÉÒÔʹÓÃÏÂÃæÈÎÒâÒ»ÖÖ·½·¨¸Ä±äͼÏñµÄ³ß´ç£º
import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
# ÏÂÃæµÄ None ±¾Ó¦¸ÃÊÇÊä³öͼÏñµÄ³ß´ç£¬ µ«ÊÇÒòΪºó±ßÎÒÃÇÉèÖÃÁËËõ·ÅÒò×Ó
# Òò´ËÕâÀïΪ None
res=cv2.resize(img,None,fx=2,fy=2, interpolation=cv2.INTER_CUBIC)
#OR
# ÕâÀïÄØ£¬ÎÒÃÇÖ±½ÓÉèÖÃÊä³öͼÏñµÄ³ß´ç£¬ ËùÒÔ²»ÓÃÉèÖÃËõ·ÅÒò×Ó
height,width=img.shape[:2]
res=cv2.resize(img,(2*width,2*height), interpolation=cv2.INTER_CUBIC)
while(1):
cv2.imshow('res',res)
cv2.imshow('img',img)
if cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
# Resize(src, dst, interpolation=CV_INTER_LINEAR)
|
14.2 Æ½ÒÆ
Æ½ÒÆ¾ÍÊǽ«¶ÔÏó»»Ò»¸öλÖá£Èç¹ûÄã񻄯£¨x£¬y£©·½ÏòÒÆ¶¯£¬Òƶ¯µÄ¾àÀëÊÇ£¨t
x £¬t y £©£¬Äã¿ÉÒÔÒÔÏÂÃæµÄ·½Ê½¹¹½¨Òƶ¯¾ØÕó£º

Äã¿ÉÒÔʹÓà Numpy Êý×é¹¹½¨Õâ¸ö¾ØÕó£¨Êý¾ÝÀàÐÍÊÇ np.float32£©£¬È»ºó°ÑËü´«¸øº¯Êý cv2.warpAffine()¡£¿´¿´ÏÂÃæÕâ¸öÀý×Ó°É£¬Ëü±»Òƶ¯ÁË£¨100,50£©¸öÏñËØ¡£
import cv2
import numpy as np
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows)) cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows() |

¾¯¸æ£ºº¯Êý cv2.warpAffine() µÄµÚÈý¸ö²ÎÊýµÄÊÇÊä³öͼÏñµÄ´óС£¬ËüµÄ¸ñʽӦ¸ÃÊÇͼÏñµÄ£¨¿í£¬¸ß£©¡£Ó¦¸Ã¼ÇסµÄÊÇͼÏñµÄ¿í¶ÔÓ¦µÄÊÇÁÐÊý£¬¸ß¶ÔÓ¦µÄÊÇÐÐÊý¡£
ÏÂÃæ¾ÍÊǽá¹û£º
14.3 Ðýת
¶ÔÒ»¸öͼÏñÐýת½Ç¶È ¦È, ÐèҪʹÓõ½ÏÂÃæÐÎʽµÄÐýת¾ØÕó¡£

µ«ÊÇ OpenCV ÔÊÐíÄãÔÚÈÎÒâµØ·½½øÐÐÐýת£¬µ«ÊÇÐýת¾ØÕóµÄÐÎʽӦ¸ÃÐÞ
¸ÄΪ

ÆäÖУº

ΪÁ˹¹½¨Õâ¸öÐýת¾ØÕó£¬OpenCV ÌṩÁËÒ»¸öº¯Êý£ºcv2.getRotationMatrix2D¡£
ÏÂÃæµÄÀý×ÓÊÇÔÚ²»Ëõ·ÅµÄÇé¿öϽ«Í¼ÏñÐýת 90 ¶È¡£
import cv2
import numpy as np
img=cv2.imread('messi5.jpg',0)
rows,cols=img.shape
# ÕâÀïµÄµÚÒ»¸ö²ÎÊýΪÐýתÖÐÐÄ£¬µÚ¶þ¸öΪÐýת½Ç¶È£¬µÚÈý¸öΪÐýתºóµÄËõ·ÅÒò×Ó
# ¿ÉÒÔͨ¹ýÉèÖÃÐýתÖÐÐÄ£¬Ëõ·ÅÒò×Ó£¬ÒÔ¼°´°¿Ú´óСÀ´·ÀÖ¹Ðýתºó³¬³ö±ß½çµÄÎÊÌâ
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
# µÚÈý¸ö²ÎÊýÊÇÊä³öͼÏñµÄ³ß´çÖÐÐÄ
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow('img',dst)
if cv2.waitKey(1)&0xFF==27:
break
cv2.destroyAllWindows() |
ÏÂÃæÊǽá¹û:

14.4 ·ÂÉä±ä»»
¡¡¡¡ÔÚ·ÂÉä±ä»»ÖУ¬ÔͼÖÐËùÓÐµÄÆ½ÐÐÏßÔÚ½á¹ûͼÏñÖÐͬÑùƽÐС£ÎªÁË´´½¨Õâ¸ö¾ØÕóÎÒÃÇÐèÒª´ÓÔͼÏñÖÐÕÒµ½Èý¸öµãÒÔ¼°ËûÃÇÔÚÊä³öͼÏñÖеÄλÖá£È»ºócv2.getAffineTransform
»á´´½¨Ò»¸ö 2x3 µÄ¾ØÕó£¬×îºóÕâ¸ö¾ØÕó»á±»´«¸øº¯Êý cv2.warpAffine¡£
À´¿´¿´ÏÂÃæµÄÀý×Ó£¬ÒÔ¼°ÎÒÑ¡ÔñµÄµã£¨±»±ê¼ÇΪÂÌÉ«µÄµã£©
img = cv2.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(pts1,pts2) dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show() |
ÏÂÃæÊǽá¹û£º

14.5 ͸Êӱ任
¶ÔÓÚÊӽDZ任£¬ÎÒÃÇÐèÒªÒ»¸ö 3x3 ±ä»»¾ØÕó¡£Ôڱ任ǰºóÖ±Ïß»¹ÊÇÖ±Ïß¡£Òª¹¹½¨Õâ¸ö±ä»»¾ØÕó£¬ÄãÐèÒªÔÚÊäÈëͼÏñÉÏÕÒ
4 ¸öµã£¬ÒÔ¼°ËûÃÇÔÚÊä³öͼÏñÉ϶ÔÓ¦µÄλÖá£ÕâËĸöµãÖеÄÈÎÒâÈý¸ö¶¼²»Äܹ²Ïß¡£Õâ¸ö±ä»»¾ØÕó¿ÉÒÔÓк¯Êý cv2.getPerspectiveTransform()
¹¹½¨¡£È»ºó°ÑÕâ¸ö¾ØÕ󴫸øº¯Êýcv2.warpPerspective¡£
´úÂëÈçÏ£º
img = cv2.imread('sudokusmall.png')
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]] M = cv2.getPerspectiveTransform(pts1,pts2 dst = cv2.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show() |
½á¹ûÈçÏ£º

15 ͼÏñãÐÖµ
Ä¿±ê
1.±¾½ÚÄ㽫ѧµ½¼òµ¥ãÐÖµ£¬×ÔÊÊÓ¦ãÐÖµ£¬Otsu¡¯s ¶þÖµ»¯µÈ
2.½«ÒªÑ§Ï°µÄº¯ÊýÓÐ cv2.threshold£¬cv2.adaptiveThreshold
µÈ¡£
15.1 ¼òµ¥ãÐÖµ
ÓëÃû×ÖÒ»Ñù£¬ÕâÖÖ·½·¨·Ç³£¼òµ¥¡£µ«ÏñËØÖµ¸ßÓÚãÐֵʱ£¬ÎÒÃǸøÕâ¸öÏñËØ¸³ÓèÒ»¸öÐÂÖµ£¨¿ÉÄÜÊǰ×É«£©£¬·ñÔòÎÒÃǸøËü¸³ÓèÁíÍâÒ»ÖÖÑÕÉ«£¨Ò²ÐíÊǺÚÉ«£©¡£Õâ¸öº¯Êý¾ÍÊÇ
cv2.threshhold()¡£Õâ¸öº¯ÊýµÄµÚÒ»¸ö²ÎÊý¾ÍÊÇÔͼÏñ£¬ÔͼÏñÓ¦¸ÃÊǻҶÈͼ¡£µÚ¶þ¸ö²ÎÊý¾ÍÊÇÓÃÀ´¶ÔÏñËØÖµ½øÐзÖÀàµÄãÐÖµ¡£µÚÈý¸ö²ÎÊý¾ÍÊǵ±ÏñËØÖµ¸ßÓÚ£¨ÓÐʱÊÇСÓÚ£©ãÐֵʱӦ¸Ã±»¸³ÓèµÄеÄÏñËØÖµ¡£OpenCVÌṩÁ˶àÖÖ²»Í¬µÄãÐÖµ·½·¨£¬ÕâÊÇÓеÚËĸö²ÎÊýÀ´¾ö¶¨µÄ¡£ÕâЩ·½·¨°üÀ¨£º
1.cv2.THRESH_BINARY
2.cv2.THRESH_BINARY_INV
3.cv2.THRESH_TRUNC
4.cv2.THRESH_TOZERO
5.cv2.THRESH_TOZERO_INV
ÉÏͼժѡ×Ô¡¶Ñ§Ï° OpenCV¡·ÖÐÎİ棬ÆäʵÕâЩÔÚÎĵµÖж¼ÓÐÏêϸ½éÉÜÁË£¬ÄãÒ²¿ÉÒÔÖ±½Ó²é¿´Îĵµ¡£
Õâ¸öº¯ÊýÓÐÁ½¸ö·µ»ØÖµ£¬µÚÒ»¸öΪ retVal£¬ÎÒÃǺóÃæ»á½âÊÍ¡£µÚ¶þ¸ö¾ÍÊÇãÐÖµ»¯Ö®ºóµÄ½á¹ûͼÏñÁË¡£
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('gradient.png',0)
ret,thresh1 = cv2.threshold(img,127,255,cv2. THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2. THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2. THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2. THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO',' TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4,
thresh5] for i in xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([]) plt.show() |
×¢Ò⣺ΪÁËͬʱÔÚÒ»¸ö´°¿ÚÖÐÏÔʾ¶à¸öͼÏñ£¬ÎÒÃÇʹÓú¯Êý plt.subplot()¡£Äã¿ÉÒÔͨ¹ý²é¿´ Matplotlib
µÄÎĵµ»ñµÃ¸ü¶àÏêϸÐÅÏ¢¡£
½á¹ûÈçÏ£º

15.2 ×ÔÊÊÓ¦ãÐÖµ
ÔÚÇ°ÃæµÄ²¿·ÖÎÒÃÇʹÓÃÊÇÈ«¾ÖãÐÖµ£¬Õû·ùͼÏñ²ÉÓÃͬһ¸öÊý×÷ΪãÐÖµ¡£µ±Ê±ÕâÖÖ·½·¨²¢²»ÊÊÓ¦ÓëËùÓÐÇé¿ö£¬ÓÈÆäÊǵ±Í¬Ò»·ùͼÏñÉϵIJ»Í¬²¿·ÖµÄ¾ßÓв»Í¬ÁÁ¶Èʱ¡£ÕâÖÖÇé¿öÏÂÎÒÃÇÐèÒª²ÉÓÃ×ÔÊÊÓ¦ãÐÖµ¡£´ËʱµÄãÐÖµÊǸù¾ÝͼÏñÉϵÄÿһ¸öÐ¡ÇøÓò¼ÆËãÓëÆä¶ÔÓ¦µÄãÐÖµ¡£Òò´ËÔÚͬһ·ùͼÏñÉϵIJ»Í¬ÇøÓò²ÉÓõÄÊDz»Í¬µÄãÐÖµ£¬´Ó¶øÊ¹ÎÒÃÇÄÜÔÚÁÁ¶È²»Í¬µÄÇé¿öϵõ½¸üºÃµÄ½á¹û¡£
ÕâÖÖ·½·¨ÐèÒªÎÒÃÇÖ¸¶¨Èý¸ö²ÎÊý£¬·µ»ØÖµÖ»ÓÐÒ»¸ö¡£
Adaptive Method- Ö¸¶¨¼ÆËããÐÖµµÄ·½·¨¡£
¨C cv2.ADPTIVE_THRESH_MEAN_C£ºãÐֵȡ×ÔÏàÁÚÇøÓòµÄƽ¾ùÖµ
¨C cv2.ADPTIVE_THRESH_GAUSSIAN_C£ºãÐֵȡֵÏàÁÚÇøÓòµÄ¼ÓȨºÍ£¬È¨ÖØÎªÒ»¸ö¸ß˹´°¿Ú¡£
Block Size - ÁÚÓò´óС£¨ÓÃÀ´¼ÆËããÐÖµµÄÇøÓò´óС£©¡£
C - Õâ¾ÍÊÇÊÇÒ»¸ö³£Êý£¬ãÐÖµ¾ÍµÈÓ򵀮½¾ùÖµ»òÕß¼ÓȨƽ¾ùÖµ¼õÈ¥Õâ¸ö³£Êý¡£
ÎÒÃÇʹÓÃÏÂÃæµÄ´úÂëÀ´Õ¹Ê¾¼òµ¥ãÐÖµÓë×ÔÊÊÓ¦ãÐÖµµÄ²î±ð£º
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('dave.jpg',0)
img = cv2.medianBlur(img,5) ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_ THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_ THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) titles = ['Original Image', 'Global Thresholding
(v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian
Thresholding']
images = [img, th1, th2, th3] for i in xrange(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show() |
½á¹û£º

15.3 Otsu¡¯ ¡¯s ¶þÖµ»¯
ÔÚµÚÒ»²¿·ÖÖÐÎÒÃÇÌáµ½¹ý retVal£¬µ±ÎÒÃÇʹÓà Otsu ¶þÖµ»¯Ê±»áÓõ½Ëü¡£ÄÇôËüµ½µ×ÊÇÊ²Ã´ÄØ£¿
ÔÚʹÓÃÈ«¾ÖãÐֵʱ£¬ÎÒÃǾÍÊÇËæ±ã¸øÁËÒ»¸öÊýÀ´×öãÐÖµ£¬ÄÇÎÒÃÇÔõô֪µÀÎÒÃÇѡȡµÄÕâ¸öÊýµÄºÃ»µÄØ£¿´ð°¸¾ÍÊDz»Í£µÄ³¢ÊÔ¡£Èç¹ûÊÇÒ»¸±Ë«·åͼÏñ£¨¼òµ¥À´ËµË«·åͼÏñÊÇָͼÏñÖ±·½Í¼ÖдæÔÚÁ½¸ö·å£©ÄØ£¿ÎÒÃÇÆñ²»ÊÇÓ¦¸ÃÔÚÁ½¸ö·åÖ®¼äµÄ·å¹Èѡһ¸öÖµ×÷ΪãÐÖµ£¿Õâ¾ÍÊÇ
Otsu ¶þÖµ»¯Òª×öµÄ¡£¼òµ¥À´Ëµ¾ÍÊǶÔÒ»¸±Ë«·åͼÏñ×Ô¶¯¸ù¾ÝÆäÖ±·½Í¼¼ÆËã³öÒ»¸öãÐÖµ¡££¨¶ÔÓÚ·ÇË«·åͼÏñ£¬ÕâÖÖ·½·¨µÃµ½µÄ½á¹û¿ÉÄܻ᲻ÀíÏ룩¡£
ÕâÀïÓõ½µ½µÄº¯Êý»¹ÊÇ cv2.threshold()£¬µ«ÊÇÐèÒª¶à´«ÈëÒ»¸ö²ÎÊý£¨flag£©£ºcv2.THRESH_OTSU¡£ÕâʱҪ°ÑãÐÖµÉèΪ
0¡£È»ºóËã·¨»áÕÒµ½×îÓÅãÐÖµ£¬Õâ¸ö×îÓÅãÐÖµ¾ÍÊÇ·µ»ØÖµ retVal¡£Èç¹û²»Ê¹Óà Otsu ¶þÖµ»¯£¬·µ»ØµÄretVal
ÖµÓëÉ趨µÄãÐÖµÏàµÈ¡£
ÏÂÃæµÄÀý×ÓÖУ¬ÊäÈëͼÏñÊÇÒ»¸±´øÓÐÔëÉùµÄͼÏñ¡£µÚÒ»ÖÖ·½·¨£¬ÎÒÃÇÉè127
Ϊȫ¾ÖãÐÖµ¡£µÚ¶þÖÖ·½·¨£¬ÎÒÃÇÖ±½ÓʹÓà Otsu ¶þÖµ»¯¡£µÚÈýÖÖ·½·¨£¬ÎÒÃÇÊ×ÏÈʹÓÃÒ»¸ö 5x5 µÄ¸ß˹ºË³ýÈ¥ÔëÒô£¬È»ºóÔÙʹÓÃ
Otsu ¶þÖµ»¯¡£¿´¿´ÔëÒôÈ¥³ý¶Ô½á¹ûµÄÓ°ÏìÓжà´ó°É¡£
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('noisy2.png',0) # global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2. THRESH_BINARY) # Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2. THRESH_BINARY+cv2. THRESH_OTSU) # Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2. THRESH_BINARY+cv2. THRESH_OTSU) # plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram',' Global
Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's
Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's
Thresholding"] for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show() |

15.4 Otsu¡¯ ¡¯s ¶þÖµ»¯ÊÇÈçºÎ¹¤×÷µÄ£¿
ÔÚÕâÒ»²¿·ÖÎÒÃÇ»áÑÝʾÔõÑùʹÓà Python À´ÊµÏÖ Otsu ¶þÖµ»¯Ëã·¨£¬´Ó¶ø¸æËß´ó¼ÒËüÊÇÈçºÎ¹¤×÷µÄ¡£Èç¹ûÄã²»¸ÐÐËȤµÄ»°¿ÉÒÔÌø¹ýÕâÒ»½Ú¡£ÒòΪÊÇË«·åͼ£¬Otsu
Ëã·¨¾ÍÊÇÒªÕÒµ½Ò»¸öãÐÖµ£¨t£©, ʹµÃͬһÀà¼ÓȨ·½²î×îС£¬ÐèÒªÂú×ãÏÂÁйØÏµÊ½£º

ÆäÖУº

Æäʵ¾ÍÊÇÔÚÁ½¸ö·åÖ®¼äÕÒµ½Ò»¸öãÐÖµ t£¬½«ÕâÁ½¸ö·å·Ö¿ª£¬²¢ÇÒʹÿһ¸ö·åÄڵķ½²î×îС¡£ÊµÏÖÕâ¸öËã·¨µÄ Python
´úÂëÈçÏ£º
img = cv2.imread('noisy2.png',0)
blur = cv2.GaussianBlur(img,(5,5),0)
# find normalized_histogram, and its cumulative
distribution function
hist = cv2.calcHist([blur],[0],None, [256],[0,256])
hist_norm = hist.ravel()/hist.max()
Q = hist_norm.cumsum() bins = np.arange(256) fn_min = np.inf
thresh = -1 for i in xrange(1,256):
p1,p2 = np.hsplit(hist_norm,[i]) # probabilities
q1,q2 = Q[i],Q[255]-Q[i] # cum sum of classes
b1,b2 = np.hsplit(bins,[i]) # weights # finding means and variances
m1,m2 = np.sum(p1*b1)/q1, np.sum(p2*b2)/q2
v1,v2 = np.sum(((b1-m1)**2)*p1)/q1,np.sum(((b2-m2)**2)*p2)/q2 # calculates the minimization function
fn = v1*q1 + v2*q2
if fn < fn_min:
fn_min = fn
thresh = i # find otsu's threshold value with OpenCV function
ret, otsu = cv2.threshold(blur,0,255,cv2. THRESH_BINARY+cv2. THRESH_OTSU)
prin(thresh,ret) |
|