Python3一篇学会“图像处理”的基本操作

本章节用到python处理图像的模块为pillow

本章采用: pycharm + python3.10 + pillow模块

请自行下载该模块

pip install pillow

                                                                        本章目录

pillow模块基本概念

1、getrgb()函数的基本概念和使用

函数演示

 2、getcolor()函数的基本概念和使用

函数演示

一.图像的基本操作

1.开启图像对象

2.图像大小属性

 3.取得图像对象文件名

4.取得图像对象的文件格式 

 5.存储文件

 6.屏幕显示图片

 7.建立新的图像对象

 二 . 图像编辑

1.更改图像大小

2.图像旋转

3.图像翻转

 4.图像像素的编辑

4.1 在图片的某处添色彩

5.剪裁,复制,与图像合成

        5.1剪裁

        5.2 复制

    5.3 图像合成 

 6.图片滤镜

7.绘制图案

7.1 绘制点,绘制线条

7.2 绘制圆,椭圆,矩形,多边形

7.3 图像内填写文字


 

pillow模块基本概念

        在pillow模块中RGBA分别代表红色(red),绿色(gree),蓝色(blue)和透明度(alpha)这四个与颜色有关的数值组成元组,每个数值是0~255。如果alpha的值为255,代表完全不透明,值越小透明度越高。其色彩使用方式与PS等其他图片处理软件相同。

1、getrgb()函数的基本概念和使用

        该函数可以将颜色符号或字符串转为元组,这里可以使用英文名称,比如 ‘red’,色彩数值,如 #00ff00,以及rgb函数,如rgb(255,0,0)。rgb函数也可以使用百分比代表颜色,例如rgb(0%,100%,0%)。这个函数在使用时,如果字符串无法被解析判别,将造成ValueErro的异常,使用格式如下:

(r,g,b) = getrgb(color)

函数演示

from PIL import ImageColor as ic  # 注意在程序设计中不需导入的是PTL模块,主要原因是兼容旧版 Python Image Library

# 使用 getrgb方法返回色彩的元组
print("通过颜色代码返回", ic.getrgb("#0000ff"))
print("如果rgb颜色数值返回", ic.getrgb("rgb(255,0,0)"))
print("通过百分比返回", ic.getrgb("rgb(0%,100%,0%)"))
print("通过英文单词返回", ic.getrgb("Red"))
print("通过小写英文单词返回", ic.getrgb("red"))

# 运行结果:

Python3一篇学会“图像处理”的基本操作_第1张图片

 2、getcolor()函数的基本概念和使用

        该函数基本功能上与getrgb函数相同,书写格式如下:

(r,g,b) = getcolor(color,"mode")  #返回色彩元组
(r,g,b,a) = getcolor(color,"mode")  # 返回色彩元组

“mode”若是填写RGBA则返回RGBA的元组,RGB则时RGB元组

# 不懂RGB 和RGBA的请跳转

RGB(颜色系统)_百度百科 (baidu.com)

RGBA_百度百科 (baidu.com)

函数演示

from PIL import ImageColor as ic  # 注意在程序设计中不需导入的是PTL模块,主要原因是兼容旧版 Python Image Library

print("RGB元组:", ic.getcolor("#0000ff", "RGB"))
print("RGB元组:", ic.getcolor("rgb(255,0,0)", "RGB"))
print("RGB元组:", ic.getcolor("Red", "RGB"))
print("RGBA元组:", ic.getcolor("#0000ff", "RGBA"))
print("RGBA元组:", ic.getcolor("rgb(255,0,0)", "RGBA"))
print("RGBA元组:", ic.getcolor("red", "RGBA"))

# 运行结果

Python3一篇学会“图像处理”的基本操作_第2张图片

一.图像的基本操作

1.开启图像对象

   可以用open()方法开启一个图像,参数是放置欲开启的图像文件

2.图像大小属性

     可以使用size属性获得图像大小,这个属性可回传图像的宽(width)和高(height)

# 例如             

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.png")
print("列出对象类型", type(image))
width, height = image.size
print("图片宽度=", width)
print("图片高度=", height)

# 运行结果

 3.取得图像对象文件名

        filename函数可以获取当前图片名称

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.png")
print("图像名称", image.filename)

4.取得图像对象的文件格式 

         可以使用formart属性获得图片文件扩展名,此外,可以使用format_description属性获得更详细的文件格式描述

