Python PIL库对遮罩文件bmp进行红绿色素的提取,生成png,再合图

本文介绍了一种从图片中提取并合并红色和绿色像素的方法。通过Python的PIL库,该过程首先将图片中的非零红/绿像素转换为纯红/绿,其余部分设为白色。接着将处理后的红绿图片合并成一张新图,根据颜色信息决定最终像素值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
from PIL import Image
import sys
import os

# begin 提取红、绿像素
def ChangeImg(filePath, fileSavePath, color):

    img = Image.open(filePath)
    width, height = img.size  # 600 400    # 获取图片的宽高
    pix_array = img.load()  # 像素访问对象 type:pixelAccess 获取像素点对应RGB颜色值,可以改变img_array中的值来改变颜色值
    for x in range(width):
        for y in range(height):
            tuple = pix_array[x,y]
            if color == 'red':
                if tuple[0] != 0:
                    tuple2 = (255, 0, 0)
                else:
                    tuple2 = (255, 255, 255)
            else:
                if tuple[0] != 0:
                    tuple2 = (0, 255, 0)
                else:
                    tuple2 = (255, 255, 255)
            pix_array[x, y] = tuple2
    img.save(fileSavePath)  # 保存

# end 提取红、绿像素

# begin 合并 红、绿位图
def ChangeImg_merge(filePath1, filePath2, save_path):

    img1 = Image.open(filePath1)
    width, height = img1.size  # 600 400    # 获取图片的宽高
    pix_array1 = img1.load()  # 像素访问对象 type:pixelAccess 获取像素点对应RGB颜色值,可以改变img_array中的值来改变颜色值

    img2 = Image.open(filePath2)
    pix_array2 = img2.load()

    for x in range(width):
        for y in range(height):
            tuple1 = pix_array1[x, y]
            tuple2 = pix_array2[x, y]

            if tuple1 == (255, 255, 255) and tuple2 == (255, 255, 255):
                hex_num = (255, 255, 255)
            elif tuple1 == (255, 255, 255) and tuple2 != (255, 255, 255):
                hex_num = tuple2
            elif tuple1 != (255, 255, 255) and tuple2 == (255, 255, 255):
                hex_num = tuple1
            else:
                hex_num = (255, 255, 0)

            pix_array1[x, y] = hex_num

    img1.save(save_path)  # 保存

def TraverseRed(basedir):
    try:
        red_bmp_dir = basedir + '\红bmp'
        for roots, dirs, files in os.walk(red_bmp_dir):
            # 操作根目录下的图片
            for fileName in files:
                if fileName.endswith('.bmp'):
                    fileNum = fileName.split('.')[0].split('_')[0]
                    savedir = basedir + '\合并bmp\\' + fileNum
                    if not os.path.exists(savedir):
                        os.mkdir(savedir)

                    filePath = red_bmp_dir + '\\' + fileName
                    fileSavePath = savedir + '\\' + fileNum + '_红.png'
                    ChangeImg(filePath, fileSavePath, 'red')
    except IOError:
        print("执行出错,请退出重新尝试!!!")

def TraverseGreen(basedir):
    try:
        red_bmp_dir = basedir + '\绿bmp'
        for roots, dirs, files in os.walk(red_bmp_dir):
            # 操作根目录下的图片
            for fileName in files:
                if fileName.endswith('.bmp'):
                    fileNum = fileName.split('.')[0].split('_')[0]
                    savedir = basedir + '\合并bmp\\' + fileNum
                    if not os.path.exists(savedir):
                        os.mkdir(savedir)

                    filePath = red_bmp_dir + '\\' + fileName
                    fileSavePath = savedir + '\\' + fileNum + '_绿.png'
                    ChangeImg(filePath, fileSavePath, 'green')
    except IOError:
        print("执行出错,请退出重新尝试!!!")

def TraverseMerge(basedir):
    try:
        merge_blk_dir = basedir + '\合并bmp'
        for roots, dirs, files in os.walk(merge_blk_dir):
            if files == []:
                continue
            file_path1 = roots + '\\' + files[0]
            file_path2 = roots + '\\' + files[1]
            save_path = roots + '\\' + files[0][:4] + '_合并.png'
            ChangeImg_merge(file_path1, file_path2, save_path)

    except IOError:
        print("执行出错,请退出重新尝试!!!")


if __name__ == '__main__':
    print("start...\n")
    print("转化中,若文件较多,可能需要几分钟的时间,不要关闭此窗口,请耐心等待。。。\n")

    basedir = sys.argv[0][:-12]  # exe文件所在的目录

    # 遍历红目录
    print('开始生成红色位图')
    TraverseRed(basedir)
    print('红色位图生成完毕。。\n')

    # 遍历绿目录
    print('开始生成绿色位图')
    TraverseGreen(basedir)
    print('绿色位图生成完毕。。\n')

    # 遍历合并目录
    print('开始合并红、绿位图')
    TraverseMerge(basedir)
    print('位图合并完毕。。\n')

    print('转化完成!!!\n')

    os.system("pause")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值