Pillow使用嵌套循环实现图像处理算法

getpixel()和putpixel()方法

PIL.Image类的方法getpixel()和putpixel()可以用于读取和修改特定位置(loc)的像素颜色值(pix)。

  • im.getpixel(loc) #返回位于位置loc的像素的颜色。
  • im.putpixel(loc,pix) #把loc的颜色替换为pix。

示例如下:

import PIL
from PIL import Image
 
img = Image.open(r"C:\Users\加油\Desktop\111.jpg")
print (img.size)
print(img.getpixel((4,4)))
 
width = img.size[0]#长度
height = img.size[1]#宽度
 
for w in range(0,width):
    for h in range(0,height):
        data = img.getpixel((w,h))#得到像素值
        if (data[0] <= 170 and data[1] <= 170 and data[2] <= 170):
            img.putpixel((w,h), (0, 0, 255))
 
img.save("newimg.jpg")
img.show()

图像结果显示:
在这里插入图片描述

拷贝图像函数copy()

拷贝图像的算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后将旧的图像中的像素颜色复制到新图像相应的像素中。即使用嵌套循环,把就图像位置(i,j)的像素复制到新图像的位置(i,j)。
实例:

  • 实现图像拷贝函数copy(),输入原始图像对象,返回拷贝后的图像对象。
import PIL.Image
def copy(im):
    im_new=PIL.Image.new(im.mode,im.size)//创建与原始图像相同大小的新图像
    width,height=im.size
    for i in range(0,width):
        for j 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("111.jpg")
    copy(im).show()

图片结果显示:
在这里插入图片描述

剪裁函数crop()

剪裁图像的算法可以通过打开原始图像,指定一个四元组的剪裁框,创建一个与剪裁框大小相同的空白图像,然后将旧的图像中剪裁框的像素颜色复制到新图像中。
实例

  • 实现图像剪裁函数crop(),输入原始图像对象,返回裁剪后的图像对象。
import PIL.Image
def crop(im,box):
    x1,y1,x2,y2=box #剪切框定义左上角和右下角坐标位置
    width,height=x2-x1,y2-y1#计算新图像的宽高
    im_new =PIL.Image.new(im.mode,(width,height))
    #使用嵌套循环,把旧图像剪切框内的像素拷贝到新图像
    for i in range(width):
        for j in range(width):
            pix=im.getpixel((x1+i,y1+j))
            im_new.putpixel((i,j),pix)
    return im_new
#测试代码
if __name__=="__main__":
    im=PIL.Image.open("111.jpg")
    box=(123,123,300,300)
    crop(im,box).show()

图像结果显示:
在这里插入图片描述

水平或垂直翻转图像flip()函数

水平或垂直翻转的算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后将旧图像的像素颜色复制到新图像相应的像素中。水平翻转时,原始图像的像素(i,j)映射到目标图像的位置(width-i-1,j);垂直翻转时,原始图像的像素(i,j)映射到目标图像的位置(i,height-j-1)。
实例

  • 实现图像水平或垂直翻转函数flip(),输入原始图像对象,返回水平或垂直翻转后的图像对象。
import PIL.Image
def flip(im,orient="H"):
    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":#水平翻转时
                im_new.putpixel((width-i-1,j),pix)
            else:#垂直翻转时
                im_new.putpixel((i,height-j-1),pix)
    return im_new
#测试代码
if __name__=="__main__":
    im=PIL.Image.open("111.jpg")
    flip(im,orient="H").show()
    flip(im,orient="V").show()

图像结果显示:
在这里插入图片描述

在这里插入图片描述

旋转图像rotate()函数

逆时针或顺时针旋转图像90度的算法可以通过打开原始图像(width X height),创建一个新的height X width大小的空白图像,然后将旧图像中的像素颜色复制到新图像中相应的像素中。逆时针旋转图像90度时,原始图像的像素(i,j)映射到目标图像的位置(j,width-i-1);顺时针旋转图像90度时,原始图像的像素(i,j)映射到目标图像的位置(height-j-1,i)。
实例:

import PIL.Image
def rotate(im,orient="CC"):
    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=="CC":#逆时针旋转
                im_new.putpixel((j,width-i-1),pix)
            else:#顺时针旋转
                im_new.putpixel((height-j-1,i),pix)
    return im_new
#测试代码
if __name__=="__main__":
    im=PIL.Image.open("111.jpg")
    rotate(im,orient="CC").show()
    rotate(im,orient="V").show()

图片结果显示:
在这里插入图片描述

平滑图像过滤器函数smooth()

图像过滤器是原始图像中靠近位置(i,j)的多个像素颜色以某种方式组合运算形成的新的图像对象。
例如,简单的平滑过滤器算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后将新图像中的每个像素(i,j)的颜色设置为原始像素(i,j)及其相邻像素的颜色的平均值。不位于图像边界上像素(i,j)有8个相邻
像素,其相邻像素位于从列i-1到列i+1和行j-1到行j+1范围.故可以通过下列代码计算新图像中像素(i,j)的颜色:原始图像中像素(i,j)和它的邻居像素的颜色的平均值。注意,如果像素位于边缘,在i-1可能小0,故可以使用max(i-1,0)作为下限;同样,可以使用min(i+1, width)作为上限。
实例:
实现平滑图像过滤器函数smooth(),输入原始图像对象,返回平滑过滤后的图像对象。

import PIL.Image
import numpy

def smooth(im):
    width, height = im.size
    im_new = PIL.Image.new(im.mode, im.size)
    for i in range(1, width-1):
        for j in range(1, height-1):
            pix_R = 0; pix_G = 0; pix_B = 0
            for x in range(-1, 2):
                for y in range(-1, 2):
                    pix_R += im.getpixel((i+x, j+y))[0] / 9
                    pix_G += im.getpixel((i+x, j+y))[1] / 9
                    pix_B += im.getpixel((i+x, j+y))[2] / 9
            im_new.putpixel((i, j), (int(pix_R), int(pix_G), int(pix_B)))
    return im_new

if __name__ == '__main__':
    im = PIL.Image.open("111.jpg")
    smooth(im).show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值