#例如

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.png")
print("列出对象扩展名称", image.format)
print("列出对象详细扩展名称", image.format_description)

# 运行结果

 5.存储文件

        可以使用save()函数存储文件,甚至可以将 jpg 格式转换成 png 格式,如果 png 转 jpg是不行的

#例如

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.jpg")
image.save("image.png") # 储存并转为png格式

# 运行结果

 6.屏幕显示图片

        可以使用show()方法直接显示图片,在windows操作系统下可以使用此方法调用windows相片查看器显示图片

#例如

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.jpg")
image.show() # 显示图片

# 运行结果

 7.建立新的图像对象

           可以使用new()方法建立新的图像对象

           语法格式:

new(mode,size,color=0)
# mode:可以有多种设定,一般用“RGBA”建立PNG图片,"RGB"建立jpg图片
# size: 该参数是一个元组,可以设定新图像的宽度和高度。
# color: 预设是黑色,不过我们可以建立不同的颜色

 # 例如

from PIL import Image

# 创建图片
create_image = Image.new("RGBA", (1920, 1080), "yellow")
create_image.save("test.png")
create_image.show()

# 运行结果

Python3一篇学会“图像处理”的基本操作_第3张图片

 二 . 图像编辑

1.更改图像大小

        Pillow模块提供的resize()方法可以调整图像大小

语法:

resize((widtg,heigh),Image.BILINEAR)
# (widtg,heigh): 宽高,元组的形式
# 参数二(BILINEAR)图像质量方法,也可以设定NEAREST最低质量,ANTIALIAS最高质量或者BISCUBIC三次方取样法,一般可以省略

# 例如

from PIL import Image

# 建立pillow对象
image = Image.open("image/image.jpg")  # 打开图片
width, height = image.size  # 将大小提取为参数
print(f"原图大小"
      f"宽:{width}"
      f"高:{height}")
new_image = image.resize((width * 2, height * 2))  # 将原图的宽高提升为原来的二倍
new_image_save = new_image.save("new_image.png")  # 保存图片并且为png格式
image1 = Image.open("new_image.png")  # 打开新图片
width, height = image1.size  # 提取新图片大小
print(f"改后大小"
      f"宽:{width}"
      f"高:{height}")

# 运行结果

2.图像旋转

        rotate()方法可以逆时针旋转图片,该方法有第二个参数 expand=True 代表旋转并放大,默认是不放大

# 例如

from PIL import Image

# 建立pillow对象
# 旋转前
image = Image.open("image/image.jpg")  # 打开图片
w, h = image.size
print(f"旋转前"
      f"宽:{w}"
      f"高:{h}")
image.show()
# 旋转后
image.rotate(90).save("90度图片.png")  # 逆时针转向90度
# image.rotate(90, expand=True).save("90度图片.png")  # 逆时针转向90度并放大
new_image = Image.open("90度图片.png")
new_image.show()
w, h = new_image.size
print(f"旋转后"
      f"宽:{w}"
      f"高:{h}")

# 运行结果

# 未加 expand 参数效果

Python3一篇学会“图像处理”的基本操作_第4张图片

# 加了 expand 参数的效果 ,加了以后宽高参数会发生调转

 Python3一篇学会“图像处理”的基本操作_第5张图片

3.图像翻转

        transpose()函数可以让图片翻转

语法:

transpose(Image.ELIP_LEFT_RIGHT)  # 图片左右翻转
transpose(Image.ELIP_TOP_BOTTOM)  # 图片上下翻转

# 例如:

from PIL import Image

image = Image.open("image/image.jpg")  # 打开图片
image.transpose(Image.FLIP_LEFT_RIGHT).show()  # 左右翻转

image.transpose(Image.FLIP_TOP_BOTTOM).show()  # 上下翻转

# 运行结果

Python3一篇学会“图像处理”的基本操作_第6张图片

 4.图像像素的编辑

        getpixe()方法可以取得图像某一位置像素的色彩

语法:

getpixe((x,y))  # 参数是元组,x 和 y 代表像素位置

# 例如  

from PIL import Image

# 取图片某一点的颜色值
image = Image.open("image/image.jpg")  # 打开图片
print(image.getpixel((123, 123)))  # 打印位于x,y 轴123px的色彩

# 运行结果

4.1 在图片的某处添色彩

        putpixel()方法可以在图片的某一处位置填入色彩

