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)