OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加

OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加

  • 一、OpenCV中的绘图函数
    • 1.1 线段绘制
    • 1.2 矩形绘制
    • 1.3 圆绘制
    • 1.4 椭圆的绘制
    • 1.5 多边形绘制
    • 1.6 添加文字

上两次笔记主要知识点回顾:

  • 数字图像基本概念
  • 图像的读取、显示与保存
  • 图像直方图的绘制
  • 图像通道以及通道的分离与合并
  • 颜色空间及其互相转换

以上是图像与OpenCV的基础知识。

###############################################################################
####################################分割线######################################
###############################################################################

这次笔记以及后两次笔记将聚焦于图像的基本操作,包括:

  1. OpenCV中的绘图函数
  2. 图像几何变换
  3. 图像的滤波与增强
  4. 图像形态学的知识

再次给出OpenCV官方给出的python版文档:https://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html

这次笔记所用到的部分文档为:https://docs.opencv.org/4.1.2/dc/da5/tutorial_py_drawing_functions.html

一、OpenCV中的绘图函数

1.1 线段绘制

函数:

img	= cv2.line( img, pt1, pt2, color[, thickness[, lineType[, shift]]]	)

参数:

  1. img:待绘制的图像,也称为画板或背景图。
  2. pt1:线段起点的坐标。
  3. pt2:线段终点的坐标。
  4. color:线段的颜色,以元组的形式,如(255,0,0)。
  5. thickness:线条的粗细,默认为1,若为-1则会进行填充(闭合图形)。
  6. lineType:线条类型,有 8型cv2.LINE_AA型,默认为8型,cv2.LINE_AA型因为可以抗锯齿所以更适合画曲线。

看一下例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512,512,3), np.uint8)
cv2.imshow("black", img)
cv2.waitKey(0)
cv2.destroyWindow("black")
# 绘制一条线宽为5的线段,起点为(0,0),终点为(200,500),颜色为红色
cv2.line(img,(0,0),(200,500),(0,0,255),5)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

输出结果为:
Alt

注意OpenCV中默认的色彩空间为BGR,所以color参数为(0,0,255)表示的是红色。

1.2 矩形绘制

函数:

img	=	cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType[, shift]]] )

参数:

  1. pt1:矩形的左上角。
  2. pt2:矩形的右下角。
  3. 其余同上条。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512, 512, 3), np.uint8)# 画一个黄色边框的矩形,参数2:左上角坐标,参数3:右下角坐标
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 255), 1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:
在这里插入图片描述
因为矩形是一个闭合的形状,所以我们将 thickness 参数改成 -1,看一下效果:

cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 255), -1)

在这里插入图片描述
它进行了填充操作,即绘制了一个实心的矩形。

1.3 圆绘制

函数:

img	= cv2.circle( img, center, radius, color[, thickness[, lineType[, shift]]] )

参数:

  1. center:圆心位置。
  2. radius:半径大小。
  3. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512, 512, 3), np.uint8)# 画一个填充红色的圆,参数2:圆心坐标,参数3:半径
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下图所示:
在这里插入图片描述

1.4 椭圆的绘制

函数:

img	= cv2.ellipse( img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]]	)

参数:

  1. center:椭圆的中心。
  2. axes:x轴和y轴的大小,即半长、短轴的大小,如(100, 50),即半长轴(x轴方向)为100,半短轴(y轴方向)为50。
  3. angle:旋转角度。
  4. startAngle:绘制的起始角度。
  5. endAngle:绘制的结束角度。
  6. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 在图中心画一个填充的半圆
cv2.ellipse(img, (256, 256), (100, 50), 0, 30, 180, (255, 0, 0), -1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:
在这里插入图片描述
从这个结果也可以进一步知道,起始和结束角度都是按照顺时针方向来算的。

1.5 多边形绘制

函数:

img	= cv2.polylines(	img, pts, isClosed, color[, thickness[, lineType[, shift]]]	)

参数:

  1. pts:表示多边形的点对,具体看下面的例子。
  2. isClosed:布尔型,True表示的是线段闭合,False表示不闭合,即起点和终点的那条线段不链接。
  3. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 定义四个顶点坐标
pts = np.array([[10, 5],  [50, 10], [70, 20], [20, 30]])
print(pts)
print(pts.shape)
# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2))
print(pts)
# 绘制椭圆
cv2.polylines(img, [pts], False, (0, 255, 255))
winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

这里需要将多边形的点对统一为(-1, 1, 2)这种维度的形式,这里的-1是与点的个数相适应的,后面的1和2是表示每个点是有两个坐标(x和y),然后再放入函数中,而且在函数中外面还需要再加上一个中括号使之是列表的形式。

结果如下所示:

[[10  5][50 10][70 20][20 30]]
(4, 2)
[[[10  5]][[50 10]][[70 20]][[20 30]]]

在这里插入图片描述
这是不闭合的情况,下面我们将False改为True,结果为:

cv2.polylines(img, [pts], True, (0, 255, 255))

在这里插入图片描述

1.6 添加文字

img	= cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]	)

参数:

  1. text:待写入的文字。
  2. org:文字的左下角的位置,也叫起点。
  3. fontFace:字体,具体见 OpenCV中的HersheyFonts。在这里插入图片描述
  4. fontScale:字体的缩放比例。
  5. bottomLeftOrigin:若为True,图像的原点在左下角,若为False,则为左上角。
  6. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 添加文字“OpenCV”,起点(50,200)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (50,200), font, 3, (0, 255, 255), 5)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:
在这里插入图片描述

以上就是OpenCV中最常用的绘图函数,下次笔记介绍图像的几何缩放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI英雄 | 论人工智能与自由意志,请看尤瓦尔与李飞飞的这场“激辩”