语法如下:

putpixel((x,y),(r,g,b,a))  # 2 个参数分别代表位置与颜色

 # 例如

# 想玩的同学,可以尝试用 随机数模块 random 实现动一下一个颜色哈~~花里胡哨的~哈哈

from PIL import Image
from PIL import ImageColor


image = Image.open("image/image.jpg")  # 打开图片
# 利用循环添加颜色点
for x in range(1, 1200):
    for y in range(1, 1200):
        image.putpixel((x, y), (0, 234, 123, 255))  # 通过X,Y 坐标添加 颜色
image.save("1.png") # 保存图片
Image.open("1.png").show()  # 查看图片

# 与上方同理
for x in range(1, 999):
    for y in range(1, 999):
        image.putpixel((x, y), ImageColor.getcolor("red", "RGBA"))  # 通过getcolor 添加颜色
image.save("1.png")
Image.open("1.png").show()

# 运行结果

5.剪裁,复制,与图像合成

        5.1剪裁

                通过 crop()的方法可以实现图片剪裁

#例如

from PIL import Image

image = Image.open("image/image.jpg")  # 打开图片
image1 = image.crop((120, 240, 480, 960)) # 剪裁位置分别代表 (左,上,右,下)
image1.show()

元组里的元素分别是:(左:距离图片左边界距离,上: 距离图片上边界距离,右:距离图片左边的距离,下:距离图片上边界距离) 

 # 运行结果

Python3一篇学会“图像处理”的基本操作_第7张图片

        5.2 复制

                通过copy()函数即可复制,这一快为了保证不破坏原图内容,复制一个副本然后再执行代码

#例如

from PIL import Image

image = Image.open("image/image.jpg")  # 打开图片
copy_image = image.copy()  # 复制图片
copy_image.save("3.png")  # 保存

    5.3 图像合成 

             通过paste()函数就可以合成图像

    语法:

底层图片.paste(插入图像,(x,y))

# 例如

from PIL import Image

image = Image.open("image/image.jpg")  # 打开图片
image1 = image.copy()  # 复制图片
image2 = image1.crop((1075, 256, 1445, 552))  # 剪裁图片   左 1075  右 256 上 1445  下 552
crop_width, crop_height = image2.size  # 获取剪裁后图片的 宽 高
print("剪裁图片后的宽高", crop_width, crop_height)
# 新建图片
width, height = 1920, 1080
new_image = Image.new("RGBA", (width, height), "Blue")  # 建立 宽高 1920 * 1080 的蓝色背景
for x in range(40, width - 40, crop_width):  # 定位x坐标 以剪切的图片宽度为准,走步长
    for y in range(40, height - 40, crop_height):  # 定位y 坐标  以剪切的图片高度为准,走步长
        new_image.paste(image2, (x, y))  # 将加剪切图片合成到我们建立的背景下
new_image.show() # 查看图片

# 运行结果

 6.图片滤镜

        Pillow模块内有ImageFilter模块,在该模块当中有filter()函数可以为图片加上滤镜效果

        filter()方法参数

                BLUR: 模糊

                CONTOUR: 轮廓

                DETAIL: 细节增强

                EDGE_ENGANCE: 边缘增强

                EDGE_ENHANCE_MORE: 深度边缘增强

                EMBOSS:  浮雕效果

                FIND_EDGES: 边缘信息

                SMOOTH: 平滑效果

                SMOOTH_MORE: 深度平滑效果

                SHARPEN: 锐利化效果

#例如:

from PIL import Image
from PIL import ImageFilter

image = Image.open("image/image.jpg")  # 打开图片
image_ps = image.filter(ImageFilter.BLUR)  # 模糊效果
image_ps.show()
image_ps_1 = image.filter(ImageFilter.CONTOUR)  # 轮廓效果
image_ps_1.show()
image_ps_2 = image.filter(ImageFilter.EMBOSS)  # 浮雕效果
image_ps_2.show()
image_ps_3 = image.filter(ImageFilter.FIND_EDGES)  # 边缘化效果
image_ps_3.show()

#运行结果:

7.绘制图案

         Pillow模块内有一个ImageDraw的模块,可以利用该模块绘制点(Points),线(Lines),矩形(Rectangles),椭圆(Ellipses),多边形(Polygons)。

7.1 绘制点,绘制线条

        ImageDraw的模块下 point()方法可以绘制点

