文章目录
- getpixel()和putpixel()方法
- 拷贝图像函数copy()
- 剪裁函数crop()
- 水平或垂直翻转图像flip()函数
- 旋转图像rotate()函数
- 平滑图像过滤器函数smooth()
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()