最近跟着OpenCV2-Python-Tutorials在学习python_opencv中直方图的反向投影时,第一种方法是使用numpy实现将图中的红色玫瑰分割出来,教程给的代码缺了一句函数,导致实现不出来。
自己加上了后(也不知到这样加对不对)代码和效果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
代码:
import cv2
import numpy as np
roi = cv2.imread( './data/rose_red.jpg' )
hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
#target is the image we search in
target = cv2.imread( './data/rose.jpg' )
cv2.imshow( 'target' ,target)
hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
# Find the histograms using calcHist. Can be done with np.histogram2d also
M = cv2.calcHist([hsv],[ 0 , 1 ], None , [ 180 , 256 ], [ 0 , 180 , 0 , 256 ] )
print (M)
I = cv2.calcHist([hsvt],[ 0 , 1 ], None , [ 180 , 256 ], [ 0 , 180 , 0 , 256 ] )
h,s,v = cv2.split(hsvt)
#斜体是自己加上的
R = M / I
print (R.shape)
B = R[h.ravel(),s.ravel()]
print (B)
B = np.minimum(B, 1 )
print (B)
B = B.reshape(hsvt.shape[: 2 ])
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,( 9 , 9 ))
B = cv2.filter2D(B, - 1 ,disc)
B = np.uint8(B)
cv2.normalize(B,B, 0 , 255 ,cv2.NORM_MINMAX)
cv2.imshow( 'B' ,B)
ret,thresh = cv2.threshold(B, 2 , 255 , 0 )
cv2.imshow( 'thresh' ,thresh)
res = cv2.bitwise_and(target,target,mask = thresh)
cv2.imshow( 'res' ,res)
cv2.waitKey( 0 )
|
效果:
rose_red.jpg
rose.jpg
result:
以上这篇python使用numpy实现直方图反向投影示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_29023939/article/details/81082040