本文我来简单讲述了Python图像处理之图像的缩放,旋转,翻转,图像手绘等实现方法。具体如下:图像的几何变换,如缩放、旋转、翻转、图像手绘等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍。
环境搭建
在讲解这些前,我们先简单安装一下环境,主要是使用Python的PIL库,下载地址
Python Imaging Library (PIL)
,这里只需要pip安装即可。
pip安装
pip install pillow
好了,安装完毕,就是使用了,使用非常简单。
使用
先导入包
from PIL import Image
导包完毕后,就可以简单的开发了,在详细简介前,可以简单的看一个小的使用列子。读入图像后,获得像素RGB值,修改后保存为新的文件。如下代码:
from PIL import Image
import numpy as np
import cv2
a = np.array(Image.open('test.jpg'))
imgold=cv2.imread("test.jpg")
b = [255,255,255] - a
im = Image.fromarray(b.astype('uint8'))
im.save('new.jpg')
img=cv2.imread("new.jpg")
#获取输出的检测图片
cv2.imshow('ImgOld', imgold)
cv2.imshow('SmileNew', img)
c = cv2.waitKey(0)
好了,看一下效果图。
好了,基本的用法讲完了,我们在详细讲解一下图像的几何变换,如缩放、旋转、翻转、图像手绘等。
常见用法
下面依次讲解
图像的几何变换,如缩放、旋转、翻转、图像手绘。
1.图像的缩放
图像的缩放使用
resize()
成员函数,直接在入参中指定缩放后的尺寸即可。
##图片的缩放
def testScal():
# -*- coding: UTF-8 -*-
from PIL import Image
# 读取图像
im = Image.open("test.jpg")
im.show()
# 原图像缩放为128x128
im_resized = im.resize((128, 128))
im_resized.show()
看一下缩放前后的效果图
在看看缩放后的图:
2.图像的旋转
图像的旋转使用成员函数
rotate()
,在入参中直接指定按逆时针旋转的角度即可:
##图片的旋转
def testRotate():
# -*- coding: UTF-8 -*-
from PIL import Image
# 读取图像
im = Image.open("test.jpg")
im.show()
# 指定逆时针旋转的角度
im_rotate = im.rotate(45)
im_rotate.show()
3.
图像的翻转
图像的翻转使用
transpose()
成员函数,直接在入参中指定变换方式即可,不仅支持上下、左右翻转;也支持逆时针90、180、270等角度的旋转,效果与
rotate()
相同。
def testTranspose():
# 读取图像
im = Image.open("test.jpg")
out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
out.show()
4.图像手绘
手绘效果的几个特征:
- 黑白灰色
- 边界线条较重
- 相同或相近色彩趋于白色
- 略有光源效果
好了,直接上代码吧。
#图像的手绘
def testRonaldo():
from PIL import Image
import numpy as np
a = np.asarray(Image.open('test.jpg').convert('L')).astype('float')
depth = 10. # (0-100)
grad = np.gradient(a) # 取图像灰度的梯度值
grad_x, grad_y = grad # 分别取横纵图像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
vec_el = np.pi / 2.2 # 光源的俯视角度,弧度值
vec_az = np.pi / 4. # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az) # 光源对x 轴的影响
dy = np.cos(vec_el) * np.sin(vec_az) # 光源对y 轴的影响
dz = np.sin(vec_el) # 光源对z 轴的影响
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源归一化
b = b.clip(0, 255)
imgold = cv2.imread("test.jpg")
cv2.imshow('RonaldoOld',imgold)
im = Image.fromarray(b.astype('uint8')) # 重构图像
im.save('Ronaldo.jpg')
img = cv2.imread("Ronaldo.jpg")
# 获取输出的检测图片
cv2.imshow('RonaldoNew',img)
c = cv2.waitKey(0)
好了,看一下效果图。