[Python图像处理] 三十四.数字图像处理基础与几何图形绘制万字详解(推荐)

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

前面一篇文章介绍了12种常见的图像处理特效。这篇文章回到基础知识,将详细分享数字图像处理基础知识,包括像素及常见图像分类、OpenCV配置、常见数据类型、Numpy和Matplotlib绘制、几何图形绘制等,万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的擡爱。当然如果您是在读学生或经济拮据,可以私聊我给你每篇文章开白名单,或者转发原文给你,更希望您能进步,一起加油喔~

前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
[Python图像处理] 七.图像阈值化处理及算法对比
[Python图像处理] 八.图像腐蚀与图像膨胀
[Python图像处理] 九.形态学之图像开运算、闭运算、梯度运算
[Python图像处理] 十.形态学之图像顶帽运算和黑帽运算
[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽运算
[Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理
[Python图像处理] 十五.图像的灰度线性变换
[Python图像处理] 十六.图像的灰度非线性变换之对数变换、伽马变换
[Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
[Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割
[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效
[Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样
[Python图像处理] 二十二.Python图像傅里叶变换原理及实现
[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波
[Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效
[Python图像处理] 二十五.图像特效处理之素描、怀旧、光照、流年以及滤镜特效
[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例
[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
[Python图像处理] 二十八.OpenCV快速实现人脸检测及视频中的人脸
[Python图像处理] 二十九.MoviePy视频编辑库实现抖音短视频剪切合并操作
[Python图像处理] 三十.图像量化及采样处理万字详细总结(推荐)
[Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)
[Python图像处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特征识别)万字详细总结
[Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
[Python图像处理] 三十四.数字图像处理基础与几何图形绘制万字详解(推荐)


































本文主要讲解数字图像处理基础知识,包括图像像素及常见图像分类、图像信号数字化处理、OpenCV安装配置与入门、常见数据类型、Numpy和Matplotlib,并详细叙述了Python和OpenCV绘制几何图像的函数及代码。

一.数字图像处理概述

数字图像处理(Digital Image Processing)又称为计算机图像处理(Computer Image Processing)[1],它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理的产生和发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长[2]。
常见的数字图像处理方法包括[1]:

  • 算术处理(Arithmetic Processing)
  • 几何处理(Geometrical Processing)
  • 图像增强(Image Enhancement)
  • 图像识别(Image Recognition)
  • 图像分类(Image Classification)
  • 图像复原(Image Restoration)
  • 图像重建(Image Reconstruction)
  • 图像编码(Image Encoding)
  • 图像理解(Image Understanding)

图像是人类获取和交换信息的主要来源,因此,图像处理的应用领域必然涉及到人类生活和工作的方方面面。随着人类活动范围的不断扩大,图像处理的应用领域也将随之不断扩大,包括航天航空领域、生物医学工程领域、通信工程领域、工业工程领域、安保军事领域、文化艺术领域、机器视觉领域、人工智能领域、电子商务领域等。


二.像素及常见图像分类

图像都是由像素(pixel)构成的,像素表示为图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。下图表示一张由像素组成的叮当猫[4]。

在这里插入图片描述

图像通常分为二值图像、灰度图像和彩色图像,下图展示了图像处理经典“Lena”图的各种图像。

在这里插入图片描述

1.二值图像
二值图像又称为黑白图像,图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素大于127则设置为255,否则设置为0。如图所示,一幅二值图像对应的矩阵。

在这里插入图片描述

2.灰度图像
灰度图像是指每个像素的信息由一个量化的灰度级来描述的图像,没有彩色信息。改变像素矩阵的RGB值,来达到彩色图转变为灰度图。常见的方法是将灰度划分为256种不同的颜色,将原来的RGB(R,G,B)中的R、G、B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),即为灰度图。将彩色图像转换为灰度图是图像处理的最基本预处理操作。具体的灰度转换方法前面的文章介绍过。

在这里插入图片描述

3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。RGB (Red红色,Green 绿色,Blue 蓝色),是根据人眼识别的颜色而定义的空间,可用于表示大部分颜色,也是图像处理中最基本、最常用、面向硬件的颜色空间,是一种光混合的体系。

在这里插入图片描述

RGB 颜色模式用三维空间中的一个点表示一种颜色,每个点有三个分量,分别表示红、绿、蓝的亮度值。在RGB模型的立方体中,原点对应的颜色为黑色,它的三个分量值都为0;距离原点最远的顶点对应的颜色为白色,三个分量值都为1;从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线;立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色。下图表示彩色图像对应的RGB三原色矩阵图。

在这里插入图片描述

下图展示了图像中某一点像素(205,89,68)所对应三原色像的素值,其中R表示红色分量、G表示绿色分量、B表示蓝色分量。

在这里插入图片描述


三.图像信号数字化处理

数字图像处理技术广泛应用于各行各业,它主要是将现实物体离散化处理后转换为信号数字图像,从而更好地进行后续的图像处理和图像识别等操作。下图展示了图像信号数字化处理的过程。

在这里插入图片描述

下面简单叙述图像的数字表示方法。令f(s, t)表示一幅具有两个连续变量s和t的连续图像函数。通过取样和量化,把该函数转换为数字图像。将该连续图像取样为一个二维阵列f(x,y),该阵列有M行和N列,其中(x,y)是离散座标,如公式(1)所示。

在这里插入图片描述

在计算过程中,通常会使用传统的矩阵表示法来表示数字图像及其像素,如公式(2)所示。

在这里插入图片描述

二维矩阵是表示数字图像的重要数学形式。一幅M×N的图像可以表示为矩阵,矩阵中的每个元素称为图像的像素。每个像素都有它自己的位置和值,该值表示该位置像素的颜色或者强度。


四.OpenCV安装配置

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac 操作系统上。它是一个由C/C++语言编写而成的轻量级并且高效的库,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。其官方地址为:

本书主要使用Python调用OpenCV2库函数进行图像处理操作,首先告知读者如何在Python编程环境下安装OpenCV库。OpenCV安装主要通过pip指令进行。如图3所示,在命令提示符CMD环境下,通过cd命令进入Python安装目录的Scripts文件夹下,再调用“pip install opencv-python”命令安装。

在这里插入图片描述

安装命令如下:

  • cd C:\Python27\Scripts
  • pip install opencv-python

当OpenCV扩展包安装成功后,在Python2.7.8中输入“import cv2”语句导入该扩展包,测试安装是否成功,如果没有异常报错即安装成功,如下图所示。

在这里插入图片描述

Python可以通过easy_install或者pip命令安装各种各样的包(Package),其中easy_insall提供了“傻瓜式”的在线一键安装模块的方式,而pip是easy_install的改进版,提供更好的提示信息以及查找、下载、安装及卸载Python包等功能,常见用法如下表所示。

在这里插入图片描述


五.OpenCV初识及常见数据类型

1.OpenCV显示图像

OpenCV是一个轻量级高效的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的多种通用算法。所谓的图像可以理解为一个数组,图像处理就是对数字的处理。在OpenCV2中,图像的读取和显示是最简单的两句代码,它们通过imread()和imshow()函数实现。

OpenCV读取图像的imread()函数原型如下,它将从指定的文件加载图像并返回矩阵,如果无法读取图像(因为缺少文件、权限不正确、格式不支持或图像无效等),则返回空矩阵(Mat::data==NULL)。

  • retval = imread(filename[, flags])
    – filename表示需要载入的图片路径名,其支持Windows位图、JPEG文件、PNG图片、便携文件格式、Sun rasters光栅文件、TIFF文件、HDR文件等
    – flags为int类型,表示载入标识,它指定一个加载图像的颜色类型,默认值为1
    – cv2.IMREAD_UNCHANGED表示读入完整图像或图像不可变,包括alpha通道
    – cv2.IMREAD_GRAYSCALE表示读入灰度图像
    – cv2.IMREAD_COLOR表示读入彩色图像,默认参数,忽略alpha通道




OpenCV中显示图像调用imshow()函数,它将在指定窗口中显示一幅图像,窗口会自动调整为图像大小,其原型如下所示:

  • imshow(winname, mat)
    – winname表示窗口的名称
    – mat表示要显示的图像

在显示图像过程中,通常还会调用两个操作窗口的函数,它们分别是waitKey()和destroyAllWindows()。

  • retval = waitKey([, delay])
    – 键盘绑定函数,共一个参数delay,表示等待的毫秒数,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数大于0表示等待delay毫秒;参数小于0表示等待键盘单击。

  • destroyAllWindows()
    – 该函数可以轻易删除所有建立的窗口。如果你想删除特定的窗口可以使用 cv2.destroyWindow(),并在括号内输入要删除的窗口名。

下面是第一个示例程序,主要用于读取和加载经典的“Lena”图像。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("Lena.png")

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

在这里插入图片描述

注意,上述代码中如果没有waitKey(0)函数,其运行结果可能会出现错误,加载一幅灰色的图像,如图所示。

在这里插入图片描述

同时,可以设置加载图像后无限期等待,直到输入指定的按键才退出窗口,如blog34_02.py代码所示,输入ESC才退出。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("Lena.png")

#显示图像
cv2.imshow("Demo", img)

#无限期等待输入
k=cv2.waitKey(0)

#如果输入ESC按键退出
if k==27:
    cv2.destroyAllWindows()

2.常见数据类型

下面介绍OpenCV中常见的数据类型,包括点Point类、颜色Scalar类、尺寸Size类、矩形Rect类、矩阵Mat类,如下表所示。

在这里插入图片描述


六.Numpy和Matplotlib库介绍

1.Numpy库

NumPy(Numeric Python)是Python提供的数值计算扩展包,拥有高效的处理函数和数值编程工具,主要用于科学计算,如矩阵数据类型、线性代数、矢量处理等。这个库的前身是1995年就开始开发的一个用于数组运算的库,经过长时间的发展,基本成了绝大部分Python科学计算的基础包,当然也包括提供给Python接口的深度学习框架。其安装命令如下所示:

  • pip install numpy

Array是Numpy库中最基础的数据结构,表示数组。Numpy可以很方便地创建各种不同类型的多维数组,并且执行一些基础操作。一维数组常见操作代码如下所示。

# -*- coding:utf-8 -*-
import numpy as np

#定义一维数组
a = np.array([2, 0, 1, 5, 8, 3])
print('原始数据:', a)

#输出最大、最小值及形状
print('最小值:', a.min())
print('最大值:', a.max())
print('形状', a.shape)

输出如下所示,代码通过np.array定义了一个数组[2, 0, 1, 5, 8, 3],其中min计算最小值,max计算最大值,shape表示数组的形状,因为是一维数组,故形状为6L,即6个数字。

原始数据: [2 0 1 5 8 3]  
最小值: 0  
最大值: 8  
形状 (6L,)

在Python图像处理中,主要通过Numpy库绘制一张初始的背景图像,调用np.zeros()函数绘制一张3位且长宽为256×256的黑色图像。注意,np.zeros()生成的数组均为0,即表示黑色。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#显示图像
cv2.imshow("image", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

调用Numpy库绘制的背景图形如图所示。

在这里插入图片描述


2.Matplotlib库

Matplotlib是Python强大的数据可视化工具和2D绘图库,常用于创建海量类型的2D图表和一些基本的3D图表,类似于MATLAB和R语言。Matplotlib提供了一整套和Matlab相似的命令API,十分适合交互式地进行制图,而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。Matplotlib是一名神经生物学家John D. Hunter博士于2007年创建,函数设计上参考了Matlab,现在在Python的各个科学计算领域都得到了广泛应用。Matplotlib官网地址为:http://matplotlib.org/。其安装命令如下所示:

  • pip install matplotlib

Matplotlib作图库常用的函数如下:

  • Plot():用于绘制二维图、折线图,其格式为plt.plot(X,Y,S)。其中X为横轴,Y为纵轴,参数S为指定绘图的类型、样式和颜色
  • Pie():用于绘制饼状图(Pie Plot)
  • Bar():用于绘制条形图(Bar Plot)
  • Hist():用于绘制二维条形直方图
  • Scatter():用于绘制散点图

例如代码“plt.scatter(x, y, c=y_pred, marker=‘o’, s=200)”,它表示绘制散点图,横轴为x,纵轴为y,c=y_pred对聚类的预测结果画出散点图,marker='o’表示用圆圈(Circle)绘图,s表示设置尺寸大小(Size)。

下面的代码是调用Matplotlib绘制散点图的一个简单案例。主要包括以下几个步骤:

  • 导入Matplotlib扩展包及其子类
  • 设置绘图的数据及参数
  • 调用Matplotlib.pyplot子类的Plot()、Pie()、Bar()、Hist()、Scatter()等函数进行绘图
  • 设置绘图的X轴座标、Y轴座标、标题、网格线、图例等内容
  • 最后调用show()函数显示已绘制的图形
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt

#生成随机数表示点的座标
x = np.random.randn(200)
y = np.random.randn(200)

#生成随机点的大小及颜色
size = 50*np.random.randn(200) 
colors = np.random.rand(200)

#用来正常显示中文标签
plt.rc('font', family='SimHei', size=13)

#用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False  

#绘制散点图
plt.scatter(x, y, s=size, c=colors)

#设置x、y轴名称
plt.xlabel(u"x座标")  
plt.ylabel(u"y座标")

#绘制标题
plt.title(u"Matplotlib绘制散点图")

#显示图像
plt.show()

下面详细讲解这部分的核心代码:

  • x = np.random.randn(200)
  • y = np.random.randn(200)
    调用Numpy库中random.randn()函数随机生成x和y变量,它表示点的座标,即(x,y)。同样的方式设置点的大小和颜色为随机数。
  • import matplotlib.pyplot as plt
    导入matplotlib.pyplot扩展包,pyplot是用来画图的方法,重命名为plt变量方便调用,比如显示图形时调用plt.show()函数即可,而不用调用matplotlib.pyplot.show()函数。
  • plt.scatter(x, y, s=size, c=colors)
    调用scatter()函数绘制散点图,并通过参数设置不同点的颜色及大小,其中s参数指定大小,c参数指定颜色,随机为这200个点分配不同的大小及颜色。
  • plt.xlabel(u"x座标")
  • plt.ylabel(u"y座标")
    表示绘制图形的X轴座标标题和Y轴座标标题。
  • plt.title(u"Matplotlib绘制散点图")
    设置绘制图形的标题为“Matplotlib绘制散点图”。
  • plt.show()
    表示调用pyplot.show()将填充数据的图形显示出来。

最终输出如图所示。

在这里插入图片描述

在OpenCV中,主要调用Matplotlib绘制显示多张图形,从而方便实验对比,如代码blog34_06.py所示。它调用cv2.imread()函数分别读取四张图片,并转换为RGB颜色空间,接着通过for循环分别设置各子图对应的图像、标题及座标轴名称,其中plt.subplot(2,2)表示生成2×2张子图。

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图像
img1 = cv2.imread('lena.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

img2 = cv2.imread('people.png')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

img3 = cv2.imread('flower.png')
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)

img4 = cv2.imread('scenery.png')
img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)

#显示四张图像
titles = ['lena', 'people', 'flower', 'scenery']
images = [img1, img2, img3, img4]
for i in range(4):
   plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

输出如图所示,它显示了四幅图像。在图像处理对比中,同时对比多种算法的处理效果是非常重要的手段之一。

在这里插入图片描述


七.几何图形绘制

本小节主要讲解OpenCV中几何图形的绘制方法,包括cv2.line()、v2.circle()、cv2.rectangle()、cv2.ellipse()、cv2.polylines()、cv2.putText()函数。

1.绘制直线

在OpenCV中,绘制直线需要获取直线的起点和终点座标,调用cv2.line()函数实现该功能。该函数原型如下所示:

  • img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – img表示需要绘制的那幅图像
    – pt1表示线段第一个点的座标
    – pt2表示线段第二个点的座标
    – color表示线条颜色,需要传入一个RGB元组,如(255,0,0)代表蓝色
    – thickness表示线条粗细
    – lineType表示线条的类型
    – shift表示点座标中的小数位数。






下面的代码是绘制一条直线,通过np.zeros()创建一幅黑色图像,接着调用cv2.line()绘制直线,参数包括起始座标和颜色、粗细。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制直线
cv2.line(img, (0,0), (255,255), (55,255,155), 5)

#显示图像
cv2.imshow("line", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示,从座标(0,0)到(255,255)绘制一条直线,其直线颜色为(55,255,155),粗细为5。

在这里插入图片描述

基本线条的绘制方法掌握之后,我们能进行简单的变化,比如下面的代码增加了一个简单循环,将图形绘制成了四部分。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制直线
i = 0
while i<255:
    cv2.line(img, (0,i), (255,255-i), (55,255,155), 5)
    i = i + 1

#显示图像
cv2.imshow("line", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示。

在这里插入图片描述


2.绘制矩形

在OpenCV中,绘制矩形通过cv2.rectangle()函数实现,该函数原型如下所示:

  • img = rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – img表示需要绘制的那幅图像
    – pt1表示矩形的左上角位置座标
    – pt2表示矩形的右下角位置座标
    – color表示矩形的颜色
    – thickness表示边框的粗细
    – lineType表示线条的类型
    – shift表示点座标中的小数位数






下面的代码是绘制一个矩形,通过np.zeros()创建一幅黑色图像,接着调用cv2.rectangle()绘制矩形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制矩形
cv2.rectangle(img, (20,20), (150,250), (255,0,0), 2)

#显示图像
cv2.imshow("rectangle", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图3-18所示,从左上角座标为(20,20),右下角座标为(150,250),绘制的矩形颜色为蓝色(255,0,0),粗细为2。

在这里插入图片描述


3.绘制圆形

在OpenCV中,绘制矩形通过cv2.rectangle()函数实现,该函数原型如下所示:

  • img = circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    – img表示需要绘制圆的图像
    – center表示圆心座标
    – radius表示圆的半径
    – color表示圆的颜色
    – thickness如果为正值,表示圆轮廓的厚度;负厚度表示要绘制一个填充圆。
    – lineType表示圆的边界类型
    – shift表示中心座标和半径值中的小数位数






下面的代码是绘制一个圆形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制圆形
cv2.circle(img, (100,100), 50, (255,255,0), -1)

#显示图像
cv2.imshow("circle", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图3-19所示,它在圆形为(100,100)的位置,绘制了一个半径为50,颜色为(255,255,0)、粗细为4的圆。

在这里插入图片描述

注意,如果将粗细设置为“-1”,则绘制的圆为实心,如图所示。

  • cv2.circle(img, (100,100), 50, (255,255,0), -1)

在这里插入图片描述


4.绘制椭圆

在OpenCV中,绘制椭圆比较复杂,要多输入几个参数,如中心点的位置座标,长轴和短轴的长度,椭圆沿逆时针方向旋转的角度等。cv2.ellipse()函数原型如下所示:

  • img = ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
    – img表示需要绘制椭圆的图像
    – center表示椭圆圆心座标
    – axes表示轴的长度(短半径和长半径)
    – angle表示偏转的角度(逆时针旋转)
    – startAngle表示圆弧起始角的角度(逆时针旋转)
    – endAngle表示圆弧终结角的角度(逆时针旋转)
    – color表示线条的颜色
    – thickness如果为正值,表示椭圆轮廓的厚度;负值表示要绘制一个填充椭圆
    – lineType表示圆的边界类型
    – shift表示中心座标和轴值中的小数位数









下面是绘制一个椭圆的代码。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制椭圆
#椭圆中心(120,100) 长轴和短轴为(100,50)
#偏转角度为20
#圆弧起始角的角度0 圆弧终结角的角度360
#颜色(255,0,255) 线条粗细2
cv2.ellipse(img, (120, 100), (100, 50), 20, 0, 360, (255, 0, 255), 2)

#显示图像
cv2.imshow("ellipse", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示,其椭圆中心为(120,100),长轴为100,短轴为50,偏转角度为20,圆弧起始角的角度为0,圆弧终结角的角度为360,表示一个完整的椭圆。绘制的颜色为(255,0,255),粗细为2。

在这里插入图片描述

下面的代码是绘制一个实心椭圆。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制椭圆
cv2.ellipse(img, (120, 120), (120, 80), 40, 0, 360, (255, 0, 255), -1)

#显示图像
cv2.imshow("ellipse", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制如图所示的图形。

在这里插入图片描述


5.绘制多边形

在OpenCV中,调用cv2.polylines()函数绘制多边形,它需要指定每个顶点的座标,通过这些点构建多边形,其函数原型如下所示:

  • img = polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
    – img表示需要绘制的图像
    – center表示多边形曲线阵列
    – isClosed表示绘制的多边形是否闭合,False表示不闭合
    – color表示线条的颜色
    – thickness表示线条粗细
    – lineType表示边界类型
    – shift表示顶点座标中的小数位数






下面是绘制一个多边形的代码。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制多边形
pts = np.array([[10,80], [120,80], [120,200], [30,250]])
cv2.polylines(img, [pts], True, (255, 255, 255), 5)

#显示图像
cv2.imshow("ellipse", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示,绘制的多边形为白色的闭合图形。

在这里插入图片描述

下面的代码是绘制一个五角星多边形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((512,512,3), np.uint8)

#绘制多边形
pts = np.array([[50, 190], [380, 420], [255, 50], [120, 420], [450, 190]])
cv2.polylines(img, [pts], True, (0, 255, 255), 10)

#显示图像
cv2.imshow("ellipse", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示,它将五个顶点左边分别连接起来,构成了一个黄色的五角星。

在这里插入图片描述


6.绘制文字

在OpenCV中,调用cv2.putText()函数添加对应的文字,其函数原型如下所示:

  • img = putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
    – img表示要绘制的图像
    – text表示要绘制的文字
    – org表示要绘制的位置,图像中文本字符串的左下角
    – fontFace表示字体类型,具体查看see cv::HersheyFonts
    – fontScale表示字体的大小,计算为比例因子乘以字体特定的基本大小
    – color表示字体的颜色
    – thickness表示字体的粗细
    – lineType表示边界类型
    – bottomLeftOrigin如果为真,则图像数据原点位于左下角,否则它在左上角








下面是绘制文字的代码。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((256,256,3), np.uint8)

#绘制文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'I love Python!!!',
            (10, 100), font, 0.6, (255, 255, 0), 2)

#显示图像
cv2.imshow("polylines", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如图所示,绘制的文字为“I love Python!!!”。

在这里插入图片描述


八.总结

本文首先普及了数字图像处理、像素、数字化处理等基础知识,接着讲解OpenCV安装过程及常见数据类型、Numpy和Matplotlib库在图像处理中的应用,最后详细讲解了几何图形绘制的方法。本章知识较为基础,将为后续的Python图像处理提供相关支撑。

时光嘀嗒嘀嗒的流失,这是我在CSDN写下的第八篇年终总结,比以往时候来的更早一些。《敏而多思,宁静致远》,仅以此篇纪念这风雨兼程的一年,这感恩的一年。列车上只写了一半,这两天完成,思远,思君O(∩_∩)O

在这里插入图片描述

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

在这里插入图片描述

(By:Eastmount 2021-01-12 晚上11点 http://blog.csdn.net/eastmount/ )


参考文献,在此感谢这些大佬,共勉!

  • [1] 冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
  • [2] 阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
  • [3] 杨秀璋, 颜娜. Python网络数据爬取及分析从入门到精通(分析篇)[M]. 北京:北京航天航空大学出版社, 2018.
  • [4] 张铮,王艳平,薛桂香等. 数字图像处理与机器视觉——Visual C++与Matlab实现[M]. 北京:人民邮电出版社,2014.
  • [5] godadream. OpenCV的数据类型——基础数据类型[EB/OL]. (2018-08-14). https://blog.csdn.net/godadream/article/details/81670495.
  • [6] sinat_26917383. opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍[EB/OL]. (2017-04-09). https://blog.csdn.net/sinat_26917383/article/details/69817532.
  • [7] 我i智能. Python下opencv使用笔记(二)(简单几何图像绘制)[EB/OL]. (2015-07-07). https://blog.csdn.net/on2way/article/details/46793911.
  • [8] Jumping boy. python+OpenCV图像处理(三)绘制简单的几何图形、显示文字[EB/OL]. (2018-05-26). https://blog.csdn.net/qq_40962368/article/details/80463108.
  • [9] Eastmount. [计算机图形学课程] 一.MFC基本绘图函数使用方法[EB/OL]. (2016-11-16). https://blog.csdn.net/Eastmount/article/details/53180524.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章