Python OpenCV 图像算术运算与颜色空间转换详解

纸上星河
纸上星河
发布时间:2026-10-16 | 5人浏览过
原创

本文详解 Python OpenCV 中的图像算术运算,对比 Numpy 取模加法与 OpenCV 饱和加法的差异,并讲解 addWeighted 函数实现图像融合。同时介绍 cvtColor 函数在 BGR、灰度及 HSV 颜色空间转换中的应用,附带完整代码示例。

1.图像加法

在 OpenCV 中,图像加法主要通过两种途径实现:一是直接利用 Numpy 库对两个图像数组进行相加操作,二是调用 OpenCV 提供的 add() 函数。

无论采用上述哪种方法,参与运算的两个图像必须保持相同的深度和类型,这意味着它们的尺寸及数据类型必须完全一致。

1.1Numpy加法

使用 Numpy 进行加法运算时,公式为 img = img1 + img2,随后对计算结果取模处理。

  • 若计算后的像素值小于或等于 255,则最终结果直接等于 img1 与 img2 的和。
  • 若计算后的像素值大于 255,则结果需对 255 进行取模运算。

1.2OpenCV加法

OpenCV 通过调用 add() 函数执行加法,其核心机制为饱和运算。

  • 当计算后的像素值小于或等于 255 时,结果直接等于 img1 与 img2 的和。
  • 当计算后的像素值大于 255 时,执行饱和运算,结果固定为 255。

两种加法方式的具体示例代码如下:

import cv2 as cv
# 读取图像
img = cv.imread("data.jpg", cv.IMREAD_UNCHANGED)
test = img
# Numpy 加法
result1 = img + test
# OpenCV 加法
result2 = cv.add(img, test)
# 显示图像
cv.imshow("img", img)
cv.imshow("result1", result1)
cv.imshow("result2", result2)

# 等待显示
cv.waitKey()
cv.destroyAllWindows()

从结果可见,采用 Numpy 取模加法的图像整体色调偏蓝,而使用 OpenCV 饱和运算的图像整体色调更偏向白色。

2.图像融合

图像融合本质上属于图像加法的一种特殊形式,其区别在于为图像赋予不同的权重,从而产生融合或半透明的视觉效果。

  • 普通图像加法公式:img = img1 + img2
  • 图像融合公式:img = img1 * alpha + img2 * beta + gamma

实现图像融合需使用 addWeighted() 函数,具体用法如下:

dst = cv.addWeighter(img1, alpha, img2, beta, gamma)
dst = img1 * alpha + img2 * beta + gamma

其中 alpha 和 beta 为权重系数,gamma 为亮度调节量,该参数不可省略。

以下示例展示了一张地铁图片与人物图片的融合案例:

img1 = cv.imread(file, cv.IMREAD_UNCHANGED)
img1=cv.resize(img1,(1000,1000))
img2 = cv.imread(file1, cv.IMREAD_UNCHANGED)
img2=cv.resize(img2,(1000,1000))
# 图像融合
img = cv.addWeighted(img1, 0.4, img2, 0.6, 10)
# 显示图像
cv.imshow("img1", img1)
cv.imshow("img2", img2)
cv.imshow("img", img)

# 等待显示
cv.waitKey()
cv.destroyAllWindows()

注意:若两张图像像素尺寸不同,需先通过 cv.resize(img,(width,hegiht)) 将其调整为相同像素尺寸。

3.改变颜色空间

OpenCV 支持超过 150 种颜色空间转换方法,此处重点介绍两种最常用的转换:BGR 与灰度之间的转换,以及 BGR 与 HSV 之间的转换。

执行颜色空间转换使用 cvtColor(input_image, flag) 函数,其中 flag 参数指定转换类型。

常见的 flag 值包括:

# BGR 转 灰度
cv.COLOR_BGR2GRAY
# BGR 转 HSV
cv.COLOR_BGR2HSV
# BGR 转 RGB
cv.COLOR_BGR2RGB
# 灰度 转 BGR
cv.COLOR_GRAY2BGR

以下示例演示如何使用 cvtColor() 函数将图像转换为灰度图像:

import cv2 as cv
# 读取图像
img = cv.imread("data.jpg", cv.IMREAD_UNCHANGED)
# 图像类型转换
result = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

# 图像展示
cv.imshow("img", img)
cv.imshow("result", result)

# 等待显示
cv.waitKey()
cv.destroyAllWindows()

本文介绍了 Python OpenCV 图像处理中的算术运算及颜色空间修改,更多相关技术内容可参考本站往期文章或继续浏览后续内容,感谢支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表