云计算百科
云计算领域专业知识百科平台

计算机视觉opencv之金字塔&直方图

一、金字塔

(一)高斯金字塔

高斯金字塔是一种图像多尺度表示方法,用于图像处理中的尺寸缩放和多分辨率分析。

1.高斯金字塔操作中的下采样

下采样是一种减小图像尺寸的方法,它通常涉及到降低图像的分辨率,即减少图像中像素的数量,从而使图像看起来更小

import cv2
image=cv2.imread(r"D:\\project\\123s.jpg",0)
cv2.imshow('image1',image)

image_down1=cv2.pyrDown(image)
cv2.imshow('down1',image_down1)

image_down2=cv2.pyrDown(image_down1)
cv2.imshow('down2',image_down2)

cv2.waitKey(0)

对原图进行缩小,删除像素矩阵的偶数行和列,图片变模糊

2.高斯金字塔操作中的上采样

上采样是一种增大图像尺寸的方法,他通过插值和滤波技术来恢复图像的分辨率和细节,通常用意图像放大或与下采样后的图像进行比较(这里我们接着下采样代码后面写)

image_up1=cv2.pyrUp(image)
cv2.imshow('up1',image_up1)

image_up2=cv2.pyrUp(image_up1)
cv2.imshow('up1',image_up2)
cv2.waitKey(0)

图片会变得很大,由于太大,不好展示,上采样是插入零行或列

3.对下采样后图像进行上采样

'''对下采样后图像进行上采样,图像变模糊,无法复原'''
image_down1_up=cv2.pyrUp(image_down1)
image_down2_up=cv2.pyrUp(image_down2)

cv2.imshow('down1_up',image_down1_up)
cv2.imshow('down2_up',image_down2_up)
cv2.waitKey(0)

(二)拉普拉斯金字塔

拉普拉斯金字塔是高斯金字塔的“细节补充”版本,用于保存和恢复图像高频细节。

拉普拉斯 = 原图 – 上采样的模糊图

这里我们在L0和L1之间加入的使用resize是让down2——up图片尺寸和down1图片尺寸保持一致,这样才可以进行相减,不进行尺寸一致,就会报错

'''拉普拉斯金字塔'''
L0=image-image_down1_up

image_down2_up = cv2.resize(image_down2_up, (image_down1.shape[1], image_down1.shape[0]))

L1=image_down1-image_down2_up

fuyuan=image_down1_up+L0
cv2.imshow('L0',L0)
cv2.imshow('L1',L1)
cv2.imshow('fuyuan',fuyuan)
cv2.waitKey(0)

三、直方图

cv2.calcHist(images,channeLs,mask,histSize,ranges) :计算图像的直方图,用于表示图像中像素灰度级别的分布情况.

  • images:原图像图像格式为uint8或float32。当传入函数时应用中括号[]括来,例如[img]
  • channels:表示传入的图像通道数。如果输入图像是灰度图它的值就是[0]。 如果是彩色图像的传入的参数可以是[0][1][2]它们分别对应着BGR。
  • mask:掩模图像。统计整幅图像的直方图就把它为None。但是如果你想统计图像某一部分的直方图,你就制作一个掩模图像并使用它。
  • histSize:BINS的数目。也需用中括号括来(分成多少个区间)
  • BINS:上面的直方图显示了每个像素值的像素数,即从0到255。即您需要256个值才能显示上述直方图。

import cv2
import numpy as np
import numpy as pd
import matplotlib.pyplot as plt
image=cv2.imread(r"D:\\project\\cat2s.jpg")
a=image.ravel()#将图像转换为一维数组,numpy的ravel函数
plt.hist(a,bins=256)#matplotlib的hist函数绘制直方图
plt.show()
image_hist=cv2.calcHist([image],[0],None,[16],[0,256])
plt.plot(image_hist)#使用calcHist的值绘制曲线图
plt.show()

img=cv2.imread(r"D:\\project\\cat2s.jpg")
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()

cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制"与"操作,1&1=1,1&0=0,01=0,0&0=0

bitwise_and(src1, src2, dst=None, mask=None)参数:

  • src1、Src2:为输入图像或标量,标src1和src2相与。
  • dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同
  • mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素,mask为o的值,src1和Isrc2相与的值都为0非的值,为src1和src2相与的值。

mask:直方图掩膜(mask)是一个二值图像,用于指定计算直方图的区域。作用:只统计掩膜白色区域(255)的像素,忽略黑色区域(0)

img2=cv2.imread(r"D:\\project\\cat2s.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow('img2',img2)
cv2.waitKey(0)
mask=np.zeros(img2.shape[:2],np.uint8)
mask[50:600,100:400]=255
cv2.imshow('mask',mask)
cv2.waitKey(0)

img2_mask=cv2.bitwise_and(img2,img2,mask=mask)
cv2.imshow('img_mask',img2_mask)
cv2.waitKey(0)
img2_hist_mask=cv2.calcHist([img2],[0],mask,[256],[0,256])
plt.plot(img2_hist_mask)
plt.show()

三、直方图的均衡化

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

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

在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。 该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。

import matplotlib.pyplot as plt
import numpy as np
import cv2
black=cv2.imread("black.jpg",cv2.IMREAD_GRAYSCALE)
plt.hist(black.ravel(),bins=256)#多维数组拉为一维
# plt.show()
black_equalize=cv2.equalizeHist(black)
plt.hist(black_equalize.ravel(),bins=256)
# plt.show()
res=np.hstack((black,black_equalize))#横向拼接,将多个数组按水平方向(列顺序)堆叠一个新的数组
cv2.imshow('black_equalize',res)
cv2.waitKey(0)

自适应百方图均衡化(局部百方图处理),通过局部调整图像的直方图分布来提升图像的对比度和细节表现力,当需要保存细节特征,需要做局部处理

cv2.createCLAHE([, clipLimit[, tileGridSize]])——>retval 参数说明:

  • clipLimit:颜色对比度的阈值,可选项,默认值8
  • titleGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值(8,8)

可以调节参数的值得到处理比较好的图片

clahe=cv2.createCLAHE(clipLimit=30,tileGridSize=(3,3))#通过类创建了一个局部均衡化对象
black_clahe=clahe.apply(black)
res=np.hstack((black,black_equalize,black_clahe))
cv2.imshow('black_equalize',res)
cv2.waitKey(0)

赞(0)
未经允许不得转载:网硕互联帮助中心 » 计算机视觉opencv之金字塔&直方图
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!