opencv基础的图像操作
1.读取图像,显示图像,保存图像
#图像读取、显示与保存
import numpy as np
import cv2
img=cv2.imread('./src/1.jpg') #读取
cv2.imshow("img",img) #显示
cv2.imwrite("./src/2.jpg",img) #保存
cv2.waitKey(0) #让程序进入主循环(让窗口一直渲染)
结果:

2.绘制几何图形
"""
1.绘制直线
cv2.line(img,start,end,color,thickness)
- img:要绘制直线的图像
- Start,end: 直线的起点和终点
- color: 线条的颜色
- Thickness: 线条宽度
2.绘制圆形
cv.circle(img,centerpoint, r, color, thickness)
- img:要绘制圆形的图像
- Centerpoint, r: 圆心和半径
- color: 线条的颜色
- Thickness: 线条宽度,为-1时生成闭合图案并填充颜色3.绘制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
- img:要绘制矩形的图像
- Leftupper, rightdown: 矩形的左上角和右下角坐标
- color: 线条的颜色
- Thickness: 线条宽度
4.向图像中添加文字
cv.putText(img,text,station, font, Fontscale,color,thickness,cv2.LINE_AA)
- img: 图像
- text:要写入的文本数据
- station:文本的放置位置
- font:字体样式
- Fontscale :字体大小
- thickness字体线条宽度
- cv2.LINE_AA
"""
import cv2
import numpy as np
img=cv2.imread('./src/a.png')
cv2.line(img,(10,50),(200,50),(0,255,0),2) #画线
cv2.circle(img,(100,50),20,(0,0,255),2) #画圆
cv2.rectangle(img, (100,20), (30, 50), (255, 0, 0), 2) #画方
#添加文字
cv2.putText(img,'Hello',(100,200),cv2.FONT_ITALIC,1,(255,255,255),4,cv2.LINE_AA)
cv2.imshow("img",img)
cv2.waitKey(0)
结果:

获取并修改图像中的像素点
import cv2
img=cv2.imread('./src/b.png')
px=img[100,100]
print(px)
img[100,100]=[0,0,0]
cv2.imshow("img",img)
cv2.waitKey(0)
结果:

捕获摄像头的实时视频流
cap = cv2.VideoCapture(path)
path视频流资源路径设置为0代表从默认摄像头捕获视频流
ret, frame = cap.read()
从视频流中读取一帧图像,返回两个值:ret(布尔值,表示是否成功读取帧)和 frame(当前帧的图像数据)。如果 ret 为 False,通常表示视频已经结束或读取失败。
import cv2
cap=cv2.VideoCapture(0)
while True:ret,frame=cap.read()print(ret,frame.shape)if ret==False or cv2.waitKey(11)==ord("q"):breakelse:cv2.imshow("camera",frame)
cap.release()
cv2.destroyWindow("camera")
结果:

3.计算机眼中的图像
1.像素
像素是图像的基本单元,每个像素包含图像的颜色和亮度信息。图像由大量像素组成,计算机以二进制格式存储这些像素。在RGB图像中,每个像素由红色(R)、绿色(G)和蓝色(B)三个颜色通道的值组成。这三种颜色的不同组合可以生成各种颜色。在计算机图像处理中,像素值用于表示和处理这些颜色。例如,在“画图”软件中,用户可以通过调整RGB值来自定义颜色。
2.图像
1.二值图像
一幅二值图像是由仅包含0和1两个值的二维矩阵构成,其中“0”通常表示黑色,“1”表示白色。由于每个像素仅取0或1两种值,计算机中二值图像的数据类型通常为1位二进制。二值图像常用于文字识别(OCR)、线条图的处理以及掩膜图像的存储。
2.灰度图
灰度图像中的每个像素代表一个从黑色到白色的亮度级别。虽然理论上每个像素可以表示任意颜色的不同亮度,但通常灰度图像显示的是黑白之间的各种灰度。与黑白图像不同,灰度图像具有多个灰度级别,而黑白图像只有黑色和白色两种颜色。灰度图像通常使用8位来表示每个像素的亮度,提供256级灰度(使用16位则可达到65536级)。

