【opencv图像处理】-- 7. 图像金字塔与直方图

"七里香"

  • 1. 图像金字塔
    • 1.1 高斯金字塔
      • 1.1.1向下采样,由大变小
      • 1.1.2 向上采样,由小变大
    • 1.2 拉普拉斯金字塔
  • 2. 图像直方图
    • 2.1 统计直方图
    • 2.2 绘制直方图
      • 2.2.1 不用opencv的统计方法
      • 2.2.2 用opencv统计方法
    • 2.3 使用掩膜的直方图

希望有能力的朋友还是拿C++做。

本节讨论金字塔(高斯金字塔和拉普拉斯金字塔)以及统计图像直方图

1. 图像金字塔

  • 是图像多尺度表达的一种,最主要用于图像分割。是同一图像不同分辨率的子集合。
  • 是一系列以金字塔形状排列的分辨率逐步降低同一张图像的集合。
  • 其通过梯次向下采样获得,直到某个终止条件停下
  • 顶部是高分辨率表示,顶部是低分辨率表示,将一层一层比成金字塔,越靠近顶部,图像越小,分辨率越低
  • 不同于resize的是,需要保留原图1/4的缩放

1.1 高斯金字塔

Gaussian pyramid:用来降采样,主要的图像金字塔

1.1.1向下采样,由大变小

  • 亚采样(subsamping) 采集完之后图变小了 例原有100点 采集10个点
  • 原理十分简单, 进行了卷积操作:
    • 提前准备一高斯卷积核,将Gi与高斯内核卷积
    • 将所有偶数的行和列去掉 就变为1/4了
    • 不用指定尺寸 固定缩为每次1/4
  • 降维
#向下采样
import cv2
import numpy as np

img = cv2.imread('cat.jpeg')
print(img.shape)

#分辨率减小的操作,下采样,只需一个参数,每次固定1/4
dst = cv2.pyrDown(img)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('dst', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

1.1.2 向上采样,由小变大

逆亚采样

  • 将图像在每个方向扩大为原来的两倍,新增的行和列先以0填充
  • 然后使用先前同样的卷积核(X4)与放大后的图像卷积,获得近似值
  • 将原值分配到临近四个为0的邻域,但是图像会变暗,所以乘以4
# 向上采样
import cv2
import numpy as np

img = cv2.imread('cat.jpeg')
print(img.shape)

#分辨率增大的操作,下采样,只需一个参数,每次固定4倍
dst = cv2.pyrUp(img)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('dst', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

1.2 拉普拉斯金字塔

Laplacian pyramid:用于从金字塔底层图像重建上层未采样图像(实际上是原图和高斯金字塔之间的残差,丢到的东西就是拉普拉斯金字塔),在数字图像处理中即为预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用

  • 将降采样之后的图像进行上采样才做,然后与还没降采样的图像做差,得到残差图,为还原图像左信息准备
  • 拉普拉斯金字塔只像图像边缘, 大部分图像都是0,用于图像压缩
  • 由高斯金字塔构成 没有特殊的函数
import cv2
import numpy as np

img = cv2.imread('cat.jpeg')
print(img.shape)


# 这是第0层 的
#先缩小
dst = cv2.pyrDown(img)
#再放大
dst = cv2.pyrUp(dst)
# Laplace = 原图 - dst
lap0 = img - dst

#这是第一层的
dst1 = cv2.pyrDown(dst)
dst1 = cv2.pyrUp(dst1)
lap1 = dst - dst1

cv2.imshow('img', img)
cv2.imshow('dst0', lap0)
cv2.imshow('dst1', lap1)

cv2.waitKey(0)
cv2.destroyAllWindows()
#高斯金字塔取样不可逆

2. 图像直方图

二维统计图表, 可以均衡亮度等

  • 横坐标:图像中各像素点的灰度级
  • 纵坐标:具有该灰度级的像素个数
  • 直方图术语:
    • dims:需要统计的特征数目, 。例如:dims=1,仅统计灰度值
    • bins:每个特征空间子区段的数目(横坐标分段数),一般的bins不缩的话一般是255,详见bins.png
    • range:统计灰度的范围,一般是[0,255]

2.1 统计直方图

  • calcHist(image, channels, mask, histSize, ranges[, hist[, accumulate[]]])
    • image: 原始图像
    • channels:指定通道
      • 中括号括起来,[0]:灰度图,[0],[1],[2]可以作为彩图参数,对应B,G,R
    • mask:掩码图像
      • None:统计整幅图
      • 统计图像某一部分时,就需要掩码图像
    • histSize: BINS的数量
      • 例如[256],表示256个段
    • ranges: 像素值范围,例如[0,255]
    • accumulate:累积标识
      • 默认false
      • True:直方图开始分配时不会清零
      • 该参数允许从多个图像中计算单个直方图,或用于实时更新直方图
      • 多个直方图的累计结果,用于对一组图像计算直方图
import cv2
import numpy as np

img = cv2.imread('cat.jpeg')

hist = cv2.calcHist([img], [0], None, [256], [0,255])
print(hist)

2.2 绘制直方图

2.2.1 不用opencv的统计方法

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('cat.jpeg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

plt.hist(gray.ravel(), bins=256, range=[0,255])

2.2.2 用opencv统计方法

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('cat.jpeg')

histb = cv2.calcHist([img], [0], None, [256], [0,255])
histg = cv2.calcHist([img], [1], None, [256], [0,255])
histr = cv2.calcHist([img], [2], None, [256], [0,255])

#plot不传x的时候,会以histb的索引作为x
plt.plot(histb, color='b', label='blue')
plt.plot(histg, color='g', label='green')
plt.plot(histr, color='r', label='red')
plt.legend()
plt.show()

2.3 使用掩膜的直方图

  • 生成和原图一样尺寸的全黑图片,mask=np.zeros(image.shape, np.uint8)
  • 将想要的区域通过索引的方式设置为纯白255,mask[100:200, 200:300]=255
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('cat.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#生成掩膜图像
mask = np.zeros(gray.shape, np.uint8)

#设置想要统计的直方图区域
mask[200:400, 200:400] = 255


cv2.imshow('mask', mask)
cv2.imshow('gray', gray)
#gray,再和mask做与运算
#cv2.imshow('mask_gray', cv2.bitwise_and(gray, gray, mask=mask))
cv2.imshow('mask_gray', cv2.bitwise_and(gray, mask))
cv2.waitKey(0)
cv2.destroyAllWindows()

你可能感兴趣的:(#,图像处理,opencv,图像处理,计算机视觉,python,人工智能)