Python和Ps之间的恩怨情仇

2020-06-30 17:00 Python职场圈

玩过图像处理软件的都知道,常见的图像处理操作无非就是打开、裁剪、翻转、旋转、分割,分类和特征提取,图像恢复和图像识别等。最强大的就是PS。


然而坊间流传:一通PS猛如虎,不如Python一个库。


Python之所以成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。


让我们看一下用于图像处理任务的一些常用Python库和它们的骚操作。


1

1

1

scikit Image


scikit-image是一个基于numpy数组的开源Python包。 


它实现了用于研究、教育和工业应用的算法和实用程序。 


即使是对于那些刚接触Python的人,它也是一个相当简单的库。 


此库代码质量非常高并已经过同行评审,是由一个活跃的志愿者社区编写的。


可使用“skimage”来导入该库。大多数功能都能在子模块中找到。 


用法举例:图像过滤,模板匹配

import matplotlib.pyplot as plt%matplotlib inlinefrom skimage import data,filtersimage = data.coins()# ... or any other NumPy array!edges = filters.sobel(image)plt.imshow(edges, cmap='gray')



模板匹配(使用match_template函数


1

2

1

Numpy


Numpy是Python编程的核心库之一,支持数组结构。 

图像本质上是包含数据点像素的标准Numpy数组。 

因此,通过使用基本的NumPy操作——例如切片、脱敏和花式索引,可以修改图像的像素值。 

可以使用skimage加载图像并使用matplotlib显示。

用法举例:给金三胖换脸


思想和技术很简单,就是利用numpy来找到需要ps的图片的数组,然后把它抠出来,再把要ps的图片的数组给放进去,就能进行简单的ps了。

在这里,我们需要用到三个库,numpy,cv2和matplotlib(后面会讲)。
import numpy as npimport cv2import matplotlib.pyplot as plt
#我们来ps金三胖同学sanpang = cv2.imread(`./jinzhengen.png)plt.imshow(sanpang)

接着导入需要PS的图:
#导入一个要替换的脸dog = cv2.imread('dog.jpg')plt.imshow(dog[:,:,::-1])

接着我们就开始计算图形的面积:
# 识别到人脸的区域, 需要算法# 算法已经提供好了#用算法计算人脸范围face_zone = face_det.detectMultiScale(sanpang)# 得到一个ndarray,是人脸的区域face_zone

# face_zone的输出array([[182,  62,  61,  61]], dtype=int32)

# 裁切狗脸dog_face = dog[40:180,70:240]

# 压缩狗脸dog_face2 = cv2.resize(dog_face,(61,61))

现在我们就可以把狗脸放进原图片里面:
for x,y,w,h in face_zone:    sanpang[y:y+w,x:x+h] = dog_face2plt.imshow(sanpang[:,:,::-1])

这里我们就能得到经过ps过后的图片了


1

3

1

Scipy



scipy是Python的另一个核心科学模块,就像Numpy一样,可用于基本的图像处理和处理任务。

值得一提的是,子模块scipy.ndimage提供了在n维NumPy数组上运行的函数。 

该软件包目前包括线性和非线性滤波、二进制形态、B样条插值和对象测量等功能。

用法举例:图像旋转


加载原图片

from scipy import ndimage
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# 加载图片
face = mpimg.imread('./face.png')

# 显示图片
plt.imshow(face)
# plt.savefig('./img2-1.png') # 保存要显示的图片
plt.show()

输出

示例

from scipy import ndimage
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# 加载图片
face = mpimg.imread('./face.png')

# 旋转图片
rotate_face = ndimage.rotate(face, 45)

plt.imshow(rotate_face)
# plt.savefig('./img3-1.png') # 保存要显示的图片
plt.show()

输出


用法举例:使用SciPy的高斯滤波器对图像进行模糊处理


from scipy import misc,ndimageface = misc.face()blurred_face = ndimage.gaussian_filter(face, sigma=3)very_blurred = ndimage.gaussian_filter(face, sigma=5)#Resultsplt.imshow(<image to be displayed>)


1

4

1

PIL/Pillow


PIL (Python Imaging Library)是一个免费的Python编程语言库,它增加了对打开、处理和保存许多不同图像文件格式的支持。 

然而,它的发展停滞不前,其最后一次更新还是在2009年。

幸运的是, PIL有一个正处于积极开发阶段的分支Pillow,它非常易于安装。

Pillow能在所有主要操作系统上运行并支持Python 3。

该库包含基本的图像处理功能,包括点操作、使用一组内置卷积内核进行过滤以及颜色空间转换。

用法举例:重合两张图,调整透明度

先上一张效果图:

实现这个效果使用的是PIL中的Blend类
Image.blend(image1,image2,alpha)
⇒image
使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式
合成公式为:out=image1(1.0- alpha)+image2alpha
若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。
1from PIL import Image
2im1 = Image.open("124.jpg")
3im2 = Image.open("123.jpg")
4print(im1.mode,im1.size)
5print(im2.mode,im2.size)
6im = Image.blend(im1, im2, 0.3)
7im.save('k3.jpg')
当然除了上面的方法还可以使用Composite类
Image.composite(image1,image2, mask) ⇒ image
复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸
1from PIL import Image
2im1 = Image.open("124.jpg")
3im2 = Image.open("123.jpg")
4r,g,b = im1.split()
5print(b.mode)
6print(im1.mode,im1.size)
7print(im2.mode,im2.size)
8im = Image.composite(im1,im2,b)
9im.save('k1.jpg')
PIL不仅可以使两张图片进行重合,还可以给图片添加水印。
1from PIL import Image, ImageDraw,ImageFont
2#将原来的图片转换为RGBA模式
3im = Image.open(r"timg2.png").convert('RGBA')
4#新建一个图片,尺寸与上面的尺寸一样,透明度为0即完全透明
5txt=Image.new('RGBA', im.size, (0,0,0,0))
6#设置要写文字的字体
7fnt=ImageFont.truetype("D:PycharmProjectsmusicSIMYOU.TTF", 30)
8#打汉字
9d=ImageDraw.Draw(txt)
10#写要打的位置,内容,用的字体,文字透明度
11d.text((txt.size[0]-205,txt.size[1]-50),"@Ahab杂货铺",font=fnt, fill=(255,0,0,300))
12#两个图片复合
13out=Image.alpha_composite(im, txt)
14#保存加水印后的图片
15out.save(r"KB.png")


可以自己试试。

1

5

1

OpenCV-Python


OpenCV( 开源计算机视觉库,Open Source Computer Vision Library)是计算机视觉应用中使用最广泛的库之一。

OpenCV-Python是OpenCV的python API。

OpenCV-Python不仅速度快(因为后台由用C / C ++编写的代码组成),也易于编码和部署(由于前端的Python包装器)。 

这使其成为执行计算密集型计算机视觉程序的绝佳选择。

用法举例:做直方图

在Python中利用opencv中的calcHist()方法获取其直方图数据,返回的结果是一个列表,使用matplotlib,画出了这两张图的直方图数据图

mport cv2
import numpy
from matplotlib import pyplot


if __name__ == '__main__':
imgobj1 = cv2.imread('pho.jpg')
imgobj2 = cv2.imread('ph1.jpg')
hist1 = cv2.calcHist([imgobj1], [0], None, [256], [0.0, 255.0])
hist2 = cv2.calcHist([imgobj2], [0], None, [256], [0.0, 255.0])
pyplot.plot(range(256), hist1, 'r')
pyplot.plot(range(256), hist2, 'b')
pyplot.show()
cv2.imshow('img1',imgobj1)
cv2.imshow('img2',imgobj2)
cv2.waitKey(0)



1

6

1

Simple Cv


SimpleCV也是用于构建计算机视觉应用程序的开源框架。 

通过它可以访问如OpenCV等高性能的计算机视觉库,而无需首先了解位深度、文件格式或色彩空间等。

学习难度远远小于OpenCV,并且正如他们的标语所说,“ 它使计算机视觉变得简单 ”。

支持SimpleCV的一些观点是:
  • 即使是初学者也可以编写简单的机器视觉测试
  • 摄像机、视频文件、图像和视频流都可以交互操作

用法举例:拍照

在SimpleCV shell中输入下面的指令来测试图像捕获功能,即通过SimpleCV拍照。

SimpleCV:1> cam=Camera() SimpleCV:2> img=cam.getImage() SimpleCV:3> img.show()



第一句指令初始化摄像头,第二句从摄像头获取一帧图像并保存在img变量中,最后一句则将img中保存的图像显示在屏幕上。




1

7

1

Pycairo


Pycairo是图形库cairo的一组python绑定。 

Cairo是一个用于绘制矢量图形的2D图形库。 

矢量图形很有趣,因为它们在调整大小或进行变换时不会降低清晰度。

Pycairo库可以从Python调用cairo命令。

用法举例:绘制线条、基本形状和径向渐变




1

8

1

pgmagick


pgmagick是GraphicsMagick库基于Python的包装器。

GraphicsMagick 图像处理系统有时被称为图像处理的瑞士军刀。

它提供了强大而高效的工具和库集合,支持超过88种主要格式图像的读取、写入和操作,包括DPX,GIF,JPEG,JPEG-2000,PNG,PDF,PNM和TIFF等重要格式。

用法举例:图片缩放、边缘提取


图片缩放


提取边缘


以上就是一些免费的优秀图像处理Python库。

有些很知名,你可能已经知道或者用过,有些可能对你来说还是新的。那正好现在就上手操作一下,试一试吧!



本文章转载自公众号:Mouse_pro

首页 - Python 相关的更多文章: