最近跟着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