Python常用图像处理

本文我来简单讲述了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)

好了,看一下效果图。

猜你喜欢

转载自blog.csdn.net/ljx1400052550/article/details/114448448