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

希望有能力的朋友还是拿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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值