参考:谷歌图片
- 多尺度图像处理
- 形象金字塔
- 使用 OpenCV 的图像金字塔
- 使用金字塔进行图像混合
- 图像压缩
优势
- 缩小规模以减少存储需求。
- 放大图像以进行缩放操作。
- 缩放图像并组合它们用于增加图像清晰度。
- 这种放大和缩小可以被想象成金字塔。由此得名金字塔图像处理。
使用 OpenCV 降低金字塔
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("imgs/chapter8/indoor.jpg", 0)print("Original Image shape - {}".format(img.shape))lower_reso1 = cv2.pyrDown(img)print("First Lower Pyramid Image shape - {}".format(lower_reso1.shape))f = plt.figure(figsize=(15,15))
f.add_subplot(2, 1, 1).set_title('Original Image')
plt.imshow(img, cmap="gray")
f.add_subplot(2, 1, 2).set_title('Lower level 1 Image')
plt.imshow(lower_reso1, cmap="gray")
plt.show()
输出
Original Image shape - (423, 640)
First Lower Pyramid Image shape - (212, 320)
注意:看图像旁边的比例,而不是可见的形状
使用 OpenCV 的更高金字塔
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("imgs/chapter8/indoor.jpg", 0)
print("Original Image shape - {}".format(img.shape))
lower_reso1 = cv2.pyrDown(img)
print("First Lower Pyramid Image shape - {}".format(lower_reso1.shape))
restored_reso = cv2.pyrUp(lower_reso1)
print(" Restored Image shape -{}".format(restored_reso.shape))
f = plt.figure(figsize=(15,15))
f.add_subplot(2, 1, 1).set_title('Original Image')
plt.imshow(img, cmap="gray")
f.add_subplot(2, 1, 2).set_title('Restored Image')
plt.imshow(restored_reso, cmap="gray")
plt.show()
输出
Original Image shape - (423, 640)
First Lower Pyramid Image shape - (212, 320)
Restored Image shape - (424, 640)
高斯金字塔缩减
%matplotlib inline
**import** **numpy** **as** **np**
**import** **cv2**
**from** **matplotlib** **import** pyplot **as** plt
A = cv2.imread("imgs/chapter8/sea.jpg", 1);
height, width, channel = A.shape;
gaussian_pyramid = [];
*# First image in pyramid is the orginal one*gaussian_pyramid.append(A);
*# Then for six times we apply pyramid down functions*
**for** i **in** range(5):
A = cv2.pyrDown(A)
B = np.zeros((height, width, 3), dtype=np.uint8)
B[:A.shape[0], :A.shape[1], :] = A[:, :, :]
gaussian_pyramid.append(B)img1 = np.hstack((gaussian_pyramid[0], gaussian_pyramid[1]))
img2 = np.hstack((gaussian_pyramid[2], gaussian_pyramid[3]))
img3 = np.hstack((gaussian_pyramid[4], gaussian_pyramid[5]))
out = np.vstack((img1, img2, img3))
plt.figure(figsize=(15, 15))
plt.imshow(out[:,:,::-1])
plt.show()
拉普拉斯金字塔放大
%matplotlib inline
**import** **numpy** **as** **np**
**import** **cv2**
**from** **matplotlib** **import** pyplot **as** plt
A = cv2.imread("imgs/chapter8/outdoor.jpg", 1)
down = cv2.pyrDown(A)
up = cv2.pyrUp(down)
print(A.shape, up.shape)
laplacian_up = cv2.subtract(A, up)
plt.figure(figsize=(15, 15))
plt.imshow(laplacian_up[:,:,::-1])
plt.show()
输出
(360, 640, 3) (360, 640, 3)
图像的持续集成
*'''
Image credits: https://github.com/opencv/opencv/tree/master/samples/data*
'''%matplotlib inline
**import** **numpy** **as** **np**
**import** **cv2**
**from** **matplotlib** **import** pyplot **as** plt
A = cv2.imread("imgs/chapter8/orange.jpg", 1);
B = cv2.imread("imgs/chapter8/apple.jpg", 1);
*# generate Gaussian pyramid for A*
G = A.copy()
gpA = [G]
**for** i **in** range(6):
G = cv2.pyrDown(G)
gpA.append(G)
*# generate Gaussian pyramid for B*
G = B.copy()
gpB = [G]
**for** i **in** range(6):
G = cv2.pyrDown(G)
gpB.append(G)
*# generate Laplacian Pyramid for A*
lpA = [gpA[5]]
**for** i **in** range(5,0,-1):
GE = cv2.pyrUp(gpA[i])
L = cv2.subtract(gpA[i-1],GE)
lpA.append(L)
*# generate Laplacian Pyramid for B*
lpB = [gpB[5]]
**for** i **in** range(5,0,-1):
GE = cv2.pyrUp(gpB[i])
L = cv2.subtract(gpB[i-1],GE)
lpB.append(L)
*#Now add left and right halves of images in each level*
LS = []
**for** la,lb **in** list(zip(lpA,lpB)):
rows,cols,dpt = la.shape
ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))
LS.append(ls)
*# now reconstruct*
ls_ = LS[0]
**for** i **in** range(1,6):
ls_ = cv2.pyrUp(ls_)
ls_ = cv2.add(ls_, LS[i])
*# image with direct connecting each half*
real = np.hstack((A[:,:cols//2],B[:,cols//2:]))
*#cv2.imwrite('Pyramid_blending2.jpg',ls_)*
*#cv2.imwrite('Direct_blending.jpg',real)*
f = plt.figure(figsize=(15,15))
f.add_subplot(2, 1, 1).set_title('Pyramidal Blending');
plt.imshow(ls_[:, :,::-1])
f.add_subplot(2, 1, 2).set_title('Direct Blending');
plt.imshow(real[:, :,::-1]);
plt.show()
- 到 2020 年底,数字世界预计将产生 45z 字节的数据。其中大部分是图像和视频。平均而言,个人日常互联网数据使用的 80 %来自视频和图像。
迫切需要无损数据压缩技术
- 更少的数据传输
- 较少的数据存储
流行的图像压缩技术
无损压缩
- 用于 BMP 文件的游程编码。
- 压缩用于 PNG 文件的数据。
- 用于 gif 的 LZW 压缩
有损压缩
- 联合图像专家组
你可以在 Github 上找到完整的 jupyter 笔记本。
如果你有任何问题,你可以联系阿布舍克和阿卡什。请随意联系他们。
我对计算机视觉和深度学习充满热情。我是 Monk Libraries 的开源贡献者。
你也可以在以下网址看到我的其他作品:
medium.com](https://medium.com/@akulahemanth)
照片由 Srilekha 拍摄