Skip to content

Commit c5cb8d2

Browse files
committed
update ch22-2
1 parent c2e8214 commit c5cb8d2

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# -*- coding: utf-8 -*-
2+
# @Time : 2017/7/12 下午11:06
3+
# @Author : play4fun
4+
# @File : 22.4-OpenCV中的反向投影.py
5+
# @Software: PyCharm
6+
7+
"""
8+
22.4-OpenCV中的反向投影.py:
9+
OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向 投影。
10+
它的参数与函数 cv2.calcHist 的参数基本相同。
11+
其中的一个参数是我 们 查找目标的直方图。
12+
同样再使用目标的直方图做反向投影之前
13+
我们应 先 对其做归一化处理。
14+
返回的结果是一个概率图像 我们再使用一个圆盘形卷积 核对其做卷操作 最后使用 值 二值化
15+
"""
16+
17+
import cv2
18+
import numpy as np
19+
20+
roi = cv2.imread('tar.jpg')
21+
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
22+
target = cv2.imread('roi.jpg')
23+
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
24+
# calculating object histogram
25+
roihist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
26+
27+
# normalize histogram and apply backprojection
28+
# 归一化 原始图像 结果图像 映射到结果图像中的最小值 最大值 归一化类型
29+
# cv2.NORM_MINMAX 对数组的所有值进行转化 使它们线性映射到最小值和最大值之 间
30+
# 归一化之后的直方图便于显示 归一化之后就成了 0 到 255 之 的数了。
31+
cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)
32+
dst = cv2.calcBackProject([hsvt], [0, 1], roihist, [0, 180, 0, 256], 1)
33+
34+
# Now convolute with circular disc
35+
# 此处卷积可以把分散的点连在一起
36+
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
37+
dst = cv2.filter2D(dst, -1, disc)
38+
# threshold and binary AND
39+
ret, thresh = cv2.threshold(dst, 50, 255, 0)
40+
41+
# 别忘了是三 图像 因此 使用 merge 变成 3
42+
thresh = cv2.merge((thresh, thresh, thresh))
43+
44+
# 按位操作
45+
res = cv2.bitwise_and(target, thresh)
46+
res = np.hstack((target, thresh, res))
47+
cv2.imwrite('res.jpg', res)
48+
49+
# 显示图像
50+
cv2.imshow('1', res)
51+
cv2.waitKey(0)
52+
cv2.destroyAllWindows()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# -*- coding: utf-8 -*-
2+
# @Time : 2017/7/12 下午11:01
3+
# @Author : play4fun
4+
# @File : 22.4-直方图反向投影.py
5+
# @Software: PyCharm
6+
7+
"""
8+
22.4-直方图反向投影.py:
9+
10+
直方图反向投影是由 Michael J. Swain 和 Dana H. Ballard 在他们的 文章 Indexing via color histograms 中提出。
11+
12+
它到底是什么呢 它可以用来做图像分割 或者在图像中找寻我们感兴 的 分。
13+
简单来 它会 出与 入图像 待搜索 同样大小的图像 其中 的每一个像素值代 了 入图像上对应点属于目标对 的概率。
14+
用更简单的 来 输出图像中像素值越高(越白) 的点就 可能代表我们 搜索的目标
15+
在输入图像所在的位置 。
16+
这是一个直观的解释 。
17+
18+
直方图投影经常与 camshift 算法等一 使用。
19+
20+
21+
22+
"""
23+
import cv2
24+
import numpy as np
25+
from matplotlib import pyplot as plt
26+
27+
# Numpy 中的算法
28+
29+
# roi is the object or region of object we need to find
30+
roi = cv2.imread('rose_red.png')
31+
hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
32+
# target is the image we search in
33+
target = cv2.imread('rose.png')
34+
35+
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
36+
# Find the histograms using calcHist. Can be done with np.histogram2d also
37+
M = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
38+
I = cv2.calcHist([hsvt], [0, 1], None, [180, 256], [0, 180, 0, 256])
39+
40+
h, s, v = cv2.split(hsvt)
41+
B = R[h.ravel(), s.ravel()]
42+
B = np.minimum(B, 1)
43+
B = B.reshape(hsvt.shape[:2])
44+
45+
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
46+
B = cv2.filter2D(B, -1, disc)
47+
B = np.uint8(B)
48+
cv2.normalize(B, B, 0, 255, cv2.NORM_MINMAX)
49+
50+
ret,thresh = cv2.threshold(B,50,255,0)
51+
52+

0 commit comments

Comments
 (0)