import cv2 as cv

import numpy as np

# 方式1:使用原始字符串(推荐)

img_path = r'D:\caoxiang\lep.jfif'

gray_img_path = r'D:\caoxiang\lep.jfif'

# 读取彩色图片,并增加异常判断

BGR = cv.imread(img_path)

if BGR is None:

    print(f"错误:无法读取图片 {img_path},请检查路径是否正确!")

    exit()  # 路径错误时终止程序,避免后续报错

# 拆分BGR通道(OpenCV读取的彩色图默认是BGR顺序,不是RGB)

b, g, r = cv.split(BGR)

# 加权法灰度化(符合人眼视觉特性)

Y = (0.299 * r + 0.587 * g + 0.114 * b).astype(np.uint8)

# 均值法灰度化(简单平均)

I = (r // 3 + g // 3 + b // 3).astype(np.uint8)  # 加astype确保类型为uint8,避免警告

# 读取灰度图片,并增加异常判断

gray = cv.imread(gray_img_path, cv.IMREAD_GRAYSCALE)

if gray is None:

    print(f"警告:无法读取灰度图片 {gray_img_path},跳过该图片的保存和显示")

    gray = np.zeros_like(Y)  # 创建空图占位,避免后续报错

# 🔥 重点修复:原始字符串末尾不能加反斜杠!以下3种正确写法任选其一

# 写法1:原始字符串去掉末尾反斜杠,拼接时补加

save_path_prefix = r'D:\caoxiang'  # 去掉末尾的\

cv.imwrite(f"{save_path_prefix}\\fig2-26-b.jpg", Y)  # 拼接时加\\

cv.imwrite(f"{save_path_prefix}\\fig2-26-c.jpg", I)

cv.imwrite(f"{save_path_prefix}\\fig2-26-d.jpg", b)

cv.imwrite(f"{save_path_prefix}\\fig2-26-e.jpg", g)

cv.imwrite(f"{save_path_prefix}\\fig2-26-f.jpg", r)

cv.imwrite(f"{save_path_prefix}\\fig2-26-g.jpg", gray)

# 写法2:用正斜杠(跨平台兼容,推荐)

# save_path_prefix = 'D:/caoxiang/'

# cv.imwrite(save_path_prefix + "fig2-26-b.jpg", Y)

# cv.imwrite(save_path_prefix + "fig2-26-c.jpg", I)

# cv.imwrite(save_path_prefix + "fig2-26-d.jpg", b)

# cv.imwrite(save_path_prefix + "fig2-26-e.jpg", g)

# cv.imwrite(save_path_prefix + "fig2-26-f.jpg", r)

# cv.imwrite(save_path_prefix + "fig2-26-g.jpg", gray)

# 写法3:双反斜杠(不推荐,易出错)

# save_path_prefix = 'D:\\caoxiang\\'

# cv.imwrite(save_path_prefix + "fig2-26-b.jpg", Y)

# cv.imwrite(save_path_prefix + "fig2-26-c.jpg", I)

# cv.imwrite(save_path_prefix + "fig2-26-d.jpg", b)

# cv.imwrite(save_path_prefix + "fig2-26-e.jpg", g)

# cv.imwrite(save_path_prefix + "fig2-26-f.jpg", r)

# cv.imwrite(save_path_prefix + "fig2-26-g.jpg", gray)

# 显示图片窗口

cv.imshow("Original color image", BGR)

cv.imshow("Y (Weighted gray)", Y)

cv.imshow("I (Average gray)", I)

cv.imshow("B channel", b)

cv.imshow("G channel", g)

cv.imshow("R channel", r)

cv.imshow("Gray (Built-in)", gray)

# 等待按键(0表示无限等待,按任意键关闭窗口)

cv.waitKey(0)

# 释放所有窗口资源(避免内存泄漏)

cv.destroyAllWindows()
声明:本站所有文章均为永久链接,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系邮箱:jyxs_top@163.com进行处理。