opencv入门笔记(一)

news2024/9/26 1:15:58

目录

  • 图像处理基本操作
    • 图像读取
    • 图像显示
    • 图像保存
    • 图像翻转
    • 图像缩放
  • 如何绘制简单的图形
    • 绘制线段
      • 示例(在画布上绘制线段)
    • 绘制矩形
      • 示例(标记图片中的花朵位置)
    • 绘制圆形
      • 示例(同心圆绘制)
    • 绘制多边形
      • 示例(绘制两个六边形)
    • 绘制文字
      • 示例(绘制文字)
  • 阈值处理函数
    • 阈值处理类型
    • 示例:查看各种阈值处理的效果
    • 自适应阈值函数
    • 示例(自适应阈值处理效果)
  • To be continue...

图像处理基本操作

图像读取

cv2.imread(filename[, flags]) 

读取图像,返回该图像的像素值

参数描述
filename图片文件名(路径中不要有中文)
flags(可选参数值)
大于0时返回3通道彩色图像
等于0时返回灰度图像

返回值类型:numpy.ndarray

图像显示

cv2.imshow(winname,mat)

生成一个窗口,显示图像

参数描述
winname生成窗口的名称
mat待显示的图像

图像保存

cv2.imwrite(filename, image[, params])

将处理后的图像保存为文件

参数描述
filename要保存的图像文件名
image要保存的图像(数组)

图像翻转

cv2.flip(src, flipCode[, dst])
参数描述
src原始图像
flipCode翻转类型
flipCode=0:沿着x轴翻转
flipCode>0:沿着y轴翻转
flipCode<0:同时沿着xy轴翻转

图像缩放

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 
参数描述
src原始图像
dsize目标图像大小
dst目标图像
fx水平方向缩放比例
fy竖直方向缩放比例

如何绘制简单的图形

绘制线段

cv.line(img, pt1, pt2, color, thickness=1, lineType=8, shift=0) 
参数描述
img图像或画布
pt1线段起点(x,y)
pt2线段终点(x,y)
color线段颜色
thickness线段宽度

示例(在画布上绘制线段)

import numpy as np
import cv2


canvas=np.zeros((500,300,3),np.int8)

canvas=cv2.line(canvas,(50,50),(250,50),(255,0,0),5)
canvas=cv2.line(canvas,(150,50),(0,200),(0,255,0),10)
canvas=cv2.line(canvas,(0,200),(300,200),(0,0,255),15)
canvas=cv2.line(canvas,(300,200),(150,50),(255,0,0),20)
canvas=cv2.line(canvas,(150,200),(150,500),(255,255,0),25)

cv2.imwrite('../imgs/draw_lines.jpg',canvas)

运行结果
在这里插入图片描述

绘制矩形

