当前位置: 首页 > news >正文

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(当前帧的图像数据)。如果 retFalse,通常表示视频已经结束或读取失败。

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&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…...

C语言 | Leetcode C语言题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; 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学习第十三篇 - 泛型

在编译期间不确定变量的类型&#xff0c;在调用时&#xff0c;由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型&#xff1f; function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候&#xff0c;无…...

工业智能网关在汽车制造企业的应用价值及功能-天拓四方

随着工业互联网的飞速发展&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本&#xff0c;深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…...

LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140992533 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ollama 是一个开源的大型语言模型(LLM)服务工具,目的是简化本地运行…...

重启人生计划-积蓄星火

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 如果你觉得这个【重启人生…...

2024.08.11 校招 实习 内推 面经

地/球&#x1f30d; &#xff1a; neituijunsir 交* 流*裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 比亚迪将采购华为智驾系统&#xff0c;用于方程豹新款越野车&#xff1b;英特尔发布第一代车载独立显卡&#xff1b;黑芝麻智能上市首日破发大跌 自动…...

LCA(Lowest Common Ancestor)

LCA&#xff08;Lowest Common Ancestor&#xff09; 定义 在树上取两点 x,yx,y&#xff0c;他们的 LCA 为距离他们最近的公共祖先。 本章主要讲的是倍增求 LCA。 暴力求取 从 xx 开始向上移动到根结点&#xff0c;并标记沿途结点。从 yy 开始向上移动到根结点&#xff0c…...

张钹院士:大模型时代的企业AI发展趋势

在当今技术迅速发展的时代&#xff0c;生成式人工智能与大模型正成为推动产业变革的重要力量。随着AI技术的不断成熟与普及&#xff0c;它的应用已从个人领域扩展至企业层面&#xff0c;广泛覆盖各行各业。 那么&#xff0c;新技术究竟会给产业带来哪些积极地影响&#xff1f;…...

php连接sphinx的长连接事宜以及sphinx的排除查询以及关于sphinx里使用SetSelect进行复杂的条件过滤或复杂查询

一、php连接sphinx的长连接事宜以及sphinx的排除查询 在使用php连接sphinx时&#xff0c;默认的sphinx连接非长连接&#xff0c;于是在想php连接sphinx能否进行一些优化 publish:January 9, 2018 -Tuesday: 方法&#xff1a;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…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...