【OpenCV高阶 之 图像金字塔 AND 图像直方图】

向上采样:

通常将图像的宽度和高度都变为原来的2倍。这意味着,向上采样的结果图像的大小是原始图像的4倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为插值
做法:

  1. 插值
  2. 高斯滤波

在这里插入图片描述
向上采样和向下采样是相反的两种操作。但是由于向下采样会丢失像素值,所以这两种操作并不是可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态。

dst = cv2.pyrUp(src[,dstsize[,borderType]]

拉普拉斯金字塔:

为了在向上采样是能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。也是拉普拉斯金字塔是由向下采样时丢失的信息构成。

拉普拉斯金字塔的定义:
Li = Gi - pyrUp(pyrsown(Gi)))
式中:Li:表示拉普拉斯金字塔中的第i层
Gi:表示高斯金字塔中的第i层
Gi+1:表示高斯金字塔中的第i+1层

在这里插入图片描述

图像直方图:

直方图:是图像中像素强度分布的图形表达方式。

直方图的作用:

例如视频中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。
在这里插入图片描述

灰度值在0-255范围之间总共256个值,可以将我们的范围划分为子部分(称为bins).例如:
在这里插入图片描述
在这里插入图片描述

直方图均衡化:

是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。

实现方法:通过将图像的像素值分布均匀化来实现这一目标。

在python OpenCV 中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。
在这里插入图片描述

代码示例:

import cv2
import matplotlib.pyplot as plt
import numpy as np
'''-------------高斯金字塔操作中的向下取样-------'''
face=cv2.imread('face.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('face',face)
cv2.waitKey(100000)
face_down_1=cv2.pyrDown(face)
cv2.imshow('face_down_1',face_down_1)
cv2.waitKey(100000)
face_down_2=cv2.pyrDown(face_down_1)
cv2.imshow('face_down_2',face_down_2)
cv2.waitKey(100000)

face_up_1=cv2.pyrUp(face)
cv2.imshow('face_up_1',face_up_1)
cv2.waitKey(100000)
face_up_2=cv2.pyrUp(face_up_1)
cv2.imshow('face_up_2',face_up_2)
cv2.waitKey(100000)

#对向下采用后图像进行上采样,图像变模糊,无法复原
face_down_1_up=cv2.pyrUp(face_down_1)
cv2.imshow('face_down_1_up',face_down_1_up)
cv2.waitKey(100000)

face_down_2_up=cv2.pyrUp(face_down_2)
cv2.imshow('face_down_2_up',face_down_1_up)
cv2.waitKey(100000)

#拉普拉斯金字塔
L0=face - face_down_1_up
L1=face_down_1 - face_down_2_up

face_restore_1=L1+face_down_2_up
cv2.imshow('face_restore_1',face_restore_1)
cv2.waitKey(100000)

cv2.imshow('L1',L1)
cv2.waitKey(100000)

'''------------------------直方图-------------------'''
#cv2.calcHist(images,channels,mask,histSize,ranges) [r,g,b]
# images: 原图像。当传入函数时应 用中括号[]括来例如[img]
# channels:表示传入的图像通道数。如果输入图像是灰度图它的值就是[0]。
# 如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR.
# mask: 掩模图像。统计整幅图像的直方图就把它为None。但是如果你想统计图像某一部分的直方图,你就制作一个掩膜图像
# histsize:BINS的数目。也需用中括号来表示,它表示将像素值范围划分为多少个小区间。
        # 设置为[256],表示将0-255的像素值范围划分为256个bin。
# ranges:图像的范围,一般是[0,456]

phone = cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE)
phone_hist=cv2.calcHist([phone],[0],None,[16],[0,256])
a=phone.ravel()#将高维数组降为一维数组的方法
plt.hist(a)#用于绘制直方图
plt.show()

plt.plot(phone_hist)#使用calcHist的值绘制曲线图
plt.show()

