本文主要是介绍基于OpenCv的图像合成和直方图均衡化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像合成和直方图均衡化
- 基于OpenCv的图像合成和直方图均衡化
- 任务需求
- 任务目标
- 1、掌握图像的简单合成
- 2、掌握图像直方图均衡化的方法
- 任务环境
- 1、jupyter开发环境
- 2、OpenCv
- 3、python3.6
- 任务实施过程
- 一、图像合成
- 二、图像直方图均衡化
- 1.导入图像绘制直方图
- 2.直方图均衡化
- 3.限制对比度的自适应直方图均衡化(CLAHE)
- (1)灰度图像直方图均衡化
- (2)彩色图像直方图均衡化
- 三、任务小结
- 说明
基于OpenCv的图像合成和直方图均衡化
任务需求
- 本实验主要完成基于OpenCv的图像合成和直方图均衡化
- 图像合成就是通过一种特定算法将两幅或多幅图像合成为一幅新图像。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。直方图均衡化可以通过有效地扩展常用的亮度来增强局部的对比度而不影响整体的对比度。
任务目标
1、掌握图像的简单合成
2、掌握图像直方图均衡化的方法
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、图像合成
图像合成表达式如下:
y = α ∗ x 1 + ( 1 − α ) ∗ x 2 y=α∗x_1+(1−α)∗x_2 y=α∗x1+(1−α)∗x2
- x 1 x_1 x1表示前景图像, α α α表示前景图像的加权系数,即前景图像的融合比例;
- x 2 x_2 x2表示背景图像, ( 1 − α ) (1-α) (1−α)表示背景图像的加权系数,即背景图像的融合比例。
Opencv中图像合成的函数是 cv2.addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1)
- src1:表示进行加权操作的第一个图像对象,即输入图片1;
- double alpha:表示第一个图像的加权系数,即图片1的融合比例;
- src2:表示进行加权操作的第二个图像对象,即输入图片2;
- double beta,表示第二个图像的加权系数,即图片2的融合比例。很多情况下,有关系 alpha + beta = 1.0;
- double gamma,表示一个作用到加权和后的图像上的标量,可以理解为加权和后的图像的偏移量;
- dst,表示两个图像加权和后的图像,尺寸和图像类型与src1和src2相同,即输出图像;
- int dtype:输出图像的位宽设置,默认为-1,此时输出图像位宽等于src1的位宽
注意:函数addWeighted()要求输入的两个图像尺寸必须相同
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,并查看两个图像的矩阵形状
cat = cv2.imread(r'./experiment/data/cat.jpg')
sky = cv2.imread(r'./experiment/data/sky.jpg')
print('前景图像矩阵形状',cat.shape)
print('背景图像矩阵形状',sky.shape)
为了使两图像尺寸相同,使用图像缩放函数cv2.resize(InputArray src, OutputArray dst, Size,…)
- InputArray src:输入图片
- OutputArray dst:输出图片
- Size:输出图片尺寸,输出尺寸格式为(宽w,高h)
# 将背景图像尺寸调整至与前景图像尺寸相同
# 注意resize()函数中参数size设置图像尺寸格式为(宽w,高h)
img_sky= cv2.resize(sky, (1963, 3226))
print('背景图像矩阵形状',img_sky.shape)
# 设置画布大小,指定画布的宽和高,单位为英寸
plt.figure(figsize=(6,6))
# np.hstack()函数对图像进行水平拼接,显示图像
im_show('图像原图',np.hstack((cat, img_sky)))
# 将两个图像合成
# 设置合成后的图像为res,放入前景图像cat,设置前景图像的权重为0.4
# 放入转换尺寸后的背景图像img_sky,设置前景图像的权重为1-0.4=0.6
# 设置合成后图像的偏移量为0
res = cv2.addWeighted(cat, 0.4, img_sky, 0.6, 0)
plt.figure(figsize=(9,6))
# 显示两个原始图像和合成图像
im_show('图像合成',np.hstack((cat, img_sky,res)))
二、图像直方图均衡化
1.导入图像绘制直方图
# 读取图像,这里读取的是彩色图像
img = cv2.imread(r'./experiment/data/moonlight.jpg')
# 使用图像转换函数将彩色图像转换成灰度图
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 设置画布大小
plt.figure(figsize=(12,3))
# 将画布分成1行2列2个子图,绘制第一个子图
plt.subplot(121)
# 显示图像灰度图
im_show('图像灰度图',img1)
# 绘制第二个子图
plt.subplot(122)
# 绘制灰度图像直方图,设置箱子数为256,显示范围为[0, 256]
# numpy的ravel函数功能是将多维数组降为一维数组,这里也可以使用flatten()函数
plt.hist(img.ravel(), 256, [0, 256])
plt.title("灰度图像直方图")
# 不显示x轴和y轴
plt.xticks([])
plt.yticks([])
plt.show()
2.直方图均衡化
图像的直方图是对图像对比度效果上的一种处理,旨在使得图像整体效果均匀,黑与白之间的各个像素级之间的点更均匀一点。
直方图均衡化函数:cv2.equalizeHist(scr)
- scr:输入的图片
# 将灰度图img1直方图均衡化,设均衡化后的图像为equ
equ = cv2.equalizeHist(img1)
# 设置画布大小
plt.figure(figsize=(12,6))
# 将画布分成2行2列4个子图,绘制第一个子图为原始图像灰度图
plt.subplot(221)
im_show('图像灰度图',img1)
# 绘制第二个子图,为原始图像直方图
plt.subplot(222)
plt.hist(img1.ravel(), 256, [0, 256])
plt.title("原始图像直方图")
# 不显示x轴和y轴
plt.xticks([])
plt.yticks([])
# 绘制第三个子图,为直方图均衡化后图像
plt.subplot(223)
im_show('直方图均衡化后图像',equ)
# 绘制第四个子图,为均衡化后图像直方图
plt.subplot(224)
plt.hist(equ.ravel(), 256, [0, 256])
plt.title("均衡化后图像直方图")
# 不显示x轴和y轴
plt.xticks([])
plt.yticks([])
plt.show()
3.限制对比度的自适应直方图均衡化(CLAHE)
(1)灰度图像直方图均衡化
全局直方图均衡化考虑了图像的整体对比度。但并不是所有图像都适用于全局直方图均衡化。例如,下图显示了输入图像及其在全局直方图均衡后的结果。直方图均衡后,背景对比度确实得到了改善。但是比较两个图像中雕像的脸,由于亮度过高,所以丢失了大多数信息。
为了解决这个问题,我们可以使用自适应直方图均衡,自适应直方图均衡化有过度放大图像中相同区域的噪音的问题,限制对比度直方图均衡(CLAHE)算法能有限的限制这种不利的放大。
CLAHE之所以能够限制对比度,是因为它在计算邻域的CDF之前在指定阈值处对直方图进行了修剪,如下图所示,并没有将修剪掉的那部分直方图直接扔掉,而是将这些被修剪掉的部分重新均匀的分布到直方图中,从而生成新的直方图。
其中对直方图进行切割所使用的阈值,被称作修剪限制度(clip limit)。
用于生成自适应均衡化图像 cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))
- clipLimit:颜色对比度的阈值,表示直方图大于阈值的部分将被剪裁掉平均分配给整个图像;
- titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
# 实例化自适应直方图均衡化函数,设置颜色对比度的阈值为2,网格大小为8*8
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
# 进行自适应直方图均衡化
cl = clahe.apply(img1)
plt.figure(figsize=(18,6))
# 显示原图、普通直方图均衡化、CLAHE的图像
im_show('图像直方图均衡化',np.hstack((img1, equ,cl)))
(2)彩色图像直方图均衡化
对于彩色图像使用CLAHE做直方图均衡化,关键在于图像色彩空间的转换,我们可以先将BGR图像转换为HSV格式。在HSV格式中,V表示明度,对明度做均衡,即对对比度均衡。
# 读取彩色图像
img2 = cv2.imread(r'./experiment/data/river.jpg')
# 将图像的色彩空间从RGB转换到HSV
img_hsv1 = cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)
img_hsv2 = cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)# 创建CLAHE均衡
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
# 色彩空间HSV中第三维度V表示明度,对明度做均衡,提取img_hsv1中的第三维度数据
# 先对明度做普通直方图均衡化
img_hsv1[:,:,2] = cv2.equalizeHist(img_hsv1[:,:,2])
# 将其色彩空间从HSV转换回RGB
hsv2col1 = cv2.cvtColor(img_hsv1,cv2.COLOR_HSV2BGR)# 然后对明度做CLAHE直方图均衡化
img_hsv2[:,:,2] = clahe.apply(img_hsv2[:,:,2])
# 将其色彩空间从HSV转换回RGB
hsv2col2 = cv2.cvtColor(img_hsv2,cv2.COLOR_HSV2BGR)plt.figure(figsize=(18,6)) # 设置画布大小
# 将三个图像水平拼接
cmb = np.hstack((img2,hsv2col1,hsv2col2))
im_show('彩色图原图、普通直方图均衡化、CLAHE直方图均衡化',cmb)
三、任务小结
本实验主要完成基于OpenCv的图像合成和直方图均衡化
通过本次实验需要掌握以下内容:
- 1.掌握使用函数addWeighted()函数加权图像融合
- 2.掌握灰度图像直方图均衡化方法(HE和CLAHE)
- 3.掌握彩色图像限制对比度的自适应直方图均衡化
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我
这篇关于基于OpenCv的图像合成和直方图均衡化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!