cv.rectangle(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
参数描述
img图像或画布
pt1矩形左上角坐标(x,y)
pt2矩形右下角坐标(x,y)
color线段颜色
thickness线段宽度,当该值小于0时将绘制一个实心矩形

示例(标记图片中的花朵位置)

import cv2

img=cv2.imread('../imgs/R-C_resize.jpg')
# 生成一个空心矩形
canvas=cv2.rectangle(img,(50,23),(347,286),(0,0,255),1)
# 生成两个实心矩形
canvas=cv2.rectangle(canvas,(10,23),(40,53),(0,0,255),-1)
canvas=cv2.rectangle(canvas,(10,256),(40,286),(0,0,255),-1)
cv2.imwrite('rect_img.jpg',canvas)

运行结果
在这里插入图片描述

绘制圆形

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
参数描述
img图像或画布
center圆心坐标
radius圆半径
color线段颜色
thickness线段宽度,当该值小于0时将绘制一个实心圆

示例(同心圆绘制)

import cv2
import numpy as np

#生成画布
canvas=np.zeros((500,600,3),np.uint8)
# 定义参数
radius=180
color=(255,255,255)
for i in range(4):
    canvas=cv2.circle(canvas,(300,250),radius,color,10)
    radius-=30
canvas=cv2.circle(canvas,(300,250),radius,color,-1)
cv2.imwrite('circle.jpg',canvas)

运行结果
在这里插入图片描述

绘制多边形

cv.polyLine(img, polys, isClosed, color, thickness=1, lineType=8, shift=0)
参数描述
img图像或画布
polys由多边形各个顶点组成的列表
isClosed多边形是否闭合
color线段颜色
thickness线段宽度

示例(绘制两个六边形)

import cv2
import numpy as np
polys = np.array([[(200, 200),
                   (400, 200),
                   (500, 200 + 100 * np.sqrt(3)),
                   (400, 200 + 200 * np.sqrt(3)),
                   (200, 200 + 200 * np.sqrt(3)),
                   (100, 200 + 100 * np.sqrt(3))]],dtype=np.int32)
canvas = np.zeros((999, 999, 3), np.uint8)
canvas = cv2.polylines(canvas, [polys], isClosed=True, color=(255, 255, 255),thickness=10)
canvas = cv2.polylines(canvas, [polys+300], isClosed=True, color=(255, 255, 255),thickness=10)
cv2.imwrite('../imgs/polys.jpg', canvas)

运行结果
在这里插入图片描述

运行过程中的一个报错:p.checkVector(2, CV_32S) >= 0 in function ‘cv::polylines’
原因:上面的代码中顶点坐标出现了 3 \sqrt3 3 ,使用dtype参数将其转化为整数即可

绘制文字

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, linetype[, bottomLeftOrigin]]])
参数描述
img图像或画布
text要绘制的文字内容
org文字字符串左下角坐标
fontFace字体样式
fontSacle字体大小
color字体颜色

示例(绘制文字)

import cv2
import numpy as np
# 生成画布
canvas=np.zeros((240,240,3),np.uint8)

cv2.putText(canvas,'hello',(20,60),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,2,(0,255,0),5)
cv2.putText(canvas,'hello',(20,120),cv2.FONT_ITALIC+cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,0),5)
cv2.putText(canvas,'hello',(20,180),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,0),5)
cv2.imwrite('../imgs/font_img.jpg',canvas)

运行结果
在这里插入图片描述

阈值处理函数

cv2.threshold(src, thresh, maxval, type[, dst])
参数描述
src被处理的图像
thresh阈值
maxval最大阈值
type阈值处理类型
dst经阈值处理后的图像

阈值处理类型

在这里插入图片描述

阈值处理类型描述范围
cv2.THRESH_BINARY二值化像素值>thresh时,取maxval,否则取00或maxval
cv2.THRESH_BINARY_INV反二值化像素值>thresh时,取0,否则取maxval0或maxval
cv2.THRESH_TRUNC截断阈值处理像素值>thresh时,取阈值,否则像素值不变原始像素值或阈值
cv2.THRESH_TOZERO低于阈值零处理像素值>thresh时,像素值不变,否则取00或原始像素值
cv2.THRESH_TOZERO_INV高于阈值零处理像素值>thresh时,像素值取0,否则像素值不变0或原始像素值

示例:查看各种阈值处理的效果

import cv2
import matplotlib.pyplot as plt
import matplotlib

plt.subplots_adjust(hspace=0.5)
matplotlib.rcParams['font.family']='SimHei'
img=cv2.imread('../imgs/R-C_resize.jpg')

plt.subplot(321)
plt.title('原始图像')
plt.imshow(img)

plt.subplot(322)
plt.title('二值化')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_BINARY)[1])

plt.subplot(323)
plt.title('反二值化')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)[1])

plt.subplot(324)
plt.title('低于阈值零处理')# 低于阈值的像素值归零
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TOZERO)[1])

plt.subplot(325)
plt.title('高于阈值零处理')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TOZERO_INV)[1])

plt.subplot(326)
plt.title('截断处理')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TRUNC)[1])

plt.show()

运行结果
在这里插入图片描述

注意:在这里笔者使用的是plt.imshow()函数来展示阈值处理后的图像,当你是用cv2.imshow()函数来展示这些图像时,你会发现两者相别很大,后者显示的图像内容如下,这是因为open默认使用BGR通道,但是matplotlibt默认使用RGB通道,所以会造成这种情况,解决这一问题很简单,在plt.imshow()时加入参数cmap='gray'即可

