首页 > 其他分享 >周也带你进阶OpenCV (1)--采样、直方图即均衡化、掩膜

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

时间:2024-09-17 22:22:51浏览次数:13  
标签:掩膜 均衡化 cv2 face down phone 直方图 图像

文章目录

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数目。在这个例子中,直方图被分成了16个bin,这意味着像素值的范围(在这个例子中是0到				256)被分成了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=1;1&0=0;0&1=0;0&0=0
cv2.bitwise_and(src1,src2,dst=None,mask=None)

参数:

-- src1,src2:为输入图像或标量,标src1和src2相与
-- dst:可选输入变量,如果需要使用非None则要先定义,且其大小与输入变量相同
-- mask:图像掩膜,可选参数,用于指定要更改的输出图像数组的元素。
          mask为0的值,src1和src2相与的值都为0
          非0的值,为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. 直方图均衡化:通过增加图像的对比度和亮度来改善图像的质量。

标签:掩膜,均衡化,cv2,face,down,phone,直方图,图像
From: https://blog.csdn.net/m0_74896766/article/details/142166814

相关文章

  • FPGA与Matlab图像处理之直方图均衡化
    文章目录一、什么是直方图?二、什么是直方图均衡化?三、Matlab实现直方图均衡化的步骤第一步:彩色图像转成灰度图像第二步:提取亮度通道的直方图第三步:累计亮度通道的像素值频率第四步:映射到新的灰度值四、Verilog实现直方图均衡化第一步:Verilog实现彩色图像转灰度图像4.......
  • MySQL8.0直方图详解
    1、什么是直方图MySQL8.0开始支持索引之外的数据分布统计信息可选项。它就是直方图(Histogram)。直方图通过估算查询谓词的选择率,以便选择合适的执行计划,也让SQL优化有了更多手段。在DB中,优化器负责将SQL转换为很多个不同的执行计划,然后从中选择一个最优的来实际执行。但是有时候优......
  • opencv学习:calcHist 函数绘制图像直方图及代码实现
    cv2.calcHist函数是OpenCV库中用于计算图像直方图的函数。直方图是一种统计图像中像素值分布的工具,它可以提供图像的亮度、颜色等信息。这个函数可以用于灰度图像和彩色图像。函数语法hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate=False)......
  • python画图|3D直方图基础教程
    前述已经完成了直方图和3D图的基本学习,链接如下:直方图:python画图|水平直方图绘制-CSDN博客3D图:python画图|水平直方图绘制-CSDN博客现在我们尝试把二者结合,画3D直方图。【1】官网教程首先,依然是来到官网,链接如下;Demoof3Dbarcharts—Matplotlib3.9.2documentatio......
  • MIAS-LCEC: 基于跨模态掩膜匹配的激光雷达-相机在线标定算法
    MIAS-LCEC:基于跨模态掩膜匹配的激光雷达-相机在线标定新算法,性能超越SoTA同济大学MIASGroup近期发表的论文《Online,Target-FreeLiDAR-CameraExtrinsicCalibrationviaCross-ModalMaskMatching》提出了一个基于跨模态掩膜匹配的激光雷达-相机在线标定算法,性能上......
  • 使用 MySQL 创建直方图:数据分析与可视化技巧,mysql创建视图表
    在数据分析和可视化过程中,直方图是一种常见的工具,用来显示数据的分布情况。使用MySQL创建直方图,可以帮助我们快速理解数据的整体趋势和分布特征。本文将介绍如何使用MySQL来创建直方图,并结合数据分析与可视化的技巧,让数据分析更加直观易懂。什么是直方图?直方图是一种用于展......
  • 240724 均衡化直方图
    亮度变大了原图结果 #-*-coding:utf-8-*-importsysimportcv2importnumpyasnp#加载图像input_file='sunrise.jpg'#sys.argv[1]img=cv2.imread(input_file)#转灰度图img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('Inputgrayscaleimag......
  • 图像直方图比较
    对于直方图的比较,我们可以使用OpenCV提供的函数compareHist()进行比较,从而得到一个数值,表示两个直方图的匹配程度(相似性)。原理对于两个直方图(H1......
  • 【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换
    凸包特征检测凸包就是图像的最小外接多边形,通过图像的轮廓点,找到距离最远的两个点的直线,根据直线找到距离最远的下一个点,直到所有的点被包围在多边形内读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点convexHull获得图像的凸包点cv2.convexHull(points,hu......
  • OpenCV 图像直方图
    一:直方图的直接使用frommatplotlibimportpyplotaspltdefplot_demo(image):print(image.ravel())plt.hist(image.ravel(),256,[0,256])#ravel将图像3维转一维数组,便于统计频率#统计为256个bin,显示0-256bin,意思是全部显示,我们可以设置只显示一部分plt.show()......