来源:Towards Data Science尤瓦尔赫拉利和李飞飞在斯坦福大学展开了一场别开生面的对话,他们所提出的问题已经远远超出了我们可以解答的范围。《连线》杂志主编尼古拉斯•汤普森在座无虚席的纪念礼堂主持了这场90分钟的谈话。赫拉利(Harari&a…

OpenCV与图像处理学习四——图像几何变换:平移、缩放、旋转、仿射变换与透视变换

OpenCV与图像处理学习四——图像几何变换:平移、缩放、旋转、仿射变换与透视变换二、图像的几何变换2.1 图像平移2.2 图像缩放(上采样与下采样)2.3 图像旋转2.4 仿射变换2.5 透视变化2.6 几何变化小结续上次的笔记:OpenCV与图像处…

课后作业和动手动脑

一,运行TestInherits.java 通过super调用基类构造方法,必是子类构造方法中的第一个语句。 二.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 构造函数的主要作用…

OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换三、图像滤波与增强3.1 线性滤波3.1.1 方框滤波3.1.2 均值滤波3.1.3 高斯滤波3.1.4 一般卷积滤波3.2 非线性滤波3.2.1 中值滤波3.2.2 双边滤波3.3 图像直方图均衡化3.3.1 单通道…

张钹院士:人工智能技术已进入第三代

来源:经济观察报近日,中科院院士、清华大学人工智能研究院院长张钹教授接受记者采访时认为,目前基于深度学习的人工智能在技术上已经触及天花板。从长远来看,必须得走人类智能这条路,最终要发展人机协同,人…

软件工程作业

典型用户1 名字老陈性别,年龄男,40岁职业教师收入两万/年知识层次和能力本科,熟练计算机操作生活、工作情况教书,辅导孩子完成作业动机,目的,困难希望节省辅导孩子的时间,用于自己的业务工作用户…

numpy.ndarray索引/切片方式

注意:获得多维数组的前三个子数组不能用array[0,1,2],应该用 array[0:3],如下例子: a np.random.random([85, 7794, 64]) b a[0:3] print(np.shape(b)) # (3, 7794, 64)

OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽四、图像形态学操作4.1 腐蚀和膨胀4.1.1 图像腐蚀4.1.2 图像膨胀4.2 开运算与闭运算4.2.1 开运算4.2.2 闭运算4.3 形态学梯度(Gradient)4.4顶帽和黑…

解密硅谷大骗局

来源:硅谷封面企鹅号、腾讯科技在许多为人称道的科技创业故事中,总不乏硅谷的名字。从英特尔、IBM到微软、苹果,从雅虎、谷歌到Twitter、Facebook,这里诞生了很多知名科技企业。对于全球的创业者来说,硅谷就是梦想中的…

OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)一、固定阈值图像分割1.1 直方图双峰法1.2 OpenCV中的固定阈值分割二、自动阈值图像分割2.1 自适应阈值法2.2 迭代法阈值分割2.3 Otsu大津阈值法前面的笔记介绍了一些Op…

Foxmail 绑定企业邮箱

转载于:https://www.cnblogs.com/wu628/p/4955017.html

边缘计算将吞掉云计算!

来源:CSDN以下为译文:边缘计算已成为物联网的重要趋势。高德纳咨询公司认为边缘计算是2019年的一项技术趋势。各个物联网公司发现在将数据发送到云之前,通过边缘计算处理数据有很大的好处。最近Micron/Forrester的调查证实了这一趋势&#xf…

OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)一、图像梯度1.1 梯度1.2 图像梯度二、梯度图与梯度算子2.1模板卷积2.2 梯度图2.3 梯度算子2.3.1 Roberts交叉算子2.3.2 Prewitt算子2.3.3 Sobel算子三、Canny边缘检测算法(代码实现&a…

面向人工智能的计算机体系结构

来源:计算机研究与发展前 言近几年来人工智能技术的飞速发展使得其应用迅猛扩大,而传统的计算机体系结构对于面向人工智能的应用在处理速度、能耗、使用的方便性等方面有着诸多不足。随着人工智能应用的发展,面向人工智能的体系结构成为体系结…

OpenCV与图像处理学习九——连通区域分析算法(含代码)

OpenCV与图像处理学习九——连通区域分析算法(含代码)一、连通区域概要二、Two-Pass算法三、代码实现一、连通区域概要 连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域&#x…

(180页PPT)|清华大学孙富春教授深度讲解: 人工智能技术与产业发展

来源:精智工厂[导读】本文是清华大学孙富春教授在机械工业出版社讲座交流PPT,孙教授从背景与历史、深度学习、脑认知、产业(装备)发展、发展趋势等五个方面详细解读了人工智能技术与产业发展。未来智能实验室是人工智能学家与科学…

OpenCV与图像处理学习十——区域生长算法(含代码)

OpenCV与图像处理学习十——区域生长算法(含代码)一、区域生长算法概要二、区域生长算法原理三、代码应用一、区域生长算法概要 区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入…

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated

使用scipy模块时出现警告:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)] instead of arr[seq]. In the future this will be interpreted as an array index, arr[np.array(seq)], which will resu…

一文看懂中国MEMS传感器产业链

来源:通信产业网物联网对促进我国经济发展、优化产业结构具有重大的战略意义。而在整个物联网生态中,MEMS传感器扮演着越来越重要的角色,在即将到来的智能物联网时代中将起到核心作用,为新科技产品提供更智能、更敏锐的感知能力。…

OpenCV与图像处理学习十一——分水岭算法(含代码)

OpenCV与图像处理学习十一——分水岭算法(含代码)一、分水岭算法概要二、分水岭算法步骤三、代码应用一、分水岭算法概要 任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方是山谷。 给每个孤立的山谷&…