# # 绘制三个通道的直方图曲线
img=cv2.imread('phone.png')
color=('b','g','r')
for i, col in enumerate(color):
    histr=cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
plt.show()

#什么是mask? 掩膜,ps pr
#mask参数如何使用?mask为掩膜图像,先来看一下mask效果
phone=cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('phone',phone)
cv2.waitKey(100000)
mask=np.zeros(phone.shape[:2],np.uint8) #创建黑白图像,用于制作Mask
mask[50:350,100:470]=255
cv2.imshow('mask',mask)
cv2.waitKey(100000)

# cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制"与"操作,1&1=1,1&0=0,0&1=0,
# bitwise _and(src1,src2,dst=None,mask=None)参数:
# src1、src2:为输入图像或标量,标src1和src2相与。
# dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同
# mask:图像掩膜,可选参数,在掩模的范围内做图像与运算,mask为日的值,src1和src2相与的值都为0.
#  非0的值,为src1和src2相与的值。
Phone_mask=cv2.bitwise_and(phone,phone,mask=mask)
cv2.imshow('phone_mask',Phone_mask)
cv2.waitKey(100000)

phone_hist_mask=cv2.calcHist([phone],[0],mask,[256],[0,256])
plt.plot(phone_hist_mask) #使用calcHist的值绘制曲线图
plt.show()

#直方图均衡化:直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。
# #直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。
#在Python 0penCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。
#该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度

phone=cv2.imread('woman.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('woman',phone)
cv2.waitKey(100000)

phone_hist=cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(phone.ravel(),bins=256) #numpy中的ravel将数组多维度拉成一维数组
plt.show()

phone_equalize=cv2.equalizeHist(phone)
plt.hist(phone_equalize.ravel(),bins=256) #numpy中的ravel将数组多维度拉成一维数组
plt.show()

res=np.hstack((phone,phone_equalize)) #横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组
cv2.imshow('woman_equalize',res)
cv2.waitKey(100000)

# # 自适应直方图均衡化(局部直方图处理),当需要保存细节特征,需要做局部处理
## cv2.createCLAHE([,clipLimit[,tileGridsize]])→ retval
## 参数说明:
## clipLimit;对比度限制。对比度超过该值的像素将被截断,以防止过度增强对比度,默认值 8。
# # 对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间
# # titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值(8,8)
# clahe = cv2.createCLAHE(clipLimit=0.5,tileGridSize=(8,8))
clahe=cv2.createCLAHE(clipLimit=0.5,tileGridSize=(8,8)) # 通过类创建了一个局部均衡化对象
phone_clahe=clahe.apply(phone)
res=np.hstack((phone,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize',res)
cv2.waitKey(100000)

执行结果:

face:

在这里插入图片描述

向下采样操作face_down_1 face_down_2:

在这里插入图片描述

向上采样1次:face_up_1:

在这里插入图片描述

向上采样2次:face_up_2:

在这里插入图片描述

向下采样1次之后再向上采样face_down_1_up:

在这里插入图片描述

向下采样2次之后再向上采样face_down_2_up:

在这里插入图片描述

#对向下采用后图像进行上采样,图像变模糊,无法复原

拉普拉斯金字塔

face_restore_1:

在这里插入图片描述

L1:
在这里插入图片描述


直方图

FIgure1:
在这里插入图片描述

曲线图

在这里插入图片描述

三个通道的直方图曲线

在这里插入图片描述

phone原图:

在这里插入图片描述

掩膜图像mask

在这里插入图片描述

mask掩膜图像中每个像素值二进制“与”操作 phone_mask

在这里插入图片描述

mask 曲线图

在这里插入图片描述

woman原图

在这里插入图片描述

woman多维变一维

在这里插入图片描述

在这里插入图片描述

横向拼接 woman_equalize:

在这里插入图片描述

自适应直方图均衡化后 phone_equalize

在这里插入图片描述


xue

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值