Skip to content

Commit 051f311

Browse files
committed
update ch20
1 parent b1252da commit 051f311

File tree

5 files changed

+81
-18
lines changed

5 files changed

+81
-18
lines changed

ch19-Canny边缘检测/19.Canny.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import numpy as np
3030
from matplotlib import pyplot as plt
3131

32-
img = cv2.imread('../data/messi5.jpg', 0)
32+
img = cv2.imread('../data/messi5.jpg')
3333
edges = cv2.Canny(img, 100, 200)
3434

3535
plt.subplot(121), plt.imshow(img, cmap='gray')
Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,68 @@
11
# -*- coding: utf-8 -*-
22

3+
'''
4+
图像 字塔的一个应用是图像 合。例如 在图像缝合中 你 将两幅 图叠在一 但是由于 接区域图像像素的不 续性 整幅图的效果看 来会 很差。 时图像 字塔就可以排上用场了 他可以帮你实现无缝 接。 的 一个经典案例就是将两个水果 合成一个 看看下图也 你就明白我在 什么 了。
5+
6+
7+
实现上 效果的步 如下
8+
1. 入两幅图像 苹果和句子
9+
2. 构建苹果和橘子的 斯 字塔 6 层
10+
3. 根据 斯 字塔 算拉普拉斯 字塔
11+
4. 在拉普拉斯的每一层 图像 合 苹果的左 与橘子的右 合 5. 根据 合后的图像 字塔 建原始图像。
12+
'''
13+
314
import cv2
4-
import numpy as np,sys
15+
import numpy as np, sys
16+
517
A = cv2.imread('apple.jpg')
618
B = cv2.imread('orange.jpg')
19+
720
# generate Gaussian pyramid for A
821
G = A.copy()
922
gpA = [G]
10-
for i in xrange(6):
23+
for i in range(6):
1124
G = cv2.pyrDown(G)
1225
gpA.append(G)
26+
1327
# generate Gaussian pyramid for B
1428
G = B.copy()
1529
gpB = [G]
16-
for i in xrange(6):
30+
for i in range(6):
1731
G = cv2.pyrDown(G)
1832
gpB.append(G)
33+
1934
# generate Laplacian Pyramid for A
2035
lpA = [gpA[5]]
21-
for i in xrange(5,0,-1):
36+
for i in range(5, 0, -1):
2237
GE = cv2.pyrUp(gpA[i])
23-
L = cv2.subtract(gpA[i-1],GE)
38+
L = cv2.subtract(gpA[i - 1], GE)#TODO error
2439
lpA.append(L)
2540

2641
# generate Laplacian Pyramid for B
2742
lpB = [gpB[5]]
28-
for i in xrange(5,0,-1):
43+
for i in range(5, 0, -1):
2944
GE = cv2.pyrUp(gpB[i])
30-
L = cv2.subtract(gpB[i-1],GE)
45+
L = cv2.subtract(gpB[i - 1], GE)
3146
lpB.append(L)
47+
3248
# Now add left and right halves of images in each level
33-
#numpy.hstack(tup)
34-
#Take a sequence of arrays and stack them horizontally
35-
#to make a single array.
49+
# numpy.hstack(tup)
50+
# Take a sequence of arrays and stack them horizontally
51+
# to make a single array.
3652
LS = []
37-
for la,lb in zip(lpA,lpB):
38-
rows,cols,dpt = la.shape
39-
ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
53+
for la, lb in zip(lpA, lpB):
54+
rows, cols, dpt = la.shape
55+
ls = np.hstack((la[:, 0:cols / 2], lb[:, cols / 2:]))
4056
LS.append(ls)
57+
4158
# now reconstruct
4259
ls_ = LS[0]
43-
for i in xrange(1,6):
60+
for i in range(1, 6):
4461
ls_ = cv2.pyrUp(ls_)
4562
ls_ = cv2.add(ls_, LS[i])
4663

4764
# image with direct connecting each half
48-
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
65+
real = np.hstack((A[:, :cols / 2], B[:, cols / 2:]))
4966

50-
cv2.imwrite('Pyramid_blending2.jpg',ls_)
51-
cv2.imwrite('Direct_blending.jpg',real)
67+
cv2.imwrite('Pyramid_blending2.jpg', ls_)
68+
cv2.imwrite('Direct_blending.jpg', real)

ch20-图像金字塔/apple.jpg

17.4 KB
Loading

ch20-图像金字塔/orange.jpg

18 KB
Loading
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# -*- coding: utf-8 -*-
2+
# @Time : 2017/7/12 下午3:06
3+
# @Author : play4fun
4+
# @File : 图像金字塔.py
5+
# @Software: PyCharm
6+
7+
"""
8+
图像金字塔.py:
9+
一般情况下 我们 处理是一副具有固定分辨率的图像。
10+
但是有些情况下 我们 对同一图像的不同分 率的子图像 处理。
11+
比如 我们 在一幅图 像中查找某个目标 比如脸 我们不知 目标在图像中的尺寸大小。
12+
这种情况下 ,我们 创建创建一组图像 , 这些图像是具有不同分 率的原始图像。
13+
我们把这组图像叫做图像金字塔
14+
简单来说 就是同一图像的不同分辨率的子图集合 。
15+
16+
如果我们把最大的图像放在底部,最小的放在顶部
17+
看起来像一座金字塔, 故而得名:图像金字塔。
18+
有两类图像金字塔: 高斯金字塔和拉普拉斯金字塔。
19+
20+
高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。
21+
图像中的每个像素值等于下一层图像中 5 个像素的 斯加权平均值。
22+
这样 操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。
23+
所以 这幅图像 的面积就变为原来图像面积的四分之一。 这称为 Octave。
24+
连续进行这样 的操作我们就会得到一个分辨率不断下降的图像金字塔。
25+
我们可以使用函数 cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。
26+
27+
28+
"""
29+
30+
import cv2
31+
import numpy as np
32+
33+
higher_reso = cv2.imread('../data/messi5.jpg')
34+
# 函数 cv2.pyrDown() 从一个 分辨率大尺寸的图像向上构建一个金子塔
35+
# 尺寸变小 分辨率降低 。
36+
lower_reso = cv2.pyrDown(higher_reso)
37+
cv2.imshow('lower_reso', lower_reso)
38+
39+
# 从一个低分 率小尺寸的图像向下构建一个 子塔 尺 寸变大 但分 率不会增加
40+
higher_reso2 = cv2.pyrUp(lower_reso)
41+
cv2.imshow('higher_reso2', higher_reso2)
42+
43+
# 你 住的是是 higher_reso2 和 higher_reso 是不同的。因为一旦使 用 cv2.pyrDown() 图像的分辨率就会 低 ,信息就会 丢失
44+
45+
cv2.waitKey(0)
46+
cv2.destroyAllWindows()

0 commit comments

Comments
 (0)