Opencv+Python图像基本操作

news2024/12/24 21:10:55

目录

图像的读取、显示和保存

获取图像属性 

图像截取

 绘图功能

画线

画矩形

画圆圈

画椭圆

         画多边形

向图像添加文本



图像的读取、显示和保存

# 导入 OpenCV
import cv2
# 读取图片-与python文件相同目录
img = cv2.imread("image.png", cv2.NORM_HAMMING)
# 显示窗口命名 0表示cv2.WINDOW_NORMAL
cv2.namedWindow("demo",0)
# 窗口调整大小
cv2.resizeWindow("demo", 400, 500)
# 显示加载的图像
cv2.imshow("demo", img)
# 窗口保持显示(回车键可关闭窗口)
cv2.waitKey(-1)
# 销毁所有窗口
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("D:\\demo.png", img)

cv2.imread()cv2.imshow()cv2.imwrite()分别表示读取图片,显示图片,写入图片 

  • retval = cv2.imread(文件名 [,显示控制参数])
  1. cv2.IMREAD_UNCHANGED:不改变,原始图像
  2. cv2.IMREAD_GRAYSCALE:灰度
  3. cv2.IMREAD_COLOR:彩色
  • Nonc = cv2.imshow(窗口名, 图像变量名)
  • retval = cv2.waitKey([delay])
    delay 说明:

    delay > 0 :等待 delay 毫秒

    delay < 0 :等待键盘单击

    delay = 0 :无限等待

  • cv2.destroyAllWindows()
    销毁所有窗口,清除内存的缓存

获取图像属性 

img.shape  img.dtype  img.size

OpenCV像素通道就按照B、G、R的顺序存放   B->BLUE 蓝色  G->Green 绿色  R->RED红色

# 导入 OpenCV
import cv2
# 读取图片-与python文件相同目录
img = cv2.imread("image.png", cv2.NORM_HAMMING)
#获取图像形状
print(img.shape) #打印结果:(2732, 1878, 3)  表示 高 宽 通道数  (h,w,c)
print(len(img)) #打印高:2732
print(len(img[0]))#打印高:1878
#获取图像类型
print(img.dtype) #打印结果:uint8
#获取图像像素个数
print(img.size)  #打印结果:15392088

uint8表示无符号整数,没有符号位,8个比特位全部用来表示整数,所以数据范围是0到255。

可以用比较小的图片直观的看下打印出来的矩阵

eg:(4,2,3)的矩阵

import numpy as np
a = np.array([
    [[1, 2, 3], [4, 5, 6]],
    [[1, 2, 3], [4, 5, 6]],
    [[1, 2, 3], [4, 5, 6]],
    [[1, 2, 3], [4, 5, 6]]
])
print (a.shape)  # (4,2,3 )

图像截取

# 导入 OpenCV
import cv2
# 读取图片-与python文件相同目录
img = cv2.imread("test1.jpg", cv2.NORM_HAMMING)
cv2.imshow("test",img)
cv2.waitKey(-1)
# 销毁所有窗口
cv2.destroyAllWindows()
#表示 高取190到380像素的点,宽取340到410像素点
img = img[190:380,340:410]
cv2.imwrite("test11.jpg",img)
cv2.imshow("test",img)
cv2.waitKey(-1)
# 销毁所有窗口
cv2.destroyAllWindows()

运行效果

原始图片

         截取后的图片=>  

 绘图功能

OpenCV绘制不同的几何形状

包括cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()

画线

要绘制一条线,您需要传递线的开始和结束坐标。我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一条厚度为5的蓝色对角线
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.imshow("test",img)
cv.waitKey(-1)
# 销毁所有窗口
cv.destroyAllWindows()

运行效果==>

numpy.zeros(shape, dtype=float)

各个参数意义:
shape:创建的新数组的形状(维度)。
dtype:创建新数组的数据类型。
返回值:给定维度的全零数组。

创建白色画布    img = np.zeros((512,512,3), np.uint8)+255

画矩形

要绘制矩形,您需要矩形的左上角和右下角。这次,我们将在图像的右上角绘制一个绿色矩形

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)+255
print(img)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.imshow("test",img)
cv.waitKey(-1)
# 销毁所有窗口
cv.destroyAllWindows()

画圆圈

要绘制一个圆,需要其中心坐标和半径

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)+255
print(img)
cv.circle(img,(447,63), 63, (0,0,255), -1)
cv.imshow("test",img)
cv.waitKey(-1)
# 销毁所有窗口
cv.destroyAllWindows()

 

