导入 numpy 、pil
numpy用来做矩阵运算,pil用来读取图片。
1
2
|
import numpy as np from pil import image |
读取图片,然后转换成rgb模式存在矩阵里
1
2
|
im = image. open (imagename).convert( 'rgb' ) arr = np.array(im) |
查看arr的shape,可以看到arr是个3维的数组,数组大小等于 长*宽*3
1
2
|
in [ 566 ]: arr.shape out[ 566 ]: ( 313 , 450 , 3 ) |
每个像素有3个数字表示,分别对应(r,g,b)
1
2
|
in [ 567 ]: arr[ 0 ][ 0 ] out[ 567 ]: array([ 6 , 4 , 9 ], dtype = uint8) |
原始图片
彩色转黑白
把像素的r,g,b三个通道数值都置为r*0.299+g*0.587+b*0.114
1
2
3
4
5
6
|
def blackwithe(imagename): # r,g,b = r*0.299+g*0.587+b*0.114 im = np.asarray(image. open (imagename).convert( 'rgb' )) trans = np.array([[ 0.299 , 0.587 , 0.114 ],[ 0.299 , 0.587 , 0.114 ],[ 0.299 , 0.587 , 0.114 ]]).transpose() im = np.dot(im,trans) return image.fromarray(np.array(im).astype( 'uint8' )) |
流年
把r通道的数值开平方,然后乘以一个参数
1
2
3
4
5
6
|
def fleeting(imagename,params = 12 ): im = np.asarray(image. open (imagename).convert( 'rgb' )) im1 = np.sqrt(im * [ 1.0 , 0.0 , 0.0 ]) * params im2 = im * [ 0.0 , 1.0 , 1.0 ] im = im1 + im2 return image.fromarray(np.array(im).astype( 'uint8' )) |
旧电影
把像素的r,g,b三个通道数值,3个通道的分别乘以3个参数后求和,最后把超过255的值置为255
1
2
3
4
5
6
7
|
def oldfilm(imagename): im = np.asarray(image. open (imagename).convert( 'rgb' )) # r=r*0.393+g*0.769+b*0.189 g=r*0.349+g*0.686+b*0.168 b=r*0.272+g*0.534b*0.131 trans = np.array([[ 0.393 , 0.769 , 0.189 ],[ 0.349 , 0.686 , 0.168 ],[ 0.272 , 0.534 , 0.131 ]]).transpose() # clip 超过255的颜色置为255 im = np.dot(im,trans).clip( max = 255 ) return image.fromarray(np.array(im).astype( 'uint8' )) |
反色
这个最简单了,用255减去每个通道的原来的数值
1
2
3
|
def reverse(imagename): im = 255 - np.asarray(image. open (imagename).convert( 'rgb' )) return image.fromarray(np.array(im).astype( 'uint8' )) |
ps:示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
from pil import image, imagefilter # 打开一个jpg图像文件,注意是当前路径: im = image. open ( 'penguins.jpg' ) # 模糊 im2 = im. filter (imagefilter.blur) # 模糊可设置模糊的程度 im22 = im. filter (imagefilter.boxblur( 200 )) # 轮廓滤波 im3 = im. filter (imagefilter.contour) # 边缘增强滤波(锐化) im4 = im. filter (imagefilter.edge_enhance) # 浮雕滤波 im5 = im. filter (imagefilter.emboss) # 寻找边缘信息的滤波 im6 = im. filter (imagefilter.find_edges) im2.save( 'blur.jpg' , 'jpeg' ) im3.save( 'contour.jpg' , 'jpeg' ) im4.save( 'edge_enhance.jpg' , 'jpeg' ) im5.save( 'emboss.jpg' , 'jpeg' ) im6.save( 'find_edges.jpg' , 'jpeg' ) im22.save( 'boxblur(200).jpg' , 'jpeg' ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u010950854/article/details/72794168