在这里插入图片描述

自适应阈值函数

阈值根据指定方法进行计算

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) 
参数描述
src待处理的图像
maxValue阈值处理最值
adaptiveMethod自适应阈值计算方法
thresholdType阈值处理类型
dst经过处理后的图像

阈值处理类型

在这里插入图片描述

阈值计算方法

在这里插入图片描述

示例(自适应阈值处理效果)

import cv2
import matplotlib.pyplot as plt
plt.subplots_adjust(hspace=0.5)
import matplotlib
matplotlib.rcParams['font.family']='SimHei'

img=cv2.imread('../imgs/R-C_resize.jpg')
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 将图像转换为灰度
MEAN_img=cv2.adaptiveThreshold(gray_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,2)

GAUSSION_img=cv2.adaptiveThreshold(gray_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,2)

plt.subplot(221)
plt.title('原图像')
plt.imshow(img)

plt.subplot(222)
plt.title('MEAN')
plt.imshow(MEAN_img,cmap='gray')

plt.subplot(223)
plt.title('GAUSSION')
plt.imshow(GAUSSION_img,cmap='gray')


plt.show()

运行结果
在这里插入图片描述

To be continue…

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

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

相关文章

Linux4._冯•诺依曼体系结构

文章目录[toc]1. 硬件结构2. 工作方式3. 存储器结构4. 局部性原理5. 实例分析早期的 ENIAC 计算机存储容量很小&#xff0c;编程采用线路连接方式&#xff0c;很不方便。1946年&#xff0c;数学家 冯•诺依曼 提出了以存储程序为核心的计算机模型&#xff0c;该计算机模型一直沿…

[附源码]计算机毕业设计在线影院系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计

Java8对数据处理可谓十分流畅&#xff0c;既不改变数据&#xff0c;又能对数据进行很好的处理&#xff0c;今天给大家演示下&#xff0c;用Java8的Stream如何对数据进行分组统计&#xff0c;排序&#xff0c;求和等 汇总统计方法 找到汇总统计的方法。这些方法属于java 8的汇…

wsl2如何安装systemctl命令,已成功!

打开powershell&#xff0c; 输入wsl 进入子系统(或者以你自己的方式进入子系统) apt install policykit-1 apt install build-essential apt install daemonize cd /tmp git clone http://github.com/bmc/daemonize.git cd daemonize sh configure make sudo make ins…

论文笔记:OpenPrompt: An Open-source Framework for Prompt-learning

论文来源&#xff1a;ACL2022 论文地址&#xff1a;https://aclanthology.org/2022.acl-demo.10.pdf 论文代码&#xff1a;https://github.com/thunlp/OpenPrompt 笔记仅供参考&#xff0c;撰写不易&#xff0c;请勿恶意转载抄袭&#xff01; Abstract 目前&#xff0c;还没…

Flink系列之Flink中Source_Transform_Sink整理和实战

title: Flink系列 二、Flink Source 整理和实战 Flink Source 是程序的数据源输入&#xff0c;可以通过 StreamExecutionEnvironment.addSource(sourceFunction) 来为你的程序添加一个 Source。 Flink 提供了大量的已经实现好的 source 方法&#xff0c;也可以自定义 source&…

译文 | A poor man‘s API

作者&#xff1a;Nicolas Frnkel 翻译&#xff1a;Sylvia https://blog.frankel.ch/poor-man-api/ 在 API 日渐流行的年代&#xff0c;越来越多的非技术人员也希望能从 API 的使用中获利&#xff0c;而创建一套成熟的 API 方案需要时间成本和金钱两方面的资源加持。在这个过程中…

2022re:Invent:亚马逊云科技拥有强大的云原生数据能力