画椭圆

要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。下一个参数是轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
print(img)
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
cv.imshow("test",img)
cv.waitKey(-1)
# 销毁所有窗口
cv.destroyAllWindows()

 画多边形

要绘制多边形,首先需要顶点的坐标。将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,并且其类型应为int32。在这里,我们绘制了一个带有四个顶点的黄色小多边形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

注意 如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状。 cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。所有线条将单独绘制。与为每条线调用**cv.line**相比,绘制一组线是一种更好,更快的方法。

向图像添加文本

要将文本放入图像中,需要指定以下内容。 - 您要写入的文字数据 - 您要放置它的位置坐标(即数据开始的左下角)。 - 字体类型(检查**cv.putText**文档以获取受支持的字体) - 字体比例(指定字体大小) - 常规的内容,例如颜色,厚度,线条类型等。为了获得更好的外观,建议使用lineType = cv.LINE_AA

import numpy as np
import cv2 as cv
# 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
print(img)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
cv.imshow("test",img)
cv.waitKey(-1)
# 销毁所有窗口
cv.destroyAllWindows()

 

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

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

相关文章

Java版本工程项目管理系统源码,助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

实验10 人工神经网络(1)

1. 实验目的 ①理解并掌握误差反向传播算法&#xff1b; ②能够使用单层和多层神经网络&#xff0c;完成多分类任务&#xff1b; ③了解常用的激活函数。 2. 实验内容 ①设计单层和多层神经网络结构&#xff0c;并使用TensorFlow建立模型&#xff0c;完成多分类任务&#xf…

第四范式AIGC的野心,改变软件行业游戏规则

图片AI算法提供&#xff1a;Midjourney 在国内众多发布大模型的科技企业中&#xff0c;第四范式入局的方式与众不同。 “我们并不需要完整地对标OpenAI&#xff0c;也并不需要OpenAI能做什么就一定要做什么……我们不去参与一场全面的竞争&#xff0c;而是专注于其中一场比赛。…

关联分割点云中的实例和语义<论文>

题目&#xff1a;Associatively Segmenting Instances and Semantics in Point Clouds 代码&#xff1a;https://github.com/WXinlong/ASIS 文章讨论&#xff1a; Instances Segmentation 和 Semantics Segmentation 实例Instances Segmentation&#xff1a;分辨出每个单独事…

帮助中心对企业有用吗?要不要做帮助中心页面

对绝大部分企业来说&#xff0c;打造站点帮助中心平台已是当下势不可挡的发展趋势。本文小编将告诉大家企业是否有必要做帮助中心&#xff0c;如何制作帮助中心。 什么是帮助中心&#xff1a; 帮助中心定位&#xff1a;帮助用户更好的解决问题&#xff1b;给新手用户好的第一…

详解c++---模拟实现stack和queue

目录标题 设计模式stack的模拟实现准备工作各种函数的实现 queue的模拟实现准备工作queue的接口实现 deque的介绍为什么会有dequedeque的原理deque的迭代器为什么使用deque 设计模式 设计模式分为两个&#xff1a;迭代器模式和适配器模式 第一个&#xff1a;迭代器模式 迭代器…

vector、deque、list相关知识点

vector erase返回迭代器指向删除元素后的元素insert返回迭代器指插入的元素reserve只给容器底层开指定大小内存空间&#xff0c;并不添加新元素 deque 底层数据结构 动态开辟的二维数组&#xff0c;一维数组从2开始&#xff0c;以2倍方式扩容&#xff0c;每次扩容和&#x…

【STM32CubeMX】F103独立看门狗

前言 本文记录了我学习STM32CubeMX的过程&#xff0c;方便以后回忆。我们使用的开发板是基于STM32F103C6T6的。本章记录了独立看门狗的使用配置。要学习的话&#xff0c;注意流程一说的&#xff0c;省略的内容。 基础 独立看门狗(WWDG)开启后&#xff0c;复位自动开启。独立看…

Linux shell编程 函数

shell函数的定义 function 函数名 {命令序列 } 函数名() {命令序列 } 函数的返回值 return表示退出函数并返回一个退出值&#xff0c;脚本中可以用$&#xff1f;变量显示该值 使用原则 1.函数一退出就取返回值&#xff0c;英文$?变量只会返回执行的最后一条指令的退出状态码 2…