3.彩色图
RGB图像中的每个像素由红色(R)、绿色(G)和蓝色(B)三个分量表示,每个分量的值范围通常是0到255。与索引图像类似,RGB图像也用于显示彩色图像,但与索引图像不同的是,RGB图像的颜色信息直接存储在图像矩阵中。每个像素的颜色由三个8位的分量(R、G、B)组成,其中每个分量都表示为一个8位无符号整数。RGB图像的尺寸由行数M和列数N决定,每个颜色分量分别用M×N的二维矩阵表示。
#生成一个512*512大小的彩色图片 每一个像素点随机颜色
import cv2
import numpy as np #设置尺寸
h,w=512,512
img=np.zeros((h,w,3),dtype=np.uint8) #创建空白的彩色图像(BGR)
img[:]=np.random.randint(0,256,img.shape)#每个像素生成随机BGR值, OpenCV中颜色范围是0-255
cv2.imshow("img",img)
cv2.waitKey(0)

4.灰度实验

1.最大值法
import cv2
import numpy as np
img=cv2.imread('./src/e.png')
print(img)
img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8)
for row in range(img.shape[0]):for col in range(img.shape[1]):img2[row,col]=max(img[row,col][0],img[row,col][1],img[row,col][2])
print(img2.shape,img2)
cv2.imshow("img2",img2)
cv2.imshow("img",img)
cv2.waitKey(0)
结果:
2.平均值法
import cv2
import numpy as np
img=cv2.imread('./src/e.png')
print(img)
img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8)
for row in range(img.shape[0]):for col in range(img.shape[1]):img2[row, col] = int((img[row, col][0]/3 + img[row, col][1]/3 + img[row, col][2]/3) )
print(img2.shape,img2)
cv2.imshow("img2",img2)
cv2.imshow("img",img)
cv2.waitKey(0)
结果:
3.加权均值法
import cv2
import numpy as np
img=cv2.imread('./src/e.png')
print(img)
img2=np.zeros((img.shape[0],img.shape[1],1),dtype=np.uint8)
wr = 0.299
wg = 0.587
wb = 0.114
for row in range(img.shape[0]):for col in range(img.shape[1]):img2[row, col] = (int(img[row,col][0]*wr) + int(img[row,col][1]*wg) + int(img[row,col][2]*wb))
print(img2.shape,img2)
cv2.imshow("img2",img2)
cv2.imshow("img",img)
cv2.waitKey(0)
结果:
4.两个极端的灰度值

5.二值化实验

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img = cv2.imread('./src/c.png', cv2.IMREAD_GRAYSCALE)
# 1. 阈值法(THRESH_BINARY)
_, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 2. 反阈值法(THRESH_BINARY_INV)
_, binary_inv = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# 3. 截断阈值法(THRESH_TRUNC)
_, trunc = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# 4. 低阈值零处理(THRESH_TOZERO)
_, tozero = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
# 5. 超阈值零处理(THRESH_TOZERO_INV)
_, tozero_inv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
# 6. OTSU阈值法
_, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 创建一个 2x3 的网格布局
fig, axs = plt.subplots(2, 3, figsize=(12, 8))
# 绘制每个处理结果
axs[0, 0].imshow(binary, cmap='gray')
axs[0, 0].set_title('THRESH_BINARY')
axs[0, 0].axis('off')
axs[0, 1].imshow(binary_inv, cmap='gray')
axs[0, 1].set_title('THRESH_BINARY_INV')
axs[0, 1].axis('off')
axs[0, 2].imshow(trunc, cmap='gray')
axs[0, 2].set_title('THRESH_TRUNC')
axs[0, 2].axis('off')
结果:

6.自适应二值化
1.取均值
import cv2
img=cv2.imread('./src/b.png',cv2.IMREAD_GRAYSCALE)
print(img)
re=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2)
print(re)
cv2.imshow("img",img)
cv2.imshow("img",re)
cv2.waitKey(0)
结果:

2.加权求和
#加权求和法(正态函数) import numpy as np import cv2 arr=np.random.random((30,30))*10 print(arr)
3.高斯分布
#加权法(高斯分布)
import cv2
img_data=cv2.imread("./src/b.png",cv2.IMREAD_GRAYSCALE)
print(img_data)
re=cv2.adaptiveThreshold(img_data,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2)
# print(re)
cv2.imshow("img_data",img_data)
cv2.imshow("img",re)
cv2.waitKey(0)
结果:

