PIL处理图像代码实现

该博客主要介绍了使用Python进行图像处理的方法,涵盖拷贝、剪裁、翻转、旋转和图像平滑等操作。通过定义函数,利用PIL库对图像进行像素级处理,并给出了相应的测试代码,展示了如何实现这些图像处理功能。

1.拷贝图像

import PIL.Image
def copy(im):
    """返回拷贝后的图像对象"""
    # 创建与原始图像相同模式和大小的新图像对象
    im_new = PIL.Image.new(im.mode, im.size)
    width, height = im.size
    #使用嵌套循环,把旧图像位置(i,j)的像素复制到新图像的位置(i,j)
    for i in range(0, width):
        for j in range(0, height):
            pix= im.getpixel((i,j))
            im_new.putpixel((i,j), pix)
    return im_new
# 测试代码
if __name__ == "__main__":
    im = PIL.Image.open("C:/Users/86155/Pictures/new_photo/OIP-C.png")
    copy(im).show()

2.剪裁图像

import PIL.Image
def crop(im, box):
    """返回使用矩形框剪切后的图像对象"""
    # 剪切框定义左上角和右下角坐标位置
    x1,y1,x2,y2 = box
    # 计算新图像的宽度width 和高度height,并创建新图像
    width,height = x2-x1, y2-y1
    im_new = PIL.Image.new(im.mode, (width, height))
    # 使用嵌套循环,把旧图像剪切框内的像素拷贝到新图像
    for i in range(width):
        for j in range(height):
            pix = im.getpixel((x1+i,y1+j))
            im_new.putpixel((i,j), pix)
    return im_new
# 测试代码
if __name__ == "__main__":
    im = PIL.Image.open("C:/Users/86155/Pictures/new_photo/OIP-C.png")
    box = (10,10,200,200)
    crop(im,box).show()

3.水平或垂直翻转图像

import PIL.Image
def flip(im, orient="H"):
    """返回水平或垂直翻转后的图像对象"""
    # 获取图像的宽度width和高度height,并创建新图像
    width, height = im.size
    im_new = PIL.Image.new(im.mode, im.size)
    # 使用嵌套循环,把旧图像的像素拷贝到新图像对应位置
    for i in range(width):
        for j in range(height):
            pix = im.getpixel((i, j))
            if orient == "H":  # 水平翻转时
                # 原始图像的像素(i.j)映射到目标图像的位置(width-i-1,j)
                im_new.putpixel((width - i - 1, j), pix)
            else:  # 垂直翻转时
                # 原始图像的像素(i,j)映射到目标图像的位置(i,height-j-1)
                im_new.putpixel((i, height - j - 1), pix)
    return im_new
# 测试代码
if __name__ == "__main__":
    im = PIL.Image.open(r"C:\\Users\21247\Pictures\images\alien.bmp.png")
    flip(im, orient="H").show()
    flip(im, orient="V").show()

4.逆时针或顺时针旋转图像90度

import PIL.Image
def rotate(im, orient="CC"):
    """返回逆时针或顺时针旋转90度后的图像对象"""

    # 获取图像的宽度width和高度height,并创建新图像
    width,height = im.size
    im_new = PIL.Image.new(im.mode, (height,width))
    # 使用嵌套循环,把旧图像的像素拷贝到新图像对应位置
    for i in range(0, width):
        for j in range(0, height):
            pixel = im.getpixel((i,j))
            if orient == "CC":  # 逆时针旋转90度时
                # 原始图像的像素(ij)映射到目标图像的位置(height-j-1,i)
                im_new.putpixel((height-j-1, i), pixel)
            else:  # 顺时针旋转90度时
                # 原始图像的像素(i.j)映射到目标图像的位置(j,width-i-1)
                im_new.putpixel((j, width-i-1), pixel)
    return im_new
# 测试代码
if __name__ == "__main__":
    im = PIL.Image.open("C:/Users/86155/Pictures/new_photo/OIP-C.png")
    #逆时针旋转90度
    rotate(im, orient="CC").show()
    #顺时针旋转90度
    rotate(im, orient="CW").show()

5.平滑图像过滤器

import PIL.Image
def smooth(im):
    """返回平滑后的图像"""
    # 获取图像的宽度width和高度height,并创建新图像
    width,height = im.size
    im_new = PIL.Image.new(im.mode, im.size)
    # 使用嵌套循环,把旧图像的像素拷贝到新图像对应位置
    for i in range(0, width):
        for j in range(0, height):
            I, g,b=0,0, 0 #初始化
            numPixels = 0
            for c in range(max(0, i-1), min(width, i+2)):
                for r in range(max(0, j-1), min(height, j+2)):
                    numPixels +=1

                    pix = im.getpixel((c, r))
                    r += pix[0]
                    g += pix[1]
                    b += pix[2]
            # 计算平均值
            r = r // numPixels
            g = g // numPixels
            b = b // numPixels
    im_new.putpixel((i, j), (r, g, b))
    return im_new

# 测试代码
if __name__ == "__main__":
    im = PIL.Image.open("C:/Users/86155/Pictures/new_photo/OIP-C.png")
    smooth(im).show()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值