Python使用嵌套循环实现图像处理算法
- 推荐自己的专栏:分享一些Python案例,将所学用出来
- 使用Python第三方图像处理库Pillow处理图像时,通常是调用模块中提供的函数和对象来处理图像的基本处理
图像的数据结构基础
一:在“底层”图像是由像素点组成的二维数,每个像素点的位置表示为两个整数的元组
二:像素的值根据图像模式由对应的元组组成(例如,RGB模式表示为三个整数值组成的元组,分别表示构成颜色的红、绿、蓝的值,范围从0到255)
PIL.Image模块中的Image类的方法:
- getpixel(loc) 返回位于位置loc的像素的颜色
- putpixel(loc, pix) 把位于位置loc的颜色替换为pix
拷贝图像
拷贝图像的算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后将旧图像中的像素颜色复制到新图像相应的像素中。
即使用嵌套循环,把旧图像位置 (i, j) 的像素复制到新图像的位置 (i, j)
我的电脑,D:\zgh\picture
这个路径下有一个图片zgh.png
import PIL.Imagedef copy(im):im_new = PIL.Image.new(im.mode, im.size)width, height = im.sizefor i in range(0, width):for j in range(0, height):pix = im.getpixel((i, j))im_new.putpixel((i, j), pix)return im_newif __name__ == '__main__':im = PIL.Image.open("D:\zgh\picture\zgh.png")copy(im).show()
运行之后,会出现一个图像文件,显示的图像与上图一样
- im.size返回包含图像宽度和高度的元组,单位为像素
- im.mode返回包含图像模式的字符串(RGB、CYMK、Grayscale…)
剪裁图像
剪裁图像的算法可以通过打开原始图像,指定一个四元组的剪裁框,创建一个与剪裁框大小相同的空白图像,然后将旧图像中剪裁框内的像素颜色复制到新图像中。同样可以实用嵌套循环实现像素复制
原图像:
其分辨率为959 × 959
import PIL.Imagedef crop(im, box):x1, y1, x2, y2 = boxwidth, height = x2-x1, y2-y1im_new = PIL.Image.new(im.mode, (width, height))for i in range(0, width):for j in range(0, height):pix = im.getpixel((x1+i, y1+j))im_new.putpixel((i, j), pix)return im_newif __name__ == '__main__':box = (400, 400, 800, 800)im = PIL.Image.open("D:\zgh\picture\zgh.png")crop(im, box).show()
我图像对图像的剪裁框,左上角坐标为(400, 400),右下角为(800, 800)
box = (400, 400, 800, 800)
运行后,显示剪裁图像:
水平或垂直翻转图像
水平或垂直翻转的算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后讲旧图像复制到新图像对应的像素中
- 水平翻转时:原始图像的的像素(i, j)映射到目标图像的位置(width-i-1, j)
- 垂直翻转时:原始图像的的像素(i, j)映射到目标图像的位置(i, height-j-1)
原图像:
import PIL.Imagedef flip(im, orient='H'):width, height = im.sizeim_new = PIL.Image.new(im.mode, im.size)for i in range(0, width):for j in range(0, height):pix = im.getpixel((i, j))if orient == 'H':im_new.putpixel((width-1-i, j), pix)else:im_new.putpixel((i, height-1-j), pix)return im_newif __name__ == '__main__':im = PIL.Image.open("D:\zgh\picture\zgh.png")flip(im, 'H').show()flip(im, 'V').show()
语义化的取名:
- H 即horizon,水平线
- V 即vertical,垂直线
水平翻转:
垂直翻转:
逆时针或顺时针旋转图像90度
逆时针或顺时针旋转图像90度的算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后讲旧图像复制到新图像对应的像素中
- 逆时针旋转图像90度:原始图像的的像素(i, j)映射到目标图像的位置(j, width-i-1)
- 顺时针旋转图像90度:原始图像的的像素(i, j)映射到目标图像的位置(height-j-1, i)
原图像:
import PIL.Imagedef rotate(im, orient='CCW'):width, height = im.sizeim_new = PIL.Image.new(im.mode, im.size)for i in range(0, width):for j in range(0, height):pix = im.getpixel((i, j))if orient == 'CCW':im_new.putpixel((j, width-1-i), pix)else:im_new.putpixel((height-1-j, i), pix)return im_newif __name__ == '__main__':im = PIL.Image.open("D:\zgh\picture\zgh.png")rotate(im, 'CCW').show()rotate(im, 'CW').show()
语义化的取名:
- CCW,即Counter clockwise rotation逆时针旋转
- CW,即Clockwise rotation顺时针旋转
逆时针旋转图像90度:
顺时针旋转图像90度:
平滑图像过滤器
图像过滤器是原始图像中靠近位置(i, j)的多个像素颜色以某种方式组合运算形成新的图像对象
例如,简单的平滑过滤器算法可以通过打开原始图像,创建一个新的大小相同的空白图像,然后将新图像中的每个像素(i, j)的颜色设置为原始像素(i, j)及其相邻像素的颜色的平均值。
- 不位于图像边界上像素(i, j)有8个相邻像素,其相邻像素位于从列 i-1 到 列 i+1,和行 j-1 到 行 j+1 范围
- 位于图像边界上像素(i, j)
需要特殊处理,我偷个懒,因为边界上的点相对于图像占比特别小,我就让边界点上的像素不变了
原图像:
代码一(跟个傻憨憨一样,写的繁琐,且容易出错):
import PIL.Imagedef smooth(im):width, height = im.sizeim_new = PIL.Image.new(im.mode, im.size)for i in range(0, width):for j in range(0, height):if i > 0 and i < width-1 and j > 0 and j < height-1:pix_R = int((im.getpixel((i, j))[0] + im.getpixel((i-1, j))[0] + im.getpixel((i+1, j))[0] + im.getpixel((i, j-1))[0] + im.getpixel((i, j+1))[0] + im.getpixel((i-1, j-1))[0] + im.getpixel((i-1, j+1))[0] + im.getpixel((i+1, j-1))[0] + im.getpixel((i+1, j+1))[0]) / 9)pix_G = int((im.getpixel((i, j))[1] + im.getpixel((i-1, j))[1] + im.getpixel((i+1, j))[1] + im.getpixel((i, j-1))[1] + im.getpixel((i, j+1))[1] + im.getpixel((i-1, j-1))[1] + im.getpixel((i-1, j+1))[1] + im.getpixel((i+1, j-1))[1] + im.getpixel((i+1, j+1))[1]) / 9)pix_B = int((im.getpixel((i, j))[2] + im.getpixel((i-1, j))[2] + im.getpixel((i+1, j))[2] + im.getpixel((i, j-1))[2] + im.getpixel((i, j+1))[2] + im.getpixel((i-1, j-1))[2] + im.getpixel((i-1, j+1))[2] + im.getpixel((i+1, j-1))[2] + im.getpixel((i+1, j+1))[2]) / 9)pix = (pix_R, pix_G, pix_B)else:pix = im.getpixel((i, j))im_new.putpixel((i, j), pix)return im_newif __name__ == '__main__':im = PIL.Image.open("D:\zgh\picture\zgh.png")smooth(im).show()
代码二(代码简洁明了):
import PIL.Image
import numpydef smooth(im):width, height = im.sizeim_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 = 0for x in range(-1, 2):for y in range(-1, 2):pix_R += im.getpixel((i+x, j+y))[0] / 9pix_G += im.getpixel((i+x, j+y))[1] / 9pix_B += im.getpixel((i+x, j+y))[2] / 9im_new.putpixel((i, j), (int(pix_R), int(pix_G), int(pix_B)))return im_newif __name__ == '__main__':im = PIL.Image.open("D:\zgh\picture\zgh.png")smooth(im).show()
可惜水平有限,我写的平滑图像处理器的代码性能不高,运行需要一定时间,我的电脑至少需要15秒
平滑图像过滤后:
个人感觉没啥子变化…
Python使用嵌套循环实现图像处理算法相关推荐
- 图像处理算法工程师——1必备技能总结——2面试题大全
图像算法工程师三重境界 : 一.传统图像算法工程师: 主要涉及图形处理,包括形态学.图像质量.相机成像之3A算法.去雾处理.颜色空间转换.滤镜等,主要在安防公司或者机器视觉领域,包括缺陷检测: 二. ...
- 一文概括常用图像处理算法
本文总结了11种常用的图像处理算法,包含了预处理算法以及检测算法,并介绍了一些常用的开发库. 一.算法(预处理算法.检测算法) 在采集完图像后,首先会对图像进行预处理操作.保证图像的对比度清晰,水平. ...
- 基于Python+Open CV的手势识别算法设计
素材资料下载: 基于Python+OpenCV的手势识别算法设计源代码材料-机器学习文档类资源-CSDN下载采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库( ...
- python进行基本的图像处理
转自 http://www.ituring.com.cn/tupubarticle/2024 第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Py ...
- 图像处理算法工程师——必备技能总结及面试题大全
版权声明:转载本博客文章,请附上链接,否则违版必究. https://blog.csdn.net/weixin_42346564/article/details/83894235 </div&g ...
- Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战
上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...
- 1数字图像获取:1.3图像处理算法的形式
图像处理算法就是利用数学原理与计算机程序对数字图像进行处理的基础. 局部处理的例子:对一幅图像采用3x3模板进行卷积运算,用3x3的模板在该图像上进行扫描式的平移,每一个像素的卷积计算值是由并仅由 ...
- 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...
- 【python】一次移动平均算法
python实现一次移动平均算法 python实现一次移动平均,代码如下,可直接运行: import pandas as pd #导入数据分析包并命名为pd import itertools impo ...
最新文章
- CPU 内部结构解析
- Sql Server实用操作-无数据库日志文件恢复数据库两种方法
- Spring4 MVC Hibernate4集成
- Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
- Flume日志采集,avro采集,以及通过参数控制下沉到hdfs的文件大小,时间等控制
- BFS HDOJ 1242 Rescue
- linux打开另一台linux的图形化,【工具大道】ssh登录Linux服务器,并显示图形化界面...
- MySQL5.7安装教程(windows .zip)
- 解决:win10在空白处右键资源管理器重启的故障
- windows10 + centos7 双系统
- java完全自学手册 pdf_fortran教程下载
- 广数25i系统倒刀回刀m代码_广数系统指令
- Car Net全文翻译
- 零基础学IT选择软件测试有前途吗?
- 一种基于波状扩散特征分析的光斑检测方法
- 查询电脑ip地址方法
- Python selenium模块对网页进行截屏保存图片 easyocr模块识别提取图片文字
- Google Adsense api 推荐介绍 ~!没有网站照样赚钱!
- 网页设计配色应用实例剖析——橙色系
- 找出10000以内的自然数中的所有完数,并统计找到的完数个数。所谓完数个数,指它恰好等于除它本身之外的因子之和