合并3张灰度图为RGB图像时仅显红蓝色的问题求助
问题原因及解决方法
核心问题:通道数据源重复
你的代码中image3和image2加载的是完全相同的文件路径:
image2 = Image.open("E:/imaging/04102022_Bronze/Oxygen_1_2/10.tif") image3 = Image.open("E:/imaging/04102022_Bronze/Oxygen_1_2/10.tif")
这导致绿通道(索引1)和蓝通道(索引2)的像素数据完全一致。当绿、蓝通道值相同时,二者叠加会呈现青色,但如果原图像的像素特征使得青色不明显,或者你误将青色等同于蓝色,就会产生“仅显示红、蓝色”的错觉。本质是你没有真正引入第三张独立的灰度图作为蓝通道数据源。
次要优化点(不影响色彩显示,但需修正)
- 代码中
final_image=final_image=Image.fromarray(...)存在重复赋值的冗余写法,改为final_image = Image.fromarray(new_image2, mode='RGB')即可。 - 归一化时重复调用
np.array(imageX),可以优化为先转换为数组再计算,提升效率:image1_arr = np.array(image1) image1_norm = (image1_arr - image1_arr.min()) / (image1_arr.max() - image1_arr.min())
修正后的代码示例
from PIL import Image import numpy as np # 加载三张不同的灰度图 image1 = Image.open("E:/imaging/04102022_Bronze/Copper_4_2/10.tif") image1_arr = np.array(image1) image1_norm = (image1_arr - image1_arr.min()) / (image1_arr.max() - image1_arr.min()) image2 = Image.open("E:/imaging/04102022_Bronze/Oxygen_1_2/10.tif") image2_arr = np.array(image2) image2_norm = (image2_arr - image2_arr.min()) / (image2_arr.max() - image2_arr.min()) # 修正:加载第三张独立的灰度图 image3 = Image.open("E:/imaging/04102022_Bronze/[你的第三张图路径]/10.tif") image3_arr = np.array(image3) image3_norm = (image3_arr - image3_arr.min()) / (image3_arr.max() - image3_arr.min()) # 创建3通道数组 new_image = np.zeros(image1_arr.shape + (3,), dtype=np.float32) new_image[:,:,0] = image1_norm # 红通道 new_image[:,:,1] = image2_norm # 绿通道 new_image[:,:,2] = image3_norm # 蓝通道 # 转换为uint8格式并生成图像 new_image_uint8 = (new_image * 255).astype(np.uint8) final_image = Image.fromarray(new_image_uint8, mode='RGB') final_image.show()
额外检查项
如果修正路径后仍有问题,可检查:
- 第三张灰度图是否本身像素值异常(比如全黑/全白),导致蓝通道无有效信息。
- 确认三张图像的尺寸是否一致,如果尺寸不同,赋值通道时会报错或出现截断,需先统一尺寸。
内容的提问来源于stack exchange,提问作者Raju
相关产品推荐
相关产品推荐

