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进行处理。



评论(0)