相关文章:
opencv基础的图像操作
1.读取图像,显示图像,保存图像 #图像读取、显示与保存 import numpy as np import cv2 imgcv2.imread(./src/1.jpg) #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让…...
Java | Leetcode Java题解之第337题打家劫舍III
题目: 题解: class Solution {public int rob(TreeNode root) {int[] rootStatus dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node null) {return new int[]{0, 0};}int[] l dfs(node.left);i…...
本地查看的Git远程仓库分支与远程仓库分支数量不一致
说明:一次,在IDEA中想切换到某分支,但是查看Remote没有找到要切换的分支,但是打开GitLab,查看远程仓库,是有这个分支的。 解决:1)在IDEA的Git中,点下面Fatch获取一下远程…...
opencv-python实战项目九:基于拉普拉斯金字塔的图像融合
文章目录 一,简介:二,拉普拉斯金字塔介绍:三,算法实现步骤3.1 构建融合拉普拉斯金字塔3.2 融合后的拉普拉斯金字塔复原: 四,整体代码实现:五,效果: 一&#x…...
浅谈JDK
JDK(Java Development Kit) JDK是Java开发工具包,是Java编程语言的核心软件开发工具。 JDK包含了一系列用于开发、编译和运行Java应用程序的工具和资源。其中包括: 1.Java编译器(javac):用于将Java源代码编译成字节…...
爬虫案例3——爬取彩票双色球数据
简介:个人学习分享,如有错误,欢迎批评指正 任务:从500彩票网中爬取双色球数据 目标网页地址:https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下: 我们的任务是将上图中…...
C++ | Leetcode C++题解之第337题打家劫舍III
题目: 题解: struct SubtreeStatus {int selected;int notSelected; };class Solution { public:SubtreeStatus dfs(TreeNode* node) {if (!node) {return {0, 0};}auto l dfs(node->left);auto r dfs(node->right);int selected node->val…...
软件架构设计师-UML知识导图
软件架构设计师-UML知识导图,包含如下内容: 结构化设计,包含结构化设计的概念、结构化设计的主要内容、概要设计、详细设计及模块设计原则;UML是什么:介绍UML是什么;UML的结构:构造块、公共机制…...
在使用transformers和pytorch时出现的版本冲突的问题
在使用transformers和torch库的时候,出现了以下问题: 1、OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\Program Files\anaconda3\envs\testenv\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 2、…...
uniapp粘贴板地址识别
1: 插件安装 主要是依靠 address-parse 这个插件: 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2:html部分 <view class""><view class&quo…...
C语言 | Leetcode C语言题解之第335题路径交叉
题目: 题解: bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…...
TypeScript学习第十三篇 - 泛型
在编译期间不确定变量的类型,在调用时,由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型? function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候,无…...
工业智能网关在汽车制造企业的应用价值及功能-天拓四方
随着工业互联网的飞速发展,工业智能网关作为连接物理世界与数字世界的桥梁,正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本,深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…...
LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140992533 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ollama 是一个开源的大型语言模型(LLM)服务工具,目的是简化本地运行…...
重启人生计划-积蓄星火
🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…...
2024.08.11 校招 实习 内推 面经
地/球🌍 : neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 比亚迪将采购华为智驾系统,用于方程豹新款越野车;英特尔发布第一代车载独立显卡;黑芝麻智能上市首日破发大跌 自动…...
LCA(Lowest Common Ancestor)
LCA(Lowest Common Ancestor) 定义 在树上取两点 x,yx,y,他们的 LCA 为距离他们最近的公共祖先。 本章主要讲的是倍增求 LCA。 暴力求取 从 xx 开始向上移动到根结点,并标记沿途结点。从 yy 开始向上移动到根结点,…...
张钹院士:大模型时代的企业AI发展趋势
在当今技术迅速发展的时代,生成式人工智能与大模型正成为推动产业变革的重要力量。随着AI技术的不断成熟与普及,它的应用已从个人领域扩展至企业层面,广泛覆盖各行各业。 那么,新技术究竟会给产业带来哪些积极地影响?…...
php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询
一、php连接sphinx的长连接事宜以及sphinx的排除查询 在使用php连接sphinx时,默认的sphinx连接非长连接,于是在想php连接sphinx能否进行一些优化 publish:January 9, 2018 -Tuesday: 方法:public bool SphinxClient::open ( void ) — 建立到…...
抓包分析排查利器TCPdump
tcpdump命令介绍与常规用法。 基础命令介绍 # 固定语法 -i 指定网卡名称 -nn 显示IP地址 -w 指定输出的文件名称 tcpdump -i eth0 -nn -w test.cap-nn 不把主机的网络地址与协议转换成名字 -w 把数据包数据写入指定的文件 and 连接参数 host 指明主机 port 指明端口 src 源IP…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