在2022亚马逊云科技re:Invent全球大会上的第三天&#xff0c;Swami博士为大家带来了关于“数据与机器学习如何助力企业构建端到端的数据战略”的解读。亚马逊云科技拥有强大的云原生数据能力&#xff0c;用来帮助企业扩展其数据库和数据分析服务&#xff0c;并确保数据安全与数…

汽车电子电气架构演进驱动主机厂多重变化

已剪辑自: https://mp.weixin.qq.com/s/P56MaFODVc_eZ4JEOVJvfA 汽车电子电气架构&#xff08;EEA&#xff0c;Electrical/Electronic Architecture&#xff09;把汽车中的各类传感器、ECU&#xff08;电子控制单元&#xff09;、线束拓扑和电子电气分配系统整合在一起完成运算…

[附源码]计算机毕业设计JAVA校园求职与招聘系统

[附源码]计算机毕业设计JAVA校园求职与招聘系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myba…

【Matplotlib绘制图像大全】(二十一):Matplotlib为绘图添加注释

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

Maven 的安装与配置

文章目录Maven 简介一&#xff0c;下载Maven二&#xff0c;安装Maven三&#xff0c;配置Maven环境变量Maven 简介 Maven 项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之…

C/C++使用Windows的API实现共享内存以及同步

目录共享内存事件-Event实现思路创建方(服务端)连接方&#xff1a;进程同步&#xff1a;windows的APICreateFileMappingMapViewOfFileCreateEventWaitForSingleObjectCreateThreadOpenFileMapping通过共享内存实现进程间的交互服务端客户端结论共享内存 共享内存指 (shared me…

数据结构和算法之图的遍历

6.2 图的遍历 6.2.1 图的遍历——DFS 遍历&#xff1a;把图里面每个顶点都访问一遍而且不能有重复的访问 深度优先搜索(DFS) 当访问完了一个节点所有的灯后&#xff0c;一定原路返回对应着堆栈的出栈入栈的一个行为 深度优先搜索的算法描述 void DFS(Vertex V)//从迷宫…

Redis面试篇

文章目录1 Redis与Memcache的区别&#xff1f;2 Redis的单线程问题3 Redis的持久化方案由哪些&#xff1f;4 Redis的集群方式有哪些&#xff1f;5 Redis的常用数据类型有哪些&#xff1f;6 聊一下Redis事务机制7 Redis的Key过期策略参考资料&#xff1a;为什么需要内存回收&…

SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮!

一、导入elasticsearch依赖 在pom.xml里加入如下依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>非常重要&#xff1a;检查依赖版本是否…

【图像隐写】DWT数字水印嵌入+攻击+提取【含Matlab源码 1759期】

⛄一、DWT数字水印简介 1 引言 数字水印技术发展迅速&#xff0c;出现了各种水印算法&#xff0c;最低有效位(Least Significant Bit,LSB)数字水印技术是最早的空域水印添加算法&#xff0c;它原理简单且易实现&#xff0c;但鲁棒性差。变换域水印算法大大提高了水印的鲁棒性&…

【微信小程序】博客小程序,静态版本(三)设计和开发首页、个人关于页

【博客小程序】专栏 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;一&#xff09;准备工作 【微信小程序】博客小程序&#xff0c;静态版本&#xff08;二&#xff09;引入 lin-ui 组件、设计和开发文章页 【微信小程序】博客小程序&#xff0c;静态版本&#…

模型推荐丨政务大数据项目案例模型分享

主要工具&#xff1a;Python 技术大类&#xff1a;自然语言处理 主要业务问题&#xff1a; 在社会治理上&#xff0c;政府部门一般通过群众的意见反馈、舆论情绪&#xff0c;掌握社会现状&#xff0c;做好舆情工作&#xff0c;以促进社会长治久安。微博作为有着大量活跃用户…

13 Igress,集群进出流量的总管

文章目录1. 前言2. 为什么要有 Ingress?2.1 Service 的缺点2.2 (Ingress)怎么解决Service 的缺点&#xff1f;3. 为什么要有 Ingress Controller 和 IngressClass?3.1 为什么要有 Ingress Controller&#xff1f;3.1.1 Ingress Controller3.1.1 Ingress Controller 常见公司3…