基于OpenCv的图像合成和直方图均衡化

2024-05-04 17:28

本文主要是介绍基于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的图像合成和直方图均衡化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959723

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编