211123-python保存图像cv2.imwrite和plt.savefig

这篇博客介绍了如何使用OpenCV(cv2)和matplotlib(plt)库来处理和保存图像。通过np.clip函数将图像数据归一化,并利用cv2.imwrite保存为512*512的PNG图像。同时,展示了如何使用plt.imshow和plt.savefig以不同的尺寸和设置保存图像,包括调整颜色映射和去除边框。这为图像处理提供了灵活的选择。

展示是需要保存成png格式,做此记录。
cv2.imwrite可以输出512*512图像,但需要自己提前处理成0只255。

img_CT = np.clip((img_CT - 500) / (2500-500), 0, 1)  * 255
cv2.imwrite('CT',img_CT)

plt.savefig可以输出与plt.show()一样,下面的输出为1087*1087。自己根据需要进行选用

fig,ax=plt.subplots(figsize=(6.4,4.8), dpi=300)
plt.imshow(img_CT,  vmin=500, vmax=2500, cmap='gray')
plt.axis('off')
plt.savefig('CT.png', bbox_inches='tight', pad_inches=0.0)
import cv2 import numpy as np import matplotlib.pyplot as plt # ---------------------- 核心配置(可修改)---------------------- input_path = "D:\\QQ.jpg" # 你的输入图片路径 save_path = "D:\\Image_Results\\" # 结果保存路径(自动创建文件夹) # -------------------------------------------------------------- # 创建保存文件夹(不存在则自动生成) import os os.makedirs(save_path, exist_ok=True) # 读取图像(灰度模式) img = cv2.imread(input_path, cv2.IMREAD_GRAYSCALE) if img is None: raise ValueError(f"无法读取图片,请检查路径:{input_path}") # 图像处理流程 _, img_binary = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY) kernel = np.ones((3, 3), np.uint8) eroded = cv2.erode(img_binary, kernel, iterations=1) boundaries = cv2.subtract(img_binary, eroded) # 保存4张结果图(自动命名,避免覆盖) cv2.imwrite(f"{save_path}1_Original_Image.jpg", img) cv2.imwrite(f"{save_path}2_Binary_Image.jpg", img_binary) cv2.imwrite(f"{save_path}3_Eroded_Image.jpg", eroded) cv2.imwrite(f"{save_path}4_Boundaries_Image.jpg", boundaries) # 同时显示结果(方便即时查看) plt.figure(figsize=(16, 4)) plt.subplot(1, 4, 1), plt.imshow(img, cmap='gray'), plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 4, 2), plt.imshow(img_binary, cmap='gray'), plt.title('Binary'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 4, 3), plt.imshow(eroded, cmap='gray'), plt.title('Eroded'), plt.xticks([]), plt.yticks([]) plt.subplot(1, 4, 4), plt.imshow(boundaries, cmap='gray'), plt.title('Boundaries'), plt.xticks([]), plt.yticks([]) plt.tight_layout(), plt.show() print(f"结果已保存到:{save_path}") print("保存文件清单:") print("1. 1_Original_Image.jpg(原始灰度图)") print("2. 2_Binary_Image.jpg(二值化图)") print("3. 3_Eroded_Image.jpg(腐蚀图)") print("4. 4_Boundaries_Image.jpg(边界提取图)")
最新发布
11-07
import cv2 import numpy as np import matplotlib.pyplot as plt import os from datetime import datetime # 设置中文字体 plt.rcParams['font.sans-serif'] = ['SimHei', 'FangSong'] plt.rcParams['axes.unicode_minus'] = False # 读取图像 image_path = r'D:\python\PythonProject\picture.png' original_image = cv2.imread(image_path) if original_image is None: raise FileNotFoundError("无法加载图像,请检查路径") # 创建输出目录 output_dir = "processed_images" os.makedirs(output_dir, exist_ok=True) # 图像处理流程 gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) # 灰度化 hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256]) # 直方图 # ---------------------------- # 明显的高斯噪声(增强对比) # ---------------------------- def add_strong_gaussian_noise(img): """添加明显的高斯噪声""" noise = np.random.normal(0, 40, img.shape).astype(np.float32) # 较强噪声 noisy_img = img.astype(np.float32) + noise return np.clip(noisy_img, 0, 255).astype(np.uint8) noisy_image = add_strong_gaussian_noise(original_image) # ---------------------------- # 均值滤波(适中强度) # ---------------------------- denoised_image = cv2.blur(noisy_image, (7, 7)) # 使用7x7核,平衡效果 # ---------------------------- # 单独保存每张图像 # ---------------------------- def save_individual_image(image, filename, title=None, cmap=None): """保存单个图像""" plt.figure(figsize=(8, 6)) plt.imshow(image, cmap=cmap) if title: plt.title(title, fontsize=16) plt.axis('off') plt.tight_layout() filepath = os.path.join(output_dir, filename) plt.savefig(filepath, dpi=150, bbox_inches='tight') plt.close() print(f"✅ 已保存: {filepath}") # 1. 原始图像 save_individual_image( cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB), "1_original_image.png", "原始图像" ) # 2. 灰度图像 save_individual_image( gray_image, "2_gray_image.png", "灰度图像", cmap='gray' ) # 3. 灰度直方图 plt.figure(figsize=(8, 6)) plt.plot(hist, color='black') plt.fill_between(np.arange(256), hist.ravel(), color='gray', alpha=0.3) plt.title('灰度直方图', fontsize=16) plt.xlabel('像素值') plt.ylabel('频率') plt.grid(alpha=0.2) plt.xlim([0, 255]) plt.tight_layout() hist_filepath = os.path.join(output_dir, "3_histogram.png") plt.savefig(hist_filepath, dpi=150, bbox_inches='tight') plt.close() print(f"✅ 已保存: {hist_filepath}") # 4. 带噪声图像 save_individual_image( cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB), "4_noisy_image.png", "带高斯噪声图像" ) # 5. 均值滤波降噪图 save_individual_image( cv2.cvtColor(denoised_image, cv2.COLOR_BGR2RGB), "5_denoised_mean_filter.png", "均值滤波降噪图" ) # ---------------------------- # 最终汇总图(正确顺序) # ---------------------------- plt.figure(figsize=(18, 10)) # 1. 原图 plt.subplot(2, 3, 1) plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)) plt.title('1. 原始图像') plt.axis('off') # 2. 灰度图 plt.subplot(2, 3, 2) plt.imshow(gray_image, cmap='gray') plt.title('2. 灰度图像') plt.axis('off') # 3. 灰度直方图 plt.subplot(2, 3, 3) plt.plot(hist, color='black') plt.fill_between(np.arange(256), hist.ravel(), color='gray', alpha=0.3) plt.title('3. 灰度直方图') plt.xlabel('像素值') plt.ylabel('频率') plt.grid(alpha=0.2) plt.xlim([0, 255]) # 4. 噪声图像 plt.subplot(2, 3, 4) plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB)) plt.title('4. 高斯噪声图像\n(σ=40)') plt.axis('off') # 5. 均值滤波 plt.subplot(2, 3, 5) plt.imshow(cv2.cvtColor(denoised_image, cv2.COLOR_BGR2RGB)) plt.title('5. 均值滤波降噪\n(7×7核)') plt.axis('off') # 6. 信息区域 plt.subplot(2, 3, 6) plt.axis('off') info_text = [ f"输入文件: {os.path.basename(image_path)}", f"图像尺寸: {original_image.shape[1]}×{original_image.shape[0]}", f"噪声强度: σ=40", f"滤波参数: 7×7均值滤波", f"处理时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" ] plt.text(0.1, 0.5, "\n".join(info_text), fontsize=11, va='center') plt.tight_layout(pad=3.0) # 保存汇总图 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") summary_filename = f"final_summary_{timestamp}.png" plt.savefig(summary_filename, dpi=150, bbox_inches='tight') print(f"✅ 已保存最终汇总图: {os.path.abspath(summary_filename)}") plt.show() print(f"\n📁 所有图像保存到目录: {os.path.abspath(output_dir)}") 效果不是很好。
10-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值