• 本系列python版本:python3.5.4 本系列opencv-python版本:opencv-python3.4.2.17 本系列使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:...

    本系列python版本:python3.5.4
    本系列opencv-python版本:opencv-python3.4.2.17
    本系列使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:windows上jupyter notebook主题背景、字体及扩展插件配置(集成vim环境)

    本文我们将一起学习使用opencv-python对数字图像进行简单的处理,快速理解数字图像的原理,主要介绍opencv-python的安装;如何读取、展示和存储图像以及对于数字图像的基本操作和理解

    先展示一张程序运行截图:
    在这里插入图片描述


    一、opencv-python简介与安装


    opencv 是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等。本教程所有示例基于opencv-python,使用python语言对数字图像进行处理和研究。

    首先我们需要安装一下环境
    1、 python3
    2、 numpy
    3、 opencv-python

    安装python3: 廖雪峰python教程有详细的说明,网址安装python
    安装numpy: pip install numpy
    安装opencv-python: pip install opencv-python

    安装完opencv-python后命令行打开python交互式环境:import cv2 成功,便说明成功安装了opencv-python



    二、opencv-python读取、展示和存储图像


    1、imread函数

    imread函数读取数字图像,先看一下官网对于该函数的定义

    cv2.imread(path_of_image, intflag)
    

    函数参数一: 需要读入图像的完整的路径
    函数参数二: 标志以什么形式读入图像,可以选择一下方式:
    · cv2.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都将被忽略。它是默认标志
    · cv2.IMREAD_GRAYSCALE: 以灰度模式加载图像
    · cv2.IMREAD_UNCHANGED: 保留读取图片原有的颜色通道

    · 1 : 等同于cv2.IMREAD_COLOR
    · 0 : 等同于cv2.IMREAD_GRAYSCALE
    · -1 : 等同于cv2.IMREAD_UNCHANGED

    来个示例更清楚:

    import numpy as np
    import cv2
    
    gray_img = cv2.imread('img/cartoon.jpg', 0)  #加载灰度图像
    rgb_img = cv2.imread('img/cartoon.jpg', 1)   #加载RGB彩色图像
    

    2、imshow函数

    imshow函数作用是在窗口中显示图像,窗口自动适合于图像大小,我们也可以通过imutils模块调整显示图像的窗口的大小。函数官方定义如下:

    cv2.imshow(windows_name, image)
    

    函数参数一: 窗口名称(字符串)
    函数参数二: 图像对象,类型是numpy中的ndarray类型,注:这里可以通过imutils模块改变图像显示大小,下面示例展示

    上示例:

    cv2.imshow('origin image', rgb_img)   #显示原图
    cv2.imshow('origin image', imutils.resize(rgb_img, 800))  #利用imutils模块调整显示图像大小
    cv2.imshow('gray image', imutils.resize(gray_img, 800))
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    

    3、imwrite函数

    imwrite函数检图像保存到本地,官方定义:

    cv2.imwrite(image_filename, image)
    

    函数参数一: 保存的图像名称(字符串)
    函数参数二: 图像对象,类型是numpy中的ndarray类型

    cv2.imwrite('rgb_img.jpg', rgb_img)   #将图像保存成jpg文件
    cv2.imwrite('gray_img.png', gray_img) #将图像保存成png文件
    

    4、窗口销毁函数

    当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个:
    (1)、cv2.destroyWindow(windows_name) #销毁单个特定窗口,参数: 将要销毁的窗口的名字
    (2)、cv2.destroyAllWindows() #销毁全部窗口,无参数

    那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:
    (1) 让窗口停留一段时间然后自动销毁;
    (2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口
    以上两种情况都将使用cv2.waitKey函数, 首先产看函数定义:

    cv2.waitKey(time_of_milliseconds)
    

    唯一参数 time_of_milliseconds是整数,可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况

    (1) time_of_milliseconds > 0 : 此时time_of_milliseconds表示时间,单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁,看以下示例

    #表示等待10秒后,将销毁所有图像
    if cv2.waitKey(10000):
        cv2.destroyAllWindows()
    
    #表示等待10秒,将销毁窗口名称为'origin image'的图像窗口
    if cv2.waitKey(10000):
        cv2.destroyWindow('origin image')
    

    (2) time_of_milliseconds <= 0 : 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁。我们可以自定义等待敲击的键盘,通过下面的例子进行更好的解释

    #当指定waitKey(0) == 27时当敲击键盘 Esc 时便销毁所有窗口
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    
    #当接收到键盘敲击A时,便销毁名称为'origin image'的图像窗口
    if cv2.waitKey(-1) == ord('A'):
        cv2.destroyWindow('origin image')
    

    下面给出一个完整读取、展示、保存和图像销毁示例:

    import cv2
    import imutils
    import numpy as np
    
    rgb_img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/cartoon.jpg')
    gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('origin image', imutils.resize(rgb_img, 800))
    cv2.imshow('gray image', imutils.resize(gray_img, 800))
    cv2.imwrite('rgb_img.jpg', rgb_img)
    cv2.imwrite('gray_img.png', gray_img)
    
    #等待一定时间自动销毁图像窗口
    #if cv2.waitKey(10000):
    #    cv2.destroyAllWindows()
    #if cv2.waitKey(10000):
    #    cv2.destroyWindow('origin image')
    
    #接收特定键盘销毁图像窗口
    #if cv2.waitKey(-1) == ord('A'):
    #    cv2.destroyWindow('origin image')
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    

    原图展示在本文开头展示,灰度图像如下所示:

    在这里插入图片描述



    三、图像色彩空间变换函数cv2.cvtColor


    本节将图像色彩空间变换函数单独拉出来说,原因:

    1、该函数十分常用; 2、应明白为什么需要做图像色彩空间的处理

    首先展示一下图像色彩空间变换函数定义:

    cv2.cvtColor(input_image, flag)
    

    参数一: input_image表示将要变换色彩的图像ndarray对象
    参数二: 表示图像色彩空间变换的类型,以下介绍常用的两种:
    · cv2.COLOR_BGR2GRAY: 表示将图像从BGR空间转化成灰度图,最常用
    · cv2.COLOR_BGR2HSV: 表示将图像从RGB空间转换到HSV空间

    如果想查看参数flag的全部类型,请执行以下程序便可查阅,总共有274种空间转换类型:

    import cv2
    flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
    print(flags)
    

    在之后的图像特征提取和识别学习中,我们经常使用的是将彩色图像转化成灰度图像, 这里解释一下为什么我么总是对灰度图进行处理,增强对以后图像处理操作的理解

    图像的颜色主要是由于图像受到外界光照影响随之产生的不同颜色信息,同一个背景物的图像在不同光源照射下产生的不同颜色效果的图像,因此在我们做图像特征提取和识别过程时,我们要的是图像的梯度信息,也就是图像的本质内容,而颜色信息会对我们对梯度信息提取造成一定的干扰,因此我们会在做图像特征提取和识别前将图像转化为灰度图,这样同时也降低了处理的数据量并且增强了处理效果。



    四、绘制自定义数字图像


    本小节目的主要是跟着大家通过自定义数字图像来理解什么是数字图像? 为什么前面提到的图像对象是numpy中的ndarray对象

    1、绘图简单图像

    对于一个长宽分别为w、h的RGB彩色图像来说,它的每个像素值是由(B、G、R)的一个tuple组成,opencv-python中每个像素三个值的顺序是B、G、R,而对于灰度图像来说,每个像素对应的便只是一个整数,如果要把像素缩放到0、1,则灰度图像就是二值图像,0便是黑色,1便是白色。我们通过下面的例子来理解一下

    import cv2
    #这里图像采用的仍旧是上面那个卡通美女啦
    rgb_img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/cartoon.jpg')
    print(rgb_img.shape)     #(1200, 1600, 3)
    print(rgb_img[0, 0])     #[137 124  38]
    print(rgb_img[0, 0, 0])  #137
    
    gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
    print(gray_img.shape)    #(1200, 1600)
    print(gray_img[0, 0])    #100
    

    从上面我们可以看到彩色图像的高度height = 1200, 宽度w=1600且通道数为3, 像素(0, 0)的值是(137 124 38),即R=137, G=124, B=38, 对于灰度图像来说便只是单通道的了

    因此(0, 0, 0)便是代表一个黑色像素,(255, 255, 255)便是代表一个白色像素。这么想,B=0, G=0, R=0相当于关闭了颜色通道也就相当于无光照进入,所以图像整个是黑的,而(255, 255, 255)即B=255, G=255, R=255, 相当于打开了B、G、R所有通道光线全部进入,因此便是白色。

    明白了上面的原理我们便可以通过创建numpy的ndarray对象来创建任意的彩色图像和灰度图像了,例如:

    import cv2
    import numpy as np
    
    white_img = np.ones((512,512,3), np.uint8)
    white_img = 255*white_img
    cv2.imshow('white_img', white_img)
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    

    效果图:
    在这里插入图片描述

    接下来我们先来熟悉一下opencv中一些简单几何图像基本绘制函数,然后我们尝试着在上面白色的图像上进行添加新的图像物体,是不是还挺有趣的,我们将介绍直线cv2.line、长方形cv2.rectangle、圆cv2.circle、椭圆cv2.ellipse、多边形cv2.polylines等集合图像绘制函数

    先介绍一下它们的公共参数:
    · img: 表示需要进行绘制的图像对象ndarray
    · color: 表示绘制几何图形的颜色,采用BGR即上述说的(B、G、R)
    · thickness: 表示绘制几何图形中线的粗细,默认为1,对于圆、椭圆等封闭图像取-1时是填充图形内部
    · lineType : 表示绘制几何图形线的类型,默认8-connected线是光滑的,当取cv2.LINE_AA时线呈现锯齿状

    (1) cv2.line函数

    直线绘制函数, 函数官方定义为:

    cv2.line(image, starting, ending, color, thickness, lineType)
    

    参数image、color、thickness、lineType分别是上述公共定义,参数starting、ending分别表示线的起点像素坐标、终点像素坐标


    (2) cv2.rectangle函数

    长方形绘制函数,函数官方定义:

    cv2.rectangle(image, top-left, bottom-right, color, thickness, lineType)
    

    参数image、color、thickness、lineType分别是上述公共定义,参数top-left、bottom-right分别表示长方形的左上角像素坐标、右下角像素坐标


    (3) cv2.circle函数

    圆形绘制函数,官方定义函数为:

    cv2.circle(image, center, radius, color, thickness, lineType)
    

    参数image、color、thickness、lineType分别是上述公共定义,参数center、radius分别表示圆的圆心像素坐标、圆的半径长度,圆绘制函数中当参数thickness = -1 时绘制的是实心圆,当thickness >= 0 时绘制的是空心圆


    (4) cv2.ellipse函数

    椭圆绘制函数,官方定义为:

    cv2.circle(image, center, (major-axis-length, minor-axis-length), angle, startAngle, endAngle, color, thickness, lineType)
    

    椭圆的参数较多,首先参数image、color、thickness、lineType分别是上述公共定义,椭圆绘制函数中当参数thickness = -1 时绘制的是实心椭圆,当thickness >= 0 时绘制的是空心椭圆,其他参数如下

    · center: 表示椭圆中心像素坐标
    · major-axis-length: 表示椭圆的长轴长度
    · minor-axis-length: 表示椭圆的短轴长度
    · angle: 表示椭圆在逆时针方向旋转的角度
    · startAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的起始角度
    · endAngle: 表示椭圆从主轴向顺时针方向测量的椭圆弧的终止时角度


    (5) cv2.polylines函数

    多边形绘制函数,官方定义函数为:

    cv2.polylines(image, [point-set], flag, color, thickness, lineType)
    

    参数image、color、thickness、lineType分别是上述公共定义,其他参数如下:

    · [point-set]: 表示多边形点的集合,如果多边形有m个点,则便是一个m12的数组,表示共m个点
    · flag: 当flag = True 时,则多边形是封闭的,当flag = False 时,则多边形只是从第一个到最后一个点连线组成的图像,没有封闭

    现在我们将上面五种几何图像绘制到开始的白色图像上,观看效果:

    import cv2
    import numpy as np
    
    img = np.ones((512,512,3), np.uint8)
    img = 255*img
    img = cv2.line(img, (100,100), (400,400),(255, 0, 0), 5)
    img = cv2.rectangle(img,(200, 20),(400,120),(0,255,0),3)
    img = cv2.circle(img,(100,400), 50, (0,0,255), 2)
    img = cv2.circle(img,(250,400), 50, (0,0,255), 0)
    img = cv2.ellipse(img,(256,256),(100,50),0,0,180,(0, 255, 255), -1)
    pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
    img = cv2.polylines(img,[pts],True,(0, 0, 0), 2)
    
    cv2.imshow('img', img)
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    

    自定义图像效果图:
    在这里插入图片描述


    2、对图像的简单像素操作

    除了根据数字图像特点绘制特定图像,我们还可以对已有的图像像素进行操作然后得到很多神奇的效果,也就是对图像的像素进行变换

    (1) 对图像取反

    reverse_img = 255 - gray_img  
    

    图像取反效果图:
    在这里插入图片描述

    (2) 对图像像素线性变换

    for i in range(gray_img.shape[0]):
        for j in range(gray_img.shape[1]):
            random_img[i, j] = gray_img[i, j]*1.2
    

    图像像素线性变换效果图:
    在这里插入图片描述

    上述两个图像变换完整示例代码:

    import cv2
    import imutils
    import numpy as np
    
    rgb_img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/cartoon.jpg')
    gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
    reverse_img = 255 - gray_img
    
    random_img = np.zeros((gray_img.shape[0], gray_img.shape[1]), dtype=np.uint8)
    for i in range(gray_img.shape[0]):
        for j in range(gray_img.shape[1]):
            random_img[i, j] = gray_img[i, j]*1.2
    cv2.imshow('reverse_img', imutils.resize(reverse_img, 800))
    cv2.imshow('random_img', imutils.resize(random_img, 800))
    if cv2.waitKey(0) == 27:
        cv2.destroyAllWindows()
    


    五、结语


    相信认真一起看完上述知识点,opencv-python已经对于图像的基本操作可以熟练掌握了,同时对数字图像有了一定的理解,在接下来的教程中我还将陆续和大家一起学习诸如:
    · 基本概念: 亮度、对比度、分辨率、饱和度、尖锐化等基础概念
    · 图像灰度变换: 线性、分段线性、对数、反对数、幂律(伽马)变换等
    · 图像滤波: 线性滤波和非线性滤波、空间滤波和频率域滤波,均值滤波、中值滤波、高斯滤波、逆滤波、维纳滤波等各种图像的基本操作

    在上述学习完之后然后我们在和大家一起学习一些高级的图像操作如:
    · 文本图像的倾斜矫正方法: 霍夫变换、透视变换等
    · 图像边缘检测: canny算子、sobel算子、Laplace算子、Scharr滤波器等。。。

    本文分享结束,有问题欢迎交流学习,大家也可以关注我的微信公众号,一起交流学习:
    在这里插入图片描述

    展开全文
  • 原作:Parul Pandey铜灵 编译整理量子位 出品 | 公众号 QbitAI在图像处理领域,一库在手,相当于天下已有。最近,有一位搞数据科学的小姐姐Parul Pa...
        
    原作:Parul Pandey
    铜灵 编译整理
    量子位 出品 | 公众号 QbitAI

    在图像处理领域,一库在手,相当于天下已有。

    最近,有一位搞数据科学的小姐姐Parul Pandey,整理了一份实用Python图像处理工具,内含十大经典Python库。

    640?wx_fmt=png

    这份资源中的工具可用于图像处理中的常见任务,包括裁剪、翻转、旋转、图像分割、分类和特征提取、图像恢复和图像识别等。可谓干货满满,图像处理提升效率必备。

    量子位取其重点,将文章翻译整理如下:


    1、scikit Image

    scikit-image是一个与numpy数组配合使用的开源Python包,在学术研究、教育和行业领域都可应用。

    即使是那些刚接触Python生态系统的人,也会觉得这是一个相当简单直接的库。

    通过这个包能完成很多任务,比如图像过滤:

    640?wx_fmt=png

    640?wx_fmt=png

    使用match_template 函数进行模板匹配:

    640?wx_fmt=png

    官方地址:
    https://scikit-image.org/

    用户指南:
    https://scikit-image.org/docs/stable/user_guide.html

    2、Numpy

    Numpy是Python的核心库之一,也能支持数组,图像本质上是包含数据点像素的标准Numpy数组。

    因此,通过基本的NumPy操作,可以修改图像的像素值。

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

    使用方法也和简单,比如需要mask一张图像时:

    640?wx_fmt=png

    640?wx_fmt=png

    官方地址:
    http://www.numpy.org/

    3. Scipy

    scipy是Python中另一个核心模块,可用于基本的图像操作和处理任务。

    特别需要注意的是,子模块scipy.ndimage提供在n维NumPy数组上运行的功能。这个包目前包括线性和非线性滤波器、二元形态、B-spline插值和物体测量等功能。

    可以用高斯过滤用Scipy模糊高斯滤波器:

    640?wx_fmt=png

    640?wx_fmt=png

    官方资料:
    https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution

    4、PIL/ Pillow

    PIL(Python Imaging Library)是一个免费的Python编程语言库,它增加了对打开,操作和保存不同图像文件格式的支持。然而,它的发展停滞不前,最后一次更新还是在2009年。

    其分支Pillow更易于安装,在所有主要操作系统上运行并支持Python 3。这个库包含基本的图像处理功能,包括点操作、使用一组内置卷积核滤波及颜色空间转换。

    当用ImageFilter增强Pillow中的图像时,操作是这样的:

    640?wx_fmt=png

    640?wx_fmt=jpeg

    官方介绍:
    https://pillow.readthedocs.io/en/3.1.x/index.html

    5、OpenCV-Python

    OpenCV是计算机视觉应用中使用最广泛的库之一,OpenCV-Python是OpenCV的python API。

    总体来说,因为后台由用C / C ++编写,因此OpenCV-Python不仅速度快,也易于编程和部署。

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

    来看一下用例,下图展示的是OpenCV-Python在Image Blending中使用Pyramids创建一个名为’Orapple’的新水果的功能。

    640?wx_fmt=jpeg

    上手指南:
    https://github.com/abidrahmank/OpenCV2-Python-Tutorials

    6、SimpleCV

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

    手握SimpleCV,你可以访问几个高性能的视觉库,而无需先了解图像色深(bit depth)、文件格式、色彩空间等。

    SimpleCV拥护者的支持理由有两个,一是初学者也可以借此编写简单的视觉任务,二是无论是相机、视频文件、图像和视频流可互相操作。

    640?wx_fmt=png

    用户指南:
    https://simplecv.readthedocs.io/en/latest/

    7、Mahotas

    Mahotas包含传统的图像处理功能,如滤波和图像形态学处理,以及用于特征计算,比如兴趣点检测和局部描述子等。

    这个库适用于快速开发,算法是用C++实现的,并且针对速度进行了调整。

    640?wx_fmt=png

    官方地址:
    https://mahotas.readthedocs.io/en/latest/

    用户指南:
    https://mahotas.readthedocs.io/en/latest/index.html

    8、 SimpleITK

    ITK是一个开源的跨平台系统,提供一整套用于图像分析的软件工具。

    其中,SimpleITK是一个建立在ITK之上的简化层,促进其在简化原型、教育和解释语言中的应用。

    SimpleITK是一个图像分析工具包,内含大量组件,支持一般滤波操作、图像分割和图形配准。

    SimpleITK本身是用C++编写的,但也适用于包括Python在内的大量编程语言。

    下面就是用SimpleITK和Python创建的可视化的CT/MR图:

    640?wx_fmt=gif

    官方地址:
    https://itk.org/

    学习资料:
    http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/

    9、GraphicsMagick

    GraphicsMagick号称图像处理领域的瑞士军刀。 代码短小却提供了一个鲁棒、高效的工具和库集合,可用来处理图像的读取、写入和操作。

    支持超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。

    将它用于图像边缘提取任务,效果如下:

    640?wx_fmt=png

    官方资料:
    https://pypi.org/project/pgmagick/

    相关资源:
    https://github.com/hhatto/pgmagick

    10、Pycairo

    pyCairo是一个Python的2D图形渲染库,可用于绘制矢量图形的2D图形,在调整大小或变换时不会丢失清晰度。

    下面这个用例是用Pycairo绘制线条、基本形状和径向梯度。

    640?wx_fmt=png

    官方介绍:
    https://cairographics.org/

    相关资源:
    https://github.com/pygobject/pycairo

    传送门

    博客原文地址(需要科学前往):
    https://towardsdatascience.com/image-manipulation-tools-for-python-6eb0908ed61f

    文章下载地址:
    https://pan.baidu.com/s/1FDlji1zJIVeoSPQ89WVfMw


    小程序|全类别AI学习教程

    640?wx_fmt=jpeg

    AI社群|与优秀的人交流

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    量子位 QbitAI · 头条号签约作者

    վ'ᴗ' ի 追踪AI技术和产品新动态

    喜欢就点「在看」吧 !

    展开全文
  • PIL是一个图像处理经常使用到的库,全名是Python Image Library,其中有一个子库是Image,我们今天就来用一下这个库 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives)。PIL非常适合于图像归档以及...

    一、关于PIL库

    PIL是一个图像处理经常使用到的库,全名是Python Image Library,其中有一个子库是Image,我们今天就来用一下这个库

    PIL可以做很多和图像处理相关的事情:

    • 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
    • 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
    • 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。

    二、PIL库的简单使用

    # -*- coding: utf-8 -*-
    """
    Created on Tue Mar 12 14:03:00 2019
    
    @author: Administrator
    """
    
    from PIL import Image
    from pylab import *
    
    
    
    img1 = Image.open('E:\\360MoveData\\Users\\Administrator\\Desktop\\things2_0\\flower.jpg')
    subplot(121)
    axis('off')
    imshow(img1)
    
    img2 = Image.open('E:\\360MoveData\\Users\\Administrator\\Desktop\\things2_0\\flower.jpg').convert('1')
    subplot(122)
    axis('off')
    imshow(img2)
    
    show()

    效果:

    这里面的Image.open函数就是我们读取图片的函数,看起来和前面博客提到的cv库中的imread函数作用还是很相似的,subplot的作用在于我们将这个读取出来的图片作为最后输出的一个子图的形式,axis()顾名思义是针对显示图片的坐标轴的方法,如果这里不设置成off的话,就会变成这种效果:

    可以看到我们在读取第二个子图的时候使用了convert()函数,这个函数的作用是什么呢,是指明了我们对于图像处理的模式,比如我这里指定了模式为“1”,根据我们运行的效果也可以看出来,在这个模式下的图片只有黑白两种颜色,不过这样说显得有点不专业嘿,用老师在课上的话讲,把这种叫做通道,如果我们传统的RGB,是由三种基本颜色组成的,这种就是有三个颜色通道,那么我们这个模式1的图片处理,可以看到非黑即白,即便如此,它的每个像素也是用八位来表示,0表示黑,255表示白,经过convert函数处理之后读取出来的图片,就如同我们刚才看到的右侧子图,变成了黑白的颜色。

    另外一种模式是L,在这种模式下会出现什么效果呢?让我们试一下

    嘿,明显看到这个图片处理得比刚才的模式细腻多了呀,而且也不只有黑白两种颜色,而是一种灰灰的颜色,与模式1相似,模式L的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是这样转换的:

    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    https://www.jianshu.com/p/bdd9bfcbedb7这篇博客中看到了有关convert函数几种模式的介绍,如下:

    convert()是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式
    1 ------------------(1位像素,黑白,每字节一个像素存储)
    L ------------------(8位像素,黑白)
    P ------------------(8位像素,使用调色板映射到任何其他模式)
    RGB------------------(3x8位像素,真彩色)
    RGBA------------------(4x8位像素,带透明度掩模的真彩色)
    CMYK--------------------(4x8位像素,分色)
    YCbCr--------------------(3x8位像素,彩色视频格式)
    I-----------------------(32位有符号整数像素)
    F------------------------(32位浮点像素)

    所以接下来依次验证几种模式,左面的都是原图,右面的代表不同的模式效果

    模式P:

    

    模式RGBA:

    模式CMYK:

    模式YCbCr:

    模式I:

    模式F:

     

    针对PIL库中的几个函数的实验大概就是这样,在这个过程中参考了一些大佬的博客,我自己也是刚刚开始这方面的学习,后面会慢慢更新学习过程中的感受和新知识

    展开全文
  • 图像处理那首先要配个环境嘛,配环境真的是我长久以来的噩梦了,每次都会出现奇奇怪怪的问题,首先上网查找了一下,opencv这个库还是用的比较多的,如果想要使用C++来做图像处理的话,那么使用visual studio搭配...

    一、环境

    由于这学期开了图像处理这门课,所以想着在各种实验开始之前自己先动手试一下

    图像处理那首先要配个环境嘛,配环境真的是我长久以来的噩梦了,每次都会出现奇奇怪怪的问题,首先上网查找了一下,opencv这个库还是用的比较多的,如果想要使用C++来做图像处理的话,那么使用visual studio搭配opencv是比较常见的,所以就照着网上的教程下载好了vs之后下载了opencv的包,将包导入指定的路径也设置好环境变量之后发现还是不行,怎么办呢?这个时候想到那还不如自己直接用python,一来现在python使用的越来越多,二来方法也多,语法什么的也比较简单,正好自己电脑上之前配置了pycharm,这样省了很多事

    本来以为直接在pycharm里面的settings里面导入opencv的包就可以了,可是查了一下发现没有,这里还是要自己从网上下载然后导入,还是好麻烦呀,从网上查到可以从anaconda里面下载,比较方便,可是一个问题是我的pycharm的python解释器是用的自己下载的,而没用anaconda自带的解释器,这样下载下来可能也用不了,机智的我想到把原来的解释器卸载掉然后使用anaconda带来的解释器不就得了,不巧的是卸载的时候脑子一热把anaconda也卸载了……(这可怎么办好)无奈下只好重新下载了anaconda

    anaconda有两种下载途径,第一种是从官网下载,第二种是使用清华镜像,清华镜像要快一点,但是一个问题是pycharm使用的时候会报错,这个时候要修改一个.condarc文件,后来又出了各种问题我就想那还是用国外的下载吧,慢就慢一点呗,意外的是其实也没有很慢,这个时候又出了一个错误,这时候重新使用国外下载的版本会报另外一个错误,有些博客提到使用conda update 或者conda update --reset这两条指令,由于前面修改了.condarc文件,所以并没有解决我的问题。可以采用两种方法解决,第一种是改回原来的样子,但是如果像我一样忘了原来的文件怎么办,就可以用第二种方法,将这个文件删掉,再重新执行conda update,成功了。

    接下来是修改pycharm中的解释器,需要提到的是不仅要修改interpreter,还需要在pycharm的Run按钮旁边的这个位置

    我这里对应到cvTest2的下拉框,找到Edit Configuration,修改其中使用的解释器,不然的话由于原来的python解释器和现在的anaconda解释器不同,仍然会提示路径错误,找不到python

    就在刚刚可以在pycharm中运行cv且不报错的时候,突然发现anaconda自带了一个神奇的小东西,它的名字叫做spyder,这个小可爱如果早点出现的话,可省了我好多麻烦

    Spyder是什么呢?

    嗯这是一个看着很让人喜欢的python编译器,界面大概是这样的

    简洁又可爱是不是?更好的是在这个环境里,anaconda下载的库可以直接使用,我的cv使用的第一个成功 的例子就是在Spyder运行成功的,对它的好感又多了一分。

    二、实例——读取一个图片

    opencv这个库提供了很多有关图像处理的方法,在这里我们首先执行一个可以读取图片的程序:

    import cv2 as cv
    
    # 读入图片文件
    src = cv.imread('E:\\360MoveData\\Users\\Administrator\\Desktop\\things2_0\\flower.jpg')
    # 创建一个名字加 “ input image ” 的窗口,
    # 窗口可以根据图片大小自动调整
    cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
    # 在窗口显示图片
    cv.imshow('input image', src)
    
    # 等待用户操作
    cv.waitKey(0)
    # 释放所有窗口
    cv.destroyAllWindows()
    
    
    

    imread这个方法提供了读取数据的方法,下面的nameWindow方法根据其名字就可以得知是对读取图片之后弹出的窗口做设置的,具体可看代码中注释,接下来我们看一下执行出来的效果

    哈,读取出来的图片和保存的原图是一样的,这是我要学习图像处理的第一步,那么下一步就要对这个图片做一些改动,这部分放在下一篇博客再讲

    展开全文
  • 那么大概的思路其实是这样的,视频识别和人脸识别的区别其实是从视频中读取出一帧的图像处理,再用上一次的处理办法,框出我们识别出的人脸,就可以了 一、获取摄像头 之前学习Android开发的时候,如果开发的应用...

    上一次进行了读取图片的人脸识别,这一次要进行一点不一样的事情,所以我们要再进步一点,如果使用我们电脑的摄像头,并且可以读取出我们的人脸,这样会更酷一点。那么大概的思路其实是这样的,视频识别和人脸识别的区别其实是从视频中读取出一帧的图像处理,再用上一次的处理办法,框出我们识别出的人脸,就可以了

    一、获取摄像头

    之前学习Android开发的时候,如果开发的应用需要摄像头的话是需要获取到摄像头权限的,这一次使用python想着会不会也需要这样做,然后查了一下,发现真的是要方便很多,直接获取就可以了。具体方法是这样的:

    cap = cv2.VideoCapture(0) 
    

    是的,opencv中支持了直接使用摄像头,这里的参数是0,看到有一位大佬电脑配了不止一个摄像头,这里就会修改参数,类似于摄像头的编号,比如我装了三个摄像头,这里的参数可能设置为0-2都是可以的。

    然后的工作和之前的类似,首先我们要获取到识别器,具体操作这样:

    face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') 

    然后把它加载进来

    face_cascade.load('E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
    

    二、后续处理

    从上一次我们大概知道,至少现阶段我做的图像处理都是先转换为灰色,再处理,这一次也是这样,先读取视频中的一帧,再转换为灰色的:

    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

    然后通过我们上次说的通过使用detectMultiScale函数,调整参数完成识别,这里不再赘述

    需要说的是这里其实是需要一个while(true)的循环来一直处理的,为什么?因为这是一个视频呀,而且是打开摄像头获取到的视频,如果我们不关闭摄像头的话甚至可以认为这是一段无限长的视频,使用一个这样的循环保证我们可以对每一帧图像进行处理,持续地对人脸进行识别。

    三、遇到的问题

    运行时遇到了这样的问题:

    error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

    上网查看了一下,对代码做了一定的改进,对上述读取出的ret进行判断,如果为true的话再开始转灰度,否则的话则终止,查了一下videoCapture.read这个函数返回的两个参数的意义,ret表示对当前帧的判断,如果是一张合法的帧或者说,是一张可处理的帧,才返回true,否则返回false,frame则返回的是我们获取到的帧对象,所以这个报错信息大概可能是因为有些帧不合法而我们紧接着就进行了灰度转换,这时候就会出错,所以以后如果还要使用这个函数的话还是记得对ret这个返回值有一个判断会比较好,否则可能会出错

    四、程序

    # -*- coding: utf-8 -*-
    """
    Created on Sat Mar 23 14:43:48 2019
    
    @author: Administrator
    """
    
    import cv2
    cap = cv2.VideoCapture(0) 
    face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml') # 加载人脸特征库
    face_cascade.load('E:\\anaconda\\pkgs\\libopencv-3.4.1-h875b8b8_3\\Library\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
    while(True):
        ret, frame = cap.read() 
        if ret is True: 
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    
        else:   
    
            break
     
        faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 5, minSize = (5, 5)) 
        for(x, y, w, h) in faces:
            cv2.rectangle(gray, (x, y), (x + w, y + h), (0, 0, 255), 2) 
     
        cv2.imshow('Face Recognition', gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release() 
    cv2.destroyAllWindows()
    
    

     

    五、效果(马赛克版)

    嗯中间还测试了一下,即使移动,也可以识别出来,而且由于我们使用了一个死循环的方式,点击关闭之后还会弹出视频窗口

    展开全文
  • 图像的基本处理 读取图片 颜色空间转换 获取图片属性 缩放图片 平移图片 旋转图片 仿射变换 图像颜色变换 通道的拆分/合并处理 图片添加边距 import numpy as np import cv2 as cv # OpenCv库...
  • 这篇文章主要介绍了python图像处理入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一、环境 由于这学期开了图像处理这门课,所以想...
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
  • 前面一篇文章我讲解了Python图像量化、采样处理及图像金字塔。本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的...
  • python数字图像处理-图像的基本结构和基础知识一、python实现BMP图像的读取和显示BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。...
  • 图像处理书籍推荐

    2017-04-29 22:02:42
    作者:CV视觉网 链接:...我们所说的图像处理实际上就是数字图像处理,是把真实世界中的连续三维随机信号投影到传感器的二维平面上,采样并量化后得到二维矩阵。数字图像处理就是二
  • Pillow是Python里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
  • python 图像处理初步

    2016-12-02 21:49:38
    1.安装python 开发环境,一般ubuntu自带 2.安装图像处理库imaging sudo apt-get install imaging 3.读取图片 import image im = image.open("1.jpg") im.show()
  • 附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版...
  • Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理」 「...
  • Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理」 「...
  • 开发语言:Python3.* 涉及到的三方库:cv2、random、numpy 1.打开一张图片 import cv2 image = cv2.imread("lena.tiff") cv2.imshow("origin",image) k = cv2.waitKey(0) if k == 27: cv2.destroyAllWindows() ...
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
1 2 3 4 5 ... 20
收藏数 20,261
精华内容 8,104
关键字:

python 图像处理入门