基于Python的Opencv的学习

基于Python的Opencv的学习第十五天

最近一直忙于玩模型,给学习opencv抛到了脑后,其实博主不仅是一名opencv学习者,也是一名模型爱好者,在近几天继续给大家分享opencv的学习小总结。

使用掩膜的直方图

在上一篇博客讲到calcHist()函数中一个参数为mask,当时所说将详细介绍一下,现在就来看看这个参数如何使用。

首先来了解一下掩膜是什么:
看如下图所示:
在这里插入图片描述
如图,掩膜为一幅图像,黑色为不透明,白色为透明(白色即我们所指定的区域),将掩膜图像对原始图像进行处理,则不透明部分被遮盖,透明部分则显示。

生成掩膜需要使用函数np.zeros()来生成一幅全黑的不透明的图像(暂且我们认为这是背景色),然后在用下标指定的方式来创建一下掩膜图像中的透明的部分(暂且认为这是前景色)具体代码如下示例:

mask=np.zeros(image.shape,np.uint8)
#这里zeros()函数里面包括了原始图像的大小和类型,这样能够让生成的图像保持一致
mask[200:400,200:400]=255
#这里指的是这个范围内的像素值设置为255(即白色)

上篇博客介绍了calcHist()函数:
在这里插入图片描述
具体链接:
calcHist()函数的介绍
在掩膜里面,我们只需要改动一下mask参数即可

import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread(r'C:\Users\Samut\Desktop\1.jpg')
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
hist=cv2.calcHist([image],[0],mask,[256],[0,255])
histimage=cv2.calcHist([image],[0],None,[256],[0,255])
plt.plot(histimage)
plt.plot(hist)

在这里插入图片描述
如图,橙色线为指定区域的直方图(即为掩码的直方图),蓝色线为整幅图片的直方图。
除了上述对掩膜图像的理解外,还有以下一种理解方式:
掩膜处理可以类似与“或”和“与”原理的理解:
在这里插入图片描述
掩膜原理就是“与”原理,原始图像的像素值与掩膜图像白色区域的像素值为一,黑色部分像素值为零,进行与运算。如图:
在这里插入图片描述
opencv中还有一个函数为cv2.bitwise_and()函数,具体格式如下,这个函数可以生成掩膜运算的结果
计算结果=cv2.bitwise_and(图像1,图像2)
在这里插入图片描述
这里就是与运算

mask=np.zeros(800,np.uint8)
mask[300:500,300:500]=255
masked_img=cv2.bitwise_and(img,mask)

这里masked_img为通过掩膜操作后的图像

直方图均衡化原理

讲解完直方图的掩膜之后,迎来了今天的重点:对直方图进行均衡化处理。首先来了解一下均衡化的原理:
在这里插入图片描述
如图所示,来自官网上面的对均衡化的介绍,左边为原始图像的直方图,右边为进行均衡化之后的直方图,可以看到左边的在0~大概50部分的像素值为零,200到255部分的像素值大概为零,进行均衡化之后可以看到0到50和200到255部分的像素值都有了,而且左边的峰值降下来了,右边的峰值比较往两边扩,从而达到均衡化的结果。
在这里插入图片描述
在这里插入图片描述
这里左边图片很亮,处理后可以得到右边的结果,如下图的两幅直方图对比,上面的代表亮的,像素值均靠右侧,下面的代表进行均衡化处理后的直方图,像素值比较均衡。

进行直方图均衡化的意义,如上图实例,有的直方图过亮或者过暗,导致一些细节不容易展示,进行均衡化处理后,图像更丰富,这是因为在累计直方图中,概率相近的原始值,会被处理为相同的值。

介绍完原理之后,来看Opencv为我们准备的均衡化函数为equalizeHist()函数,具体格式如下:
dst=cv2.equalizeHist(src)
src:原始图像
dst:目标图像,处理结果

import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread(r'C:\Users\Samut\Desktop\2.jpg')
#对直方图进行均衡化
equ=cv2.equalizeHist(img)
#绘制直方图使用plt.hist()函数,ravel()函数将二维图像处理成一维图像
plt.hist(img.ravel(),256)
#重新创建一个窗口,进行绘制第二幅图像
plt.figure()
plt.hist(equ.ravel(),256)

在这里插入图片描述

这就是对直方图均衡化的相关解释,这个方法可以用于一些照片太亮或者太暗,经过均衡化后得到图像的亮度比较均衡,这样一些细节就能更好展现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值