如何使用Python将二值图像转换为灰度图和RGB图?含皮肤病变图像脱毛需求
嘿,我来帮你搞定这些皮肤病变图像处理的问题~
皮肤病变图像脱毛后的图像恢复与格式转换方案
一、基于掩码恢复原始图像区域(实现黑色区域替换)
你要实现的是把掩码里的黑色区域替换成原始RGB图的对应内容,这本质是图像遮罩合成,用Python的OpenCV或者PIL库都能轻松搞定,我给你两种常用方案:
方案1:用OpenCV实现(适合偏向计算机视觉的工作流)
import cv2 import numpy as np # 1. 读取图像:原始图是RGB格式,掩码以灰度图读取(二值图本质是单通道灰度图) original_rgb = cv2.imread("原始图像路径.jpg") mask_gray = cv2.imread("掩码图像路径.jpg", cv2.IMREAD_GRAYSCALE) # 2. 确保掩码和原始图尺寸一致(如果尺寸不匹配,就缩放掩码对齐) if original_rgb.shape[:2] != mask_gray.shape: mask_gray = cv2.resize(mask_gray, (original_rgb.shape[1], original_rgb.shape[0])) # 3. 创建逆掩码:把掩码的黑色区域(像素值0)转为255(允许原始图像素通过),白色区域转为0(禁止通过) inv_mask = cv2.bitwise_not(mask_gray) # 4. 提取原始图中对应掩码黑色区域的像素 original_part = cv2.bitwise_and(original_rgb, original_rgb, mask=inv_mask) # 5. 把掩码转为RGB通道,提取白色区域的像素 mask_rgb = cv2.cvtColor(mask_gray, cv2.COLOR_GRAY2BGR) mask_part = cv2.bitwise_and(mask_rgb, mask_rgb, mask=mask_gray) # 6. 合并两部分,得到最终结果 final_result = cv2.add(original_part, mask_part) # 保存恢复后的图像 cv2.imwrite("恢复后的图像.jpg", final_result)
方案2:用PIL实现(更贴近Python原生风格)
from PIL import Image import numpy as np # 1. 读取图像:原始图转RGB,掩码转灰度(二值)模式 original_img = Image.open("原始图像路径.jpg").convert("RGB") mask_img = Image.open("掩码图像路径.jpg").convert("L") # 2. 对齐图像尺寸 if original_img.size != mask_img.size: mask_img = mask_img.resize(original_img.size) # 3. 转为numpy数组方便像素级操作 original_np = np.array(original_img) mask_np = np.array(mask_img) # 4. 把掩码扩展为RGB三通道形状,生成替换掩码(标记哪些位置要用原始图像素) mask_rgb_np = np.stack([mask_np]*3, axis=-1) # 布尔掩码:True表示掩码中黑色区域(像素值0),需要替换为原始图内容 replace_mask = (mask_np == 0)[:, :, np.newaxis] # 5. 合并图像:替换区域用原始图,其余区域保留掩码的白色 final_np = np.where(replace_mask, original_np, mask_rgb_np) # 6. 转回PIL图像并保存 final_img = Image.fromarray(final_np.astype(np.uint8)) final_img.save("恢复后的图像.jpg")
二、Python中二值图像转灰度图、RGB图像的通用方法
1. 二值图像转灰度图
其实二值图像本身就是特殊的灰度图(只有0和255两个像素值),如果是已经读取的二值图,直接使用即可。如果需要显式转换:
- 用PIL:读取后转为
"L"模式
from PIL import Image binary_img = Image.open("二值图路径.jpg") gray_img = binary_img.convert("L") gray_img.save("灰度图.jpg")
- 用OpenCV:直接以灰度模式读取二值图
import cv2 gray_img = cv2.imread("二值图路径.jpg", cv2.IMREAD_GRAYSCALE) cv2.imwrite("灰度图.jpg", gray_img)
2. 二值图像转RGB图像
核心是把单通道的二值图扩展为三通道,每个通道的像素值和原二值图一致,三种常用方法:
方法1:OpenCV一键转换
import cv2 binary_img = cv2.imread("二值图路径.jpg", cv2.IMREAD_GRAYSCALE) rgb_img = cv2.cvtColor(binary_img, cv2.COLOR_GRAY2BGR) cv2.imwrite("RGB图.jpg", rgb_img)
方法2:PIL简单转换
from PIL import Image binary_img = Image.open("二值图路径.jpg").convert("L") rgb_img = binary_img.convert("RGB") rgb_img.save("RGB图.jpg")
方法3:Numpy手动扩展(适合自定义操作)
import numpy as np from PIL import Image binary_np = np.array(Image.open("二值图路径.jpg").convert("L")) # 将单通道数组重复三次,生成三通道RGB数组 rgb_np = np.stack([binary_np]*3, axis=-1) rgb_img = Image.fromarray(rgb_np.astype(np.uint8)) rgb_img.save("RGB图.jpg")
内容的提问来源于stack exchange,提问作者codelearn22
相关产品推荐
相关产品推荐

