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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
OpenCV ÖеÄͼÏñ´¦Àí ²¿·Ö IV (Ò»)
 
×÷Õߣº _Undo
  2083  次浏览      28
 2020-2-17
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁËÈçºÎѧϰÈçºÎ¶ÔͼÏñ½øÐÐÑÕÉ«¿Õ¼äת»»ÒÔ¼°¼òµ¥ãÐÖµ£¬×ÔÊÊÓ¦ãÐÖµ£¬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)

   
2083 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

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