opencv 库中 imread 用来读取图片文件,但是这个不支持中文路径。
中文路径的话,需要用 imdecode 方法。

1、读取带中文的图片

imdecode和imread读取图片,都是以bgr的方式来读取。opencv进行图像处理,也是bgr。

网上看到有人说imdecode读取图片是rgb,使用opencv进行图像处理的时候需要做一下转换(rgb转成bgr);
但是我自己测了一下,其实是bgr方式。

# 读取带中文的图片,bgr
def cv_imread(file_path):
    cv_img = cv.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
    return cv_img

从网上找的下面这种方法,有问题:
# 报错: 'utf-8' codec can't decode byte 0xb2 in position 24: invalid start byte
def cv_imread2(file_path=""):
    file_path_gbk = file_path.encode('gbk')  # unicode转gbk,字符串变为字节数组
    img_mat = cv.imread(file_path_gbk.decode())  # 字节数组直接转字符串,不解码
    return img_mat

2、验证 imdecode 以 bgr 存储

众所周知,cv2.imread 是以 bgr 方式存储,故此处用cv2.imread做对比,看最终的BGR的灰度值就知道。

# cv.imdecode 和 cv.imread,读图都是bgr方式。以下可证明两者方式一样。
img = cv_imread("./彩色图像.tiff")
B, G, R = cv.split(img)
img2 = cv.imread("./color.tiff")
B2, G2, R2 = cv.split(img2)  # 拆分通道,opencv存储图片是bgr方式

3、保存带中文的图片

# 保存带中文的图片
def cv_imwrite(file_path):
    cv.imencode('.tiff', img)[1].tofile(out_path)  # 保存带中文的图片,opencv保存的tiff,默认是lzw压缩

4、调用

if __name__ == "__main__":
    img = cv_imread("./彩色图像.tiff")
    # cv.namedWindow('ReadImgCN', cv.WINDOW_AUTOSIZE)  # 图片太大,不采用自适应
    cv.namedWindow('ReadImgCN', cv.WINDOW_NORMAL)
    cv.resizeWindow('ReadImgCN', 1000, 1000)
    cv.imshow("ReadImgCN", img)
    cv.waitKey(0)
    cv.destroyAllWindows()

    out_path = './测试.tiff'
    cv_imwrite(out_path)

附录

官方imread和imdecode的帮助文档

GitHub 加速计划 / opencv31 / opencv
231
21
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
927beeac doc: add supported src type info for each ColorConversionCodes 13 小时前
55eb43fa chore: Synchronize 3rdparty libpng version to 1.6.52 in README/CHANGES 19 小时前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