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

  • 案例目的

本案例的是通过图像处理算法案例,深入了解Python数据结构和基本算法流程。

  • 案例内容

在科学计算和各种算法中,经常需要使用嵌套循环来处理数据。例如,图像在计算机中是由像素点组成的二维数组,每个像素点的位置被表示为两个整数的元组,像素的值根据图像模式由对应的元组组成(例如RGB模式表示为三个整数值组成的元组,分别表示构成颜色的红蓝绿的值,范围为0~255)

图像处理(例如复制,旋转裁剪和平滑图像等的算法,根本上就是用嵌套循环模式对这些像素进行处理。)

本章案例研究使用Python第三方图像处理库Pillow中PIL.Image模块的的Image类的方法getpixel()和putpixel()来读取和修改特定位置location处的像素的颜色pix,然后使用嵌套循环实现图像处理的基本算法。

  • 实验环境

Pycharm、Anaconda

  • 案例研究

3.1 图像复制前后对比

主要代码:

  1. 作者:JohnRothan  
  2. 时间:2022-3-15  
  3. 题目信息:图像复制  
  4.   
  5. import PIL.Image  
  6.   
  7. 复制图像并与原图像对比  
  8. def copy(im):  
  9.     width, height = im.size  
  10.     im_new = PIL.Image.new(im.mode, im.size) #创建与原始图像相同模式和大小的新图像对象  
  11.     res = PIL.Image.new(im.mode, (2*width, height)) #创建与原始图像相同模式和2倍大小的新图像对象  
  12.   
  13.     #使用嵌套循环,把旧图像位置(ij)的像素复制到新图像的位置(i, j)  
  14.     for i in range(0, width) :  
  15.         for j in range(0, height):  
  16.             pix = im.getpixel((i,j))  
  17.             im_new.putpixel((i,j), pix)  
  18.       
  19.     #复制前后的图像对比  
  20.     res.paste(im, (0, 0, width, height))  
  21.     res.paste(im_new, (width, 0, 2*width, height))  
  22.     return res  
  23.   
  24. im = PIL.Image.open("C:\\Users\\JohnRothan\\Desktop\\log.png")  
  25. copy(im).show () 

测试结果:

1 图像复制前后对比  

3.2 扣取特定位置图像

主要代码:

  1. 作者:JohnRothan  
  2. 时间:2022-3-15  
  3. 题目信息:图像扣取  
  4.   
  5. import PIL.Image  
  6. def crop(im, box):  
  7.     #剪切框定义左上角和右下角坐标位置  
  8.     x1, y1, x2, y2 = box  
  9.     #计算新图像的宽度width和高度height,并创建新图像  
  10.     width, height = x2-x1, y2-y1  
  11.     im_new = PIL.Image.new(im.mode, (width,height))  
  12.     #使用嵌套循环,把旧图像剪切框内的像素拷贝到新图像  
  13.     for i in range(width):  
  14.         for j in range(height):  
  15.             pix = im.getpixel((x1+i, y1+j))  
  16.             im_new.putpixel((i,j), pix)  
  17.     return im_new  
  18. #测试代码  
  19. im = PIL.Image.open("C:\\Users\\JohnRothan\\Desktop\\dog.jpg")  
  20. print(im.size)  
  21. crop(im, (1600,1700,2100,2100)).show()   

测试结果:

2 图像扣取

3.3 平滑图像过滤器

主要代码:

  1. 作者:JohnRothan  
  2. 时间:2022-3-15  
  3. 题目信息:图像平滑处理  
  4.   
  5. import PIL.Image  
  6.   
  7. def crop(im, box):  
  8.     #剪切框定义左上角和右下角坐标位置  
  9.     x1, y1, x2, y2 = box  
  10.     #计算新图像的宽度width和高度height,并创建新图像  
  11.     width, height = x2-x1, y2-y1  
  12.     im_new = PIL.Image.new(im.mode, (width,height))  
  13.     #使用嵌套循环,把旧图像剪切框内的像素拷贝到新图像  
  14.     for i in range(width):  
  15.         for j in range(height):  
  16.             pix = im.getpixel((x1+i, y1+j))  
  17.             im_new.putpixel((i,j), pix)  
  18.     return im_new  
  19. #测试代码  
  20.   
  21.   
  22. def smooth(im):  
  23.     """返回考贝后的图像对象"""  
  24.     #创建与原始图像相同模式和大小的新图像对象  
  25.     im_new = PIL.Image.new(im.mode, im.size)  
  26.     width, height = im.size  
  27.     #使用嵌套循环,进行图像平滑处理
  28.     for i in range(0, width-1):  
  29.         for j in range(0, height-1):  
  30.             r1, g1, b1 = im.getpixel((i, j))  
  31.             r2, g2, b2 = im.getpixel((i + 1, j + 1))  
  32.             rgb = (int((r1+r2)/2), int((g1+g2)/2), int((b1+b2)/2))  
  33.             im_new.putpixel((i, j), rgb)  
  34.     return im_new  
  35.   
  36. #测试代码  
  37. im = PIL.Image.open("C:\\Users\\JohnRothan\\Desktop\\dog.jpg"
  38. # 首先扣取图像 
  39. crop(im, (1700,1700,1900,1900)).show()  
  40. # 进行平滑处理
  41. smooth(crop(im, (1700,1700,1900,1900))).show()  

测试结果:

3 图像平滑处理

3.4 图像镜像翻转(水平)

主要代码:

  1. 作者:JohnRothan  
  2. 时间:2022-3-15  
  3. 题目信息:图像翻转  
  4.   
  5. import PIL.Image  
  6. def flip(im, orient="H"):  
  7.     """返回水平或垂直翻转后的图像对象"""  
  8.     #获取图像的宽度width和高度height,并创建新图像  
  9.     width, height = im.size  
  10.     im_new = PIL.Image.new(im.mode, im.size)  
  11.     #使用嵌套循环,把旧图像的像素拷贝到新图像对应位置  
  12.     for i in range(width):  
  13.         for j in range(height):  
  14.             pix = im.getpixel ((i, j))  
  15.             if orient == "H":#水平翻转时  
  16.             #原始图像的像素(i,j)映射到目标图像的位置(width-i-1j)  
  17.                 im_new.putpixel((width-i-1, j), pix)  
  18.             else#垂直翻转时  
  19.             #原始图像的像素(i,j)映射到目标图像的位置(i, height-j-1)  
  20.                 im_new.putpixel((i, height-j-1), pix)  
  21.     return im_new  
  22.   
  23.   
  24. #测试代码  
  25. im = PIL.Image.open("C:\\Users\\JohnRothan\\Desktop\\log.png")  
  26. im.show()  
  27. flip(im, orient="H").show() 

测试结果:

4 水平翻转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈士奇谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值