HOWTO · Python
在 Python 中使用 OpenCV 模块反转图像
了解如何使用 Python 中的 OpenCV 模块反转图像
本页内容
在 Python 中,可对 OpenCV 返回的数组应用 cv2.bitwise_not() 来反转图像。对于无符号 8 位图像通道,每个值 v 都会变为 255 - v。下文将说明通道处理方式,演示如何计算示例像素值,以及如何处理彩色或灰度图像文件并保存结果。
前置条件与加载图像
请在运行脚本的环境中安装 Python 和 OpenCV。安装包名为 opencv-python,而 Python 代码通过 cv2 导入它。如果尚未安装,请运行 pip install opencv-python。使用 NumPy 的替代方案也需要 NumPy;标准的 OpenCV Python 包会将 NumPy 作为依赖项安装。
将 input_path 设置为可读取的图像文件路径。OpenCV 默认按 BGR 通道顺序加载彩色图像。可以通过赋值 image = cv2.imread(input_path) 来加载图像;处理前请检查 image is not None,因为文件不存在或无法读取时,imread 会返回 None。下方示例使用 8 位通道值,这是常见图像文件的通常表示方式。
图像反转的工作原理
反转会将每个通道值映射为其补值。对于范围为 0 到 255 的无符号 8 位值,黑色会变成白色,白色会变成黑色,例如 40 会变成 215。此操作会分别应用于每个通道,因此彩色像素中的蓝、绿、红值都会被反转。OpenCV 默认的彩色数组采用 BGR 顺序,而非 RGB;反转会保留这一通道顺序,因此不会交换颜色。
使用 OpenCV 反转图像
OpenCV 的 cv2.bitwise_not() 会对数组中的每个元素执行按位取反。对于无符号 8 位图像数据,结果与用 255 减去每个值相同。下面这个小型标准库示例无需图像文件或图像处理包,即可直观展示像素计算。可以用它理解数值;处理 OpenCV 图像数组时,请先确认图像已成功加载,再调用 cv2.bitwise_not(image)。
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
pixel = [10, 40, 200]
inverted_pixel = [255 - value for value in pixel]
print("original:", pixel)
print("inverted:", inverted_pixel)
original: [10, 40, 200]
inverted: [245, 215, 55]
要处理图像文件,请将 input_path 和 output_path 分别设置为图像路径和目标路径,然后运行此示例。请先安装 OpenCV。下面的路径是明确的占位值,请替换为本机上的文件路径;如果图像缺失,程序会报告加载或写入问题,而不会继续处理。
try:
import cv2
except ImportError:
print("Install opencv-python to run this example.")
else:
input_path = "input.png"
output_path = "inverted.png"
image = cv2.imread(input_path)
if image is None:
print(f"Could not read {input_path}")
else:
inverted = cv2.bitwise_not(image)
written = cv2.imwrite(output_path, inverted)
if not written:
print(f"Could not write {output_path}")
show_preview = False
if show_preview:
cv2.imshow("Original", image)
cv2.imshow("Inverted", inverted)
cv2.waitKey(0)
cv2.destroyAllWindows()
加载后的彩色数组及其反转结果分别保存在 image 和 inverted 中。OpenCV 默认以 BGR 顺序返回彩色通道;此操作会反转每个通道,但不会重新排列通道。上方的示例像素计算展示了相同的无符号 8 位结果。
反转灰度图像
灰度图像的每个像素只有一个亮度值,而不是三个颜色通道。使用 cv2.IMREAD_GRAYSCALE 直接加载灰度图像,检查 gray_image is not None,然后应用相同的按位操作。结果仍是二维单通道数组,可以用 cv2.imwrite() 保存。
本节中的代码以及显示的标签或输出仍为英文。
try:
import cv2
except ImportError:
print("Install opencv-python to run this example.")
else:
input_path = "input.png"
gray_output_path = "inverted-gray.png"
gray_image = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE)
if gray_image is None:
print(f"Could not read {input_path} as grayscale")
else:
inverted_gray = cv2.bitwise_not(gray_image)
written = cv2.imwrite(gray_output_path, inverted_gray)
if not written:
print(f"Could not write {gray_output_path}")
使用 NumPy 反转图像
如果图像数据已经是 NumPy 数组,可以使用 NumPy 提供的 numpy.invert 作为替代方案。它会对每个元素执行按位取反;对于无符号 8 位值,结果与 OpenCV 的通道补值相同。此示例读取一张 8 位彩色图像,使用 NumPy 进行反转,并检查保存结果。这里的 255 - v 解释仅适用于无符号 8 位数据;不要将其推广到有符号或更宽的整数数组,在这些数组中 NumPy 仍执行按位取反。
本节中的代码以及显示的标签或输出仍为英文。
try:
import cv2
import numpy as np
except ImportError:
print("Install opencv-python and numpy to run this example.")
else:
input_path = "input.png"
numpy_output_path = "inverted-numpy.png"
image = cv2.imread(input_path)
if image is None:
print(f"Could not read {input_path}")
else:
inverted_numpy = np.invert(image)
written = cv2.imwrite(numpy_output_path, inverted_numpy)
if not written:
print(f"Could not write {numpy_output_path}")
对于常见的 8 位图像文件,cv2.bitwise_not(image) 和 numpy.invert(image) 会得到相同的逐通道结果。如果工作流程的其他部分已经使用 OpenCV,优先使用 OpenCV 操作;如果需要 NumPy 的数组操作,则使用 NumPy 函数。
保存并显示反转后的图像
请写入与所处理图像对应的数组:彩色结果使用 cv2.imwrite(output_path, inverted),灰度结果使用 cv2.imwrite(gray_output_path, inverted_gray)。检查函数返回的布尔值;False 表示 OpenCV 无法写入文件,例如目标路径不可用或格式不受支持。示例会通过 written 检查结果,并在写入失败时报告问题。
OpenCV 示例包含一个可选的预览代码块。在该处将 show_preview 设为 True,即可打开两个窗口。图形界面显示需要图形环境,在无头会话中可能无法使用。使用 cv2.imwrite() 保存图像无需打开窗口。OpenCV 和 NumPy 的图像文件示例要求环境中安装相应软件包,并且 input.png 可读取;本文提供的执行证据仅涵盖上方的小型像素计算。