Python中如何将图像保存为二进制格式?代码报错求助
问题分析与解决:OpenCV imwrite报错"img is not a numerical tuple"
错误原因
cv2.threshold()函数返回两个值:
- 实际使用的阈值(与你传入的127一致,除非使用自适应阈值等特殊模式)
- 二值化处理后的图像矩阵
你当前的代码只接收了一个返回值,导致binary_img是一个包含阈值和图像的元组,而cv2.imwrite()需要传入单一的图像矩阵,因此触发参数错误。
修正方案
1. 正确接收threshold的返回值
用_, binary_img来接收返回值,其中_表示忽略不需要的阈值变量。
2. 优化路径处理(避免转义与跨平台问题)
用os.path.join替代手动拼接路径,同时用os.path.splitext可靠处理文件名后缀。
3. 增加图像读取校验
防止因文件不存在、路径错误导致img为空,引发后续操作崩溃。
修正后的完整代码
import os import cv2 def binarize_image(filename): # 安全拼接文件路径 filepath = os.path.join(MEDIA_ROOT, filename) img = cv2.imread(filepath) # 校验图像是否读取成功 if img is None: raise ValueError(f"无法读取图像文件: {filepath}") greyscale_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 正确接收二值化结果 _, binary_img = cv2.threshold(greyscale_img, 127, 255, cv2.THRESH_BINARY) # 生成目标文件名 name, _ = os.path.splitext(filename) resized_name = f"binary_{name}.png" save_path = os.path.join(MEDIA_ROOT, resized_name) cv2.imwrite(save_path, binary_img) return resized_name
额外说明
- 把阈值最大值从64改为255:灰度图像像素范围是0-255,二值化后用255表示白色是常规做法,若保留64,白色区域会呈现深灰色,可能不符合需求。
- 路径拼接使用
os.path.join:自动适配不同操作系统的路径分隔符,避免手动拼接时的转义符错误。
内容的提问来源于stack exchange,提问作者Алексей Василенко
相关产品推荐
相关产品推荐

