You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将图像保存为二进制格式?代码报错求助

问题分析与解决:OpenCV imwrite报错"img is not a numerical tuple"

错误原因

cv2.threshold()函数返回两个值:

  1. 实际使用的阈值(与你传入的127一致,除非使用自适应阈值等特殊模式)
  2. 二值化处理后的图像矩阵

你当前的代码只接收了一个返回值,导致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,提问作者Алексей Василенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:07:19