周也带你进阶OpenCV (1)--采样、直方图即均衡化、掩膜

OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。

高阶操作

一、 上、下采样

原图

import cv2
face = cv2.imread('face.jpg',cv2.IMREAD_GRAYSCALE)
face = cv2.resize(face,dsize=(820,820))
cv2.imshow('face',face)
cv2.waitKey(0)

1. 上采样

上采样:图像的放大
过程:在原始图像的每个像素的右侧和下侧分别插入零值列和零值行,高斯滤波处理图片填值,分辨率并不会真正提高
face_up_1 = cv2.pyrUp(face)
cv2.imshow('face_up_1',face_up_1)
cv2.waitKey(0)

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

2. 下采样

下采样:从一个高分辨率大尺寸的图像中构建一个金字塔的下一层,即图像的尺寸变小,分辨率降低
过程:删去图片中的偶数行和偶数列,进行二倍下采样,最后为原图的四分之一
face_down_1 = cv2.pyrDown(face)
cv2.imshow('face_down_1',face_down_1)
cv2.waitKey(0)

face_down_2 = cv2.pyrDown(face_down_1)
cv2.imshow("face_down_2",face_down_2)
cv2.waitKey(0)

3. 恢复原图

# 恢复原图
# 对已经下采样的图片进行上采样,但是由于上采样是以高斯方法填充,所以与原图还是有区别的
face_down_1_up = cv2.pyrUp(face_down_1)
face_down_2_up = cv2.pyrUp(face_down_2)

cv2.imshow('face_down_1_up',face_down_1_up)
cv2.imshow('face_down_2_up',face_down_2_up)
cv2.waitKey(0)

# 进行下采样再上采样之后,与原图的差值区别
L0 = face - face_down_1_up
L1 = face_down_1 - face_down_2_up

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

二、 直方图

直方图是一种统计图表,用于展示图像中像素强度(对于灰度图像)或颜色(对于彩色图像)的分布情况。通过查看直方图,我们可以获得关于图像亮度、对比度、颜色分布等方面的直观信息,这些信息对于后续的图像处理和分析任务至关重要。

1. plt.hist()绘图

phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)

# 将图像转化为一维数组,numpy中的ravel()函数,将多维数据拉成一维数组
a = phone.ravel()

# 绘制直方图
plt.hist(a,bins = 256)

# 显示直方图
plt.show()

参数:

-- a:一维数组,即图像的像素值组成的数组
-- bins:指定直方图的条数,即灰度级的数量

在这里插入图片描述

2. cv2.calcHist()绘图

  • 对于灰度图绘制
phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)
phone_hist = cv2.calcHist([phone],[0],None,[16],[0,256])
plt.plot(phone_hist)
plt.show()

参数:

-- [phone]:这是第一个参数,表示要计算直方图的图像数组。在这个例子中,phone是一个图像变量,它被放在列表中作为参数传递。

-- [0]:这是第二个参数,指定了要计算直方图的通道。对于灰度图像,它通常是[0],因为灰度图像只有一个通道。如果phone是一个彩色图像		(如BGR格式),并且你想要计算蓝色通道的直方图,则这个参数应该是[2](因为B是第一个通道,索引从0开始,但按照BGR的顺序,蓝色		 是第三个元素)。但在这个例子中,由于我们假设phone是灰度图像,所以使用[0]-- None:这是第三个参数,用于指定掩码。掩码是一个与原图像大小相同的单通道图像,用于指定哪些像素应该被包括在直方图的计算中。在这个		例子中,没有使用掩码,所以传递了None-- [16]:这是第四个参数,指定了直方图的bin数目。在这个例子中,直方图被分成了16bin,这意味着像素值的范围(在这个例子中是0256)被分成了16个等宽的区间,每个区间对应直方图中的一个bin-- [0,256]:这是第五个参数,指定了像素值的范围。

在这里插入图片描述

  • 彩图绘制
# 绘制每个颜色的直方图
img = cv2.imread('../phone.png')
color = ('b','g','r')
for i,col in enumerate(color):
    hister = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(hister,color = col)
plt.show()

在这里插入图片描述

三、 mask掩膜

掩膜(Mask)是一种用于控制或限制某些操作或访问特定区域的技术。

1. 原图

phone = cv2.imread('../phone.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('phone',phone)
cv2.waitKey(0)

在这里插入图片描述

2. 创建黑白图像

mask = np.zeros(phone.shape[:2],np.uint8) # 创建黑白图像,用于制作mask
mask[50:350,100:470] = 255
cv2.imshow('mask',mask)
cv2.waitKey(0)

在这里插入图片描述

3. 掩膜

cv2.bitwise_and():对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作:1&1=11&0=00&1=00&0=0
cv2.bitwise_and(src1,src2,dst=None,mask=None)

参数:

-- src1,src2:为输入图像或标量,标src1和src2相与
-- dst:可选输入变量,如果需要使用非None则要先定义,且其大小与输入变量相同
-- mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素。
          mask为0的值,src1和src2相与的值都为00的值,为src1和src2相与的值
phone_mask = cv2.bitwise_and(phone,phone,mask=mask)
cv2.imshow('phone_mask',phone_mask)
cv2.waitKey(0)

在这里插入图片描述

4. 绘制曲线图

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

在这里插入图片描述

四、直方图均衡化

1. 直方图均衡化

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

women = cv2.imread('women.png',cv2.IMREAD_GRAYSCALE)

women_equalize = cv2.equalizeHist(women)
plt.hist(women_equalize.ravel(),bins=256)
plt.show()

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

在这里插入图片描述

在这里插入图片描述

2. 自适应直方图均衡化(局部直方图处理)

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

cv2.createCLAHE(clipLimit,tileGridSize)
参数:
      clipLimit:颜色对比度的阈值,默认值为8
      tileGridSize:局部直方图均衡化的模板(邻域)大小,可选项,默认值(8,8)
clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16)) # 通过类创建了一个局部均衡化对象
women_clahe = clahe.apply(women)# 将CLAHE算法应用于women图像上,并返回均衡化后的图像
res = np.hstack((women,women_equalize,women_clahe))
cv2.imshow('women_equalize',res)
cv2.waitKey(0)

在这里插入图片描述

总结

本篇介绍了OpenCV中的部分高阶操作:

  1. 上、下采样:本质上时调整图片的大小。
  2. 直方图:展示图像中像素强度(对于灰度图像)或颜色(对于彩色图像)的分布情况。
  3. mask掩膜:控制或限制某些操作或访问特定区域。
  4. 直方图均衡化:通过增加图像的对比度和亮度来改善图像的质量。
  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值