OpenCV实现图像的加法 以及报错:E:\All_in\opencv\7,图像的加法.py:40: UserWarning: Glyph 30456 (\N{CJK UNIFIED IDEOGRAP

OpenCV是一个广泛应用于计算机视觉和图像处理领域的开源库,它提供了许多功能强大的图像处理算法和工具。在OpenCV中,图像加法是一种常见的操作,用于将两个图像逐像素相加,生成一个新的图像。本文将介绍OpenCV实现图像加法的原理、注意事项以及其应用方面。

图像加法的原理很简单:对于给定的两个输入图像,假设为image1和image2,它们对应的像素为p1和p2。那么加法操作将每个像素的对应值相加,并将结果作为输出图像的像素值。即,输出图像中每个像素的值p等于p1和p2之和。

实现图像加法时,需要注意以下几个方面:

图像大小:在进行图像加法之前,需要确保两个输入图像的大小相同。如果两个图像的尺寸不同,可以使用resize函数将它们调整为相同的大小。这样可以避免维度不匹配导致的错误。

数据类型:在进行图像加法时,需要确保输入图像和输出图像具有相同的数据类型。通常情况下,图像存储为8位无符号整数(uint8)类型,像素值范围为0到255。因此,加法操作的结果可能会导致像素值超过该范围。为了避免溢出错误,可以将输出图像的数据类型设置为更高精度的类型,例如16位无符号整数(uint16)或浮点数(float)。

饱和度处理:当进行图像加法时,如果像素值超过了像素值范围(0-255),默认情况下OpenCV将使用饱和度处理来处理超出范围的像素值。即,任何大于255的像素值都会被截断为255,任何小于0的像素值都会被截断为0。这样可以确保图像的像素值始终在合理的范围内。

归一化处理:在某些情况下,为了得到更好的结果,可能需要对输入图像进行归一化处理。例如,当两个输入图像的像素值范围不同或者像素值分布不均匀时,通过对图像进行归一化处理,可以将它们调整到相似的范围内,从而更好地进行图像加法操作。

像素值溢出:尽管OpenCV在加法操作中使用了饱和度处理,但在某些情况下,仍然可能出现像素值溢出的问题。为了避免这种情况,可以对结果图像进行像素值裁剪,将超出范围的像素值设置为最大或最小值。

图像加法在图像处理中具有广泛的应用。它可以用于合成不同曝光或亮度条件下的图像,调整图像的对比度或亮度,以及实现图像融合、背景减除等操作。通过合理地选择图像加法操作的参数和处理步骤,并注意上述注意事项,可以获得满足需求的图像加法结果。

总之,图像加法是OpenCV中常用的图像处理操作之一。通过对两个输入图像进行逐像素相加,可以生成一个新的图像。在实现图像加法时,需要注意图像大小、数据类型,以及饱和度处理、归一化处理和像素值溢出等问题。这些注意事项的合理应用可以帮助我们获得更好的图像加法结果,并在图像处理领域中发挥更大的作用。

算数操作

学习目标

了解图像的加法

图像的加法

你可以使用OpenCV的 cv.add() 函数把两幅图像相加,

或者可以简单地通过 numpy 操作添加两个图像,

如 res= img1 + img2。
两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。

注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。

原理

在这里插入图片描述

代码实现

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']


# 读取图像
img1 = cv.imread('lena.png')
img2 = cv.imread('lena_saved.png')

# 加法操作
img3 = cv.add(img1, img2)  # 使用 OpenCV 的加法
img4 = img1 + img2 # 使用 NumPy 的加法(直接相加)

# 图像显示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(5, 4), dpi=100)
'''
参数说明:

nrows=1:指定了子图区域的行数为 1,表示在图像区域中只有一行。
ncols=2:指定了子图区域的列数为 2,表示在图像区域中有两列。
figsize=(10, 8):指定图像区域的大小为宽度 10 英寸,高度 8 英寸。这里的单位是英寸。
dpi=100:指定图像区域的分辨率为 100,即每英寸的像素数。
该函数返回两个值:

fig:表示整个图像区域,可以通过这个对象对图像进行整体的设置。
axes:表示一个由实际子图对象组成的 NumPy 数组。可以通过 axes 对象对每个子图进行单独的设置和操作。
这个函数的作用是创建一个包含 1 行、2 列的子图区域,用于显示两个子图。通过 fig 和 axes 可以进一步对整个图像区域和子图进行设置和操作。'''




axes[0].imshow(img3[:, :, ::-1])  # 将 BGR 转换为 RGB 进行显示
axes[0].set_title("cv中的加法")

axes[1].imshow(img4[:, :, ::-1])  # 将 BGR 转换为 RGB 进行显示
axes[1].set_title("直接相加")

plt.show()
cv.imwrite(r'E:\All_in\opencv\img3.png',img3)

遇到的报错

在这里插入图片描述

解决办法

加入这段代码

from pylab import mpl
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]

运行结果展示

在这里插入图片描述

总结

使用cv.add() 要比np.add() 【直接相加】 方法 效果要好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值