Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
Lines changed: 52 additions & 0 deletions
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()
Lines changed: 52 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /