图像金字塔
向上采样:
通常将图像的宽度和高度都变为原来的2倍。这意味着,向上采样的结果图像的大小是原始图像的4倍。因此,要在结果图像中补充大量的像素点。对新生成的像素点进行赋值的行为,称为插值。
做法:
- 插值
- 高斯滤波
向上采样和向下采样是相反的两种操作。但是由于向下采样会丢失像素值
,所以这两种操作并不是可逆的。也就是说,对一幅图像先向上采样、再向下采样,是无法恢复其原始状态的;同样,对一幅图像先向下采样、再向上采样也无法恢复到原始状态。
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