语法:

point([(x1,y1),(x2,y2),......(xn,yn)],fill) # fill设定颜色
# 第一个参数是元组组成的列表,x和y是绘制点坐标
# fill可以是RGBA()或者是直接指定颜色

      ImageDraw的模块下 line()函数可以绘制线

语法:

line([(x1,y1),(x2,y2),......(xn,yn)],width,fill) # width为宽度,预设为 1
# 第一个与绘制线差不多,当有两个点的时候会自动连成线,fill可以是RGBA()或指定颜色

# 例如:

from PIL import Image, ImageDraw

new_image = Image.new('RGBA', (300, 300), "azure")  # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
new_image.save("1.png")

# 绘制点
for x in range(100, 200, 3):  # 定位x坐标,范围和点的间隔
    for y in range(100, 200, 3):  # 定位 y 坐标,范围和点的间隔
        draw_image.point([x, y], fill='red')
new_image.show()

# 绘制线条
draw_image.line([(0, 0), (299, 0), (299, 299), (0, 299), (0, 0)], fill="Black")
new_image.show()

# 绘制右上角
for x in range(150, 300, 10):
    draw_image.line([(x, 0), (300, x - 150)], fill="yellow")
new_image.show()

# 绘制左下角
for y in range(150, 300, 10):
    draw_image.line([(0, y), (y-150, 300)], fill="green")
new_image.show()

#运行结果

Python3一篇学会“图像处理”的基本操作_第8张图片

7.2 绘制圆,椭圆,矩形,多边形

        ImageDraw的模块下 ellipse()方法可以绘制圆或椭圆

语法:

ellipse((left,top,right,boottom),fill,outline)
# (left,top,right,boottom):代表左上角与右下角坐标位置
# fill: 颜色
# outline: 可选是否加上

       ImageDraw的模块下 rectangle()方法可以绘制矩形

语法:

rectangle((left,top,right,boottom),fill,outline) # 与绘制椭圆的注释一个意思

         ImageDraw的模块下 polygon()方法可以绘制多边形

语法:

polygon([(x1,y1),(x2,y2),......(xn,yn)],fill,outline)
# 第一个参数 [(x,y)] 表示绘制多边形的点坐标,在此须填上多边形各端点的坐标
# fill 颜色
# outline 可选是否加上

# 例如:

from PIL import Image, ImageDraw

new_image = Image.new('RGBA', (300, 300), "azure")  # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
draw_image.rectangle((0, 0, 299, 299), outline="Blue")  # 绘制图像外框线
# new_image.show()
draw_image.ellipse((30, 65, 130, 100), outline="red")  # 绘制椭圆
# new_image.show()
draw_image.ellipse((65, 65, 95, 95), outline="green")  # 绘制圆
# new_image.show()
draw_image.polygon([(150, 120), (180, 180), (120, 180), (150, 120)], fill="Aqua")  # 绘制三角形
# new_image.show()
draw_image.rectangle((100, 210, 200, 240), fill="Black") # 绘制矩形
new_image.show()

#运行结果

Python3一篇学会“图像处理”的基本操作_第9张图片

7.3 图像内填写文字

        ImageDraw的模块下 text()函数可以填写中英文

语法:

text((x,y),text,fill,font) # text参数代表要写的文字

# font: 选择默认方式填写可以忽略该参数。
# 如果想填写其他字体 选定字号,需要调用ImageFont.truetype()方法 # 需要提前导入该函数
# 该方法语法如下
# text(字体路径,字号)

# 例如:

from PIL import Image, ImageDraw, ImageFont

new_image = Image.new('RGBA', (300, 300), "aqua")  # 建立300*300青色图像
draw_image = ImageDraw.Draw(new_image)
Text = "Thanks for watching my blog !"
draw_image.text((70, 70), Text, fill="Black")  # 使用默认字体
# 选取系统字体
chinese_text = "感谢观看我的博客!"
font_info = ImageFont.truetype('C:\Windows\Fonts\msyh.ttc', 25)  # 选取本地汉字存放路径,win10默认就是这个路径下
draw_image.text((50, 180), chinese_text, fill="Red", font=font_info) # 定位并选择文字和颜色,还有字体位置字号
new_image.show()

# 运行结果:

Python3一篇学会“图像处理”的基本操作_第10张图片

你可能感兴趣的:(Python,python,开发语言,图像处理)