欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

Python实用模块(八)imutils

实用模块 迷途小书童 4年前 (2019-12-03) 14472次浏览

软硬件环境

  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • imutils 0.5.2

imutils简介

imutilsAdrian Rosebrock开发的一个python工具包,它整合了opencvnumpymatplotlib的相关操作,主要是用来进行图形图像的处理,如图像的平移、旋转、缩放、骨架提取、显示等等,后期又加入了针对视频的处理,如摄像头、本地文件等。imutils同时支持python2python3

安装imutils

pip install imutils

如果需要查看源码的话,可以通过命令pip download imutils来下载

图片处理

图片的平移

图片的平移是指将图片在X轴或Y轴上移动。opencv中也提供了图片平移的实现,首先需要根据XY轴上的变化构建一个平移矩阵M,如下

translated

然后调用cv2.warpAffine()实现平移。imutils封装了opencv中的平移操作。

import cv2
import imutils

image = cv2.imread('dj.jpeg')
translated = imutils.translate(image, 25, -75)
cv2.imwrite('translated.jpg', translated)

translated

图片的旋转

方法是imutils.rotate(),跟2个参数,第一个是图片数据,第二个是旋转的角度,旋转是朝逆时针方向。同时imutils还提供了另一个相似的方法, rotate_round(),它就是按顺时针旋转的。

import cv2
import imutils

image = cv2.imread('dj.jpeg')
rotated = imutils.rotate(image, 90)                                             
cv2.imwrite('rotated_90.jpg', rotated)                                          

rotated_round = imutils.rotate_bound(image, 90)                                 
cv2.imwrite('rotated_90_round.jpg', rotated_round)

rotated

图片的缩放

对图片的缩放,imutils是会保持原有图片的宽高比的, 函数是imutils.resize(),方法中可以指定宽度width=或者height=,两者取其一就可以了。

import cv2
import imutils

image = cv2.imread('dj.jpeg')
resized = imutils.resize(image, width=200)                                      
cv2.imwrite('resized_width_200.jpg', resized)                                          

resized

骨架提取

Skeletonization,骨架提取,是指对图片中的物体进行拓扑骨架(topological skeleton)构建的过程。imutils提供的方法是skeletonize(),第二个参数是结构参数的尺寸(structuring element),相当于是一个粒度,越小需要处理的时间越长。

import cv2
import imutils

image = cv2.imread('dj.jpeg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)                                  

skeleton = imutils.skeletonize(gray, size=(3, 3))                               
cv2.imwrite('skeleton.jpg', skeleton)

skeleton

使用matplotlib显示

opencv中,图形是表示成numpy数组的,且是BGR的序列,显示的话使用cv2.imshow就可以了,但是在matplotlib中,需要的是RGB序列。解决方法有两种:

  • 使用cv2.cvtColor进行转换
  • 使用imutils.opencv2matplotlib进行转换
import imutils
import cv2
import matplotlib.pyplot as plt

image = cv2.imread('dj.jpeg')
plt.figure('Incorrect')                                                     
plt.imshow(imutils.opencv2matplotlib(image))                                
plt.show() 

skeleton

视频处理

这里以摄像头数据处理为例,本地视频文件的处理就是打开方式不同而已。


from threading import Thread
import cv2

class WebcamVideoStream:
    def __init__(self, src=0, name="WebcamVideoStream"):
        '''
        类WebcamVideoStream的构造函数,通过指定src参数打开特定的摄像头,并读取第一帧的数据
        '''

        self.stream = cv2.VideoCapture(src)
        (self.grabbed, self.frame) = self.stream.read()

        # 线程名
        self.name = name

        # 线程是否结束的标志
        self.stopped = False

    def start(self):
        # 启动读取视频帧的线程
        t = Thread(target=self.update, name=self.name, args=())
        t.daemon = True
        t.start()
        return self

    def update(self):

        while True:

            if self.stopped:
                return

            # 读取下一帧数据
            (self.grabbed, self.frame) = self.stream.read()

    def read(self):

        # 返回当前读取的视频帧
        return self.frame

    def stop(self):

        # 停止线程
        self.stopped = True

代码实现比较简单,相信都看得懂,这里不再解释;视频处理还有个重要的参数fps, 即每秒钟处理的帧数,imutils采用了最简单的实现方法,总平均帧数法即总的帧数除以所花费的时间。


import datetime

class FPS:
    def __init__(self):
        # 构造函数
        self._start = None
        self._end = None
        self._numFrames = 0

    def start(self):
        # 开始时间
        self._start = datetime.datetime.now()
        return self

    def stop(self):
        # 结束时间
        self._end = datetime.datetime.now()

    def update(self):
        # 统计帧数
        self._numFrames += 1

    def elapsed(self):
        # 计算消耗的时间,单位为秒
        return (self._end - self._start).total_seconds()

    def fps(self):

        return self._numFrames / self.elapsed()

一点补充

大神Adrian Rosebrock自己维护了一个个人博客网站,地址是 https://www.pyimagesearch.com, 不定期放出计算机视觉及人工智能相关的教程,解释详尽,图文并茂,更赞的是还附带全部源码,非常值得经常去逛逛。

参考资料

  1. https://github.com/jrosebr1/imutils
  2. https://en.wikipedia.org/wiki/Structuring_element
  3. https://blog.csdn.net/u012494876/article/details/53368164
喜欢 (0)