基于Redis的Stream结构作为消息队列,实现异步秒杀下单

文章目录 1 认识消息队列2 基于List实现消息队列3 基于PubSub的消息队列4 基于Stream的消息队列5 基于Stream的消息队列-消费者组6 基于Redis的Stream结构作为消息队列&#xff0c;实现异步秒杀下单 1 认识消息队列 什么是消息队列&#xff1a;字面意思就是存放消息的队列。最…

2.4G无线麦克风无线音频传输模块

模块概述 M01主要是一个2.4G无线音频传输模块&#xff0c;模组RF电路设计配合独有的软件跳频机制&#xff0c;有效提高了RF的抗干扰能力及传输距离。模组内置高性能的音频转换器&#xff0c;支持48K/24bit高品质的音频采样、支持麦克风的主动降噪&#xff0c;实现了无压缩的数字…

设计模式:SOLID原则

单一职责原则 Single Responsibility Principle&#xff08;SRP&#xff09; 接口职责应该单一&#xff0c;不要承担过多的职责。 开放封闭原则 Open Closed Principle&#xff08;OCP&#xff09; 添加一个新的功能应该是&#xff0c;在已有代码基础上扩展代码&#xff08;…

mysql——索引,一篇说清!

直观感受——数据准备 建表与插入数据 CREATE TABLE user (uid int(11) NOT NULL AUTO_INCREMENT,name varchar(50) DEFAULT NULL,pwd varchar(50) DEFAULT NULL,create_time datetime DEFAULT NULL,modify_time timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT…

VSCode For Web 深入浅出 -- 插件加载机制

最近我在浏览 VSCode for web 的 repo&#xff0c;在最近更新的一些 commit 中发现了一个新的 VSCode 插件特性支持&#xff0c;名为 webOpener&#xff0c;它的作用是什么呢&#xff1f;又是如何影响插件加载的呢&#xff1f;在这一篇中我们结合 VSCode For Web 的插件加载机制…

大项目准备(2)

目录 中国十大最具发展潜力城市 docker是什么&#xff1f;能介绍一下吗&#xff1f; 中国十大最具发展潜力城市 按照人随产业走、产业决定城市兴衰、规模经济和交通成本等区位因素决定产业布局的基本逻辑&#xff0c;我们在《中国城市发展潜力排名&#xff1a;2022》研究报告…

uniapp和小程序如何分包,详细步骤手把手(图解)

一、小程序分包 每个使用分包小程序必定含有一个主包。所谓的主包&#xff0c;即放置默认启动页面/TabBar 页面&#xff0c;以及一些所有分包都需用到公共资源/JS 脚本&#xff1b;而分包则是根据开发者的配置进行划分。 在小程序启动时&#xff0c;默认会下载主包并启动主包…

C++学习day--11 程序员必备工具--github

github 的重要性&#xff1a; 网络时代的程序员必备。 github 的作用&#xff1a; 1. 版本管理 2. 多人协作 3. 开源共享 常用方案&#xff1a; gitTortoiseGitgithub [Tortoise &#xff0c;程序员常称其为小乌龟&#xff0c;小海龟 ] 安装配置步骤 1. 注册 h…

13 KVM虚拟机配置-配置虚拟设备(总线配置)

文章目录 13 KVM虚拟机配置-配置虚拟设备&#xff08;总线配置&#xff09;13.1 概述13.2 元素介绍13.3 配置示例 13 KVM虚拟机配置-配置虚拟设备&#xff08;总线配置&#xff09; 13.1 概述 总线是计算机各个部件之间进行信息通信的通道。外部设备需要挂载到对应的总线上&a…

MySQL调优系列(四)——执行计划

一、概述 sql语句是有具体的执行过程的&#xff0c;通过查看这个执行过程&#xff0c;可以针对性的优化某一步骤&#xff0c;以加快SQL语句的执行效率。 通过MySQL调优系列&#xff08;一&#xff09;——性能监控我们可以知道&#xff0c;有一个查询优化器&#xff0c;查询优…

HTTP第五讲——搭建HTTP实验环境

HTTP简介 HTTP 协议诞生于 30 年前&#xff0c;设计之初的目的是用来传输纯文本数据。但由于形式灵活&#xff0c;搭配URI、HTML 等技术能够把互联网上的资源都联系起来&#xff0c;构成一个复杂的超文本系统&#xff0c;让人们自由地获取信息&#xff0c;所以得到了迅猛发展。…