基于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

相关文章

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采