Opencv+Python图像基本操作

news/2024/11/28 10:49:35/

目录

图像的读取、显示和保存

获取图像属性 

图像截取

 绘图功能

画线

画矩形

画圆圈

画椭圆

         画多边形

向图像添加文本



图像的读取、显示和保存

# 导入 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.ppmy.cn/news/61810.html

相关文章

今天的事务的基础上继续找出错点

今天的事务的基础上继续找出错点 2023-05-05 08:21:40.362 ERROR 5560 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested…

SpringBoot【运维实用篇】---- 日志

SpringBoot【运维实用篇】---- 日志 1. 代码中使用日志工具记录日志教你一招&#xff1a;优化日志对象创建代码 2. 日志输出格式控制3. 日志文件 运维篇最后一部分我们来聊聊日志&#xff0c;日志大家不陌生&#xff0c;简单介绍一下。日志其实就是记录程序日常运行的信息&…

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制&#xff0c;比较官方的定义&#xff1a; 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c; 而这个对象的用途是包含可…

HugNLP发布,集成多种NLP任务,可训ChatGPT类模型

HugNLP发布&#xff0c;集成多种NLP任务&#xff0c;可训ChatGPT类模型 作者&#xff1a;王嘉宁 HugNLP——全面统一的NLP框架开源了&#xff01; 近日&#xff0c;华师大HugAILab团队研发了HugNLP框架&#xff0c;这是一个面向研究者和开发者的全面统一的NLP训练框架&#x…

Java——数组中只出现一次的数字

题目链接 牛客在线oj题——数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解题思路 这道题最简单的解决方法是&#xff1a;使用哈希表记录所有数字出现的次数&#xff0c;然…

【操作系统】总结

依旧是小林coding 的内容 存储架构 现代 CPU 都是多核心的&#xff0c;线程可能在不同 CPU 核心来回切换执行&#xff0c;这对 CPU Cache 不是有利的&#xff0c;虽然 L3 Cache 是多核心之间共享的&#xff0c;但是 L1 和 L2 Cache 都是每个核心独有的&#xff0c;如果一个线…

【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读

文章目录 摘要&#xff08;效果&#xff09;二、前言三、相关工作四、method4.1 多用途4.2 组合性4.3 交互式。4.4 语义感知 五、实验 论文地址&#xff1a;https://arxiv.org/abs/2304.06718 测试代码&#xff1a;https://github.com/UX-Decoder/Segment-Everything-Everywher…

MySQL索引的底层实现原理

索引的底层实现原理 数据库索引是存储在磁盘上的&#xff0c;当数据量大时&#xff0c;就不能把整个索引全部加载到内存了&#xff0c;只能逐一加载每一个磁盘块&#xff08;对应索引树的节点&#xff09;&#xff0c;索引树越低&#xff0c;越“矮胖”&#xff0c;磁盘IO次数…