python PIL读取图像转换为灰度图及二值图像

以下操作都是在windows环境下进行。 

一、读取数据

1. 读取单个图像:

from PIL import Image #或直接import Image
im = Image.open(00001.jpg)

2. 批量读取:

import os
def get_path(path):
    返回目录中所有PNG图像的文件名列表
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith(.png)]
pth = get_path(../mask_dir_Class)   # get_path(path)中path参数是自己的文件夹目录,例如(../mask_dir_Class)

3. 看一下是否读取成功:

im.show()

二、模式“RGB”转换为‘L’模式灰度图

模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

转换前后的维度变换,开始是3通道的(height, width, channel),转为灰度图像后维度为1通道,1被省略显示

将图片转换为灰度图并保存到自己的文件夹(我这里是在上一级目录新建了一个灰度图文件夹):

img = im.convert(L) 
if not os.path.exists(../灰度图):
        os.mkdir(../灰度图)
img.save(../灰度图/ + img.split(\)[-1])
以上代码把00001.png打开并转换成灰度图(像素值在0-255之间),然后保存成00001.png格式。可以把上一行代码中00001.png改成路径加文件名,就可以保存到自己想要保存的地方了。

原图(左)和灰度图(右):

三、模式“RGB”转换为‘1’模式二值图像

模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。下面我们将00001.png图像转换为“1”图像。

将图片转换为二值图像并保存到自己的文件夹(我这里是在上一级目录新建了一个二值图像文件夹):

img = im.convert(1) 
if not os.path.exists(../二值图像):
        os.mkdir(../二值图像)
img.save(../二值图像/ + img.split(\)[-1])

原图(左)和二值图像(右):

完整代码 

from PIL import Image #或直接import Image
import os
def get_path(path):
    返回目录中所有PNG图像的文件名列表
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith(.png)]
pth = get_path(../mask_dir_Class)
for img in pth:
    im = Image.open(img).convert(L)
    # im.show()
    if not os.path.exists(../灰度图):
        os.mkdir(../灰度图)
    im.save(../灰度图/ + img.split(\)[-1])
print(灰度图 Save OK!)
for img in pth:
    im = Image.open(img).convert(1)
    # im.show()
    if not os.path.exists(../二值图像):
        os.mkdir(../二值图像)
    im.save(../二值图像/ + img.split(\)[-1])
print(二值图像 Save OK!)

参考链接

经验分享 程序员 微信小程序 职场和发展