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)

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG系列之四:深入浅出 Embedding

在 RAG 系列之三:文本切分中介绍了如何将文本切分成更小的语义单元,接下来便是将拆分的文本块进行向量化。 什么是文本向量化? 文本向量化就是将文本数据转成数字数据,例如:将文本 It was the best of times, it was…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论,读者对于context在心中有了一定的理解。但始终觉得少点什么:activity是什么时候被创建的&…

Python数据可视化案例——地图

目录 简单案例: 进阶案例: 继上文数据可视化案例,今天学习用pyecharts练习数据可视化案例2-构建地图。 简单案例: 首先构建一个简单的地图。 代码: import json from pyecharts.charts import MapmapMap() data[…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设残哥 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目、 源…

大数据面试SQL(八):求连续段的起始位置和结束位置

文章目录 求连续段的起始位置和结束位置 一、题目 二、分析 三、SQL实战 四、样例数据参考 求连续段的起始位置和结束位置 一、题目 有一张表t2_id记录了id,id不重复,但是会存在间断,求出连续段的起始位置和结束位置。 样例数据&…

结构体structure、共用体union

目录 结构体 结构体类型的定义形式 结构体类型的大小 内存计算例子 共用体union 用共用体判断大小端 结构体和共用体对比 qsort() 结构体 结构体类型——用来描述复杂数据的一种数据类型 构造类型(用户自定义类型) struc…

CUDA+tensorflow+python+vscode在GPU下环境安装及问题汇总与解答

2024.8.14 因为要做深度学习,需要安装tensorflowgpu的环境,每次都搞不好整的很生气,本次将安装过程中参考的一些大佬的博客和安装过程中遇到的问题及解决方案总结一下,希望以后不要在这件事情上浪费时间。安装环境其实也没有想象中…

Halcon图像平滑与去噪

Halcon图像平滑与去噪 文章目录 Halcon图像平滑与去噪1. 均值滤波2. 中值滤波3. 高斯滤波5. 光照不均匀 有时拍摄的图像中会存在很多杂点和噪声,对于比较均匀的噪声,可以考虑用软件的算法进行 消除。例如,可以用图像平滑的方法进行去噪&#…

uniapp 自定义全局弹窗

自定义全局弹窗可在js和.vue文件中调用&#xff0c;unipop样式不满足&#xff0c;需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…

数学建模——启发式算法(蚁群算法)

算法原理 蚁群算法来自于蚂蚁寻找食物过程中发现路径的行为。蚂蚁并没有视觉却可以寻找到食物&#xff0c;这得益于蚂蚁分泌的信息素&#xff0c;蚂蚁之间相互独立&#xff0c;彼此之间通过信息素进行交流&#xff0c; 从而实现群体行为。 蚁群算法的基本原理就是蚂蚁觅食的过程…

R语言的算数运算

下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容&#xff0c;每篇文章都在 5000 字以上&#xff0c;质量平均分高达 94 分&#xff0c;看全文请点击下面链接&#xff1a; 3章3节&#xff1a;R的赋值操作与算术运算_r 链式赋值-CSDN博客文章浏览阅读172次。掌…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

Windows的cmd命令行使用Linux类命令

Windows的cmd使用Linux类命令 去我的个人博客观看&#xff0c;观感更佳哦&#xff0c;&#x1f619;&#x1f619; 前言 我在使用Vscode编写C/C代码的时候&#xff0c;经常会用到Shell(你可以理解为命令行)&#xff0c;但是我不得不说Windows下Dos命令极其难用且拉跨&#x1f…

灵活易用的树莓派相机和计算机,降低了3D冰川建模的成本!

利兹大学的研究人员正在监测秘鲁的凯尔卡亚冰帽&#xff0c;这是世界上仅有的几个热带冰帽之一。 在欧洲成功进行试验之后&#xff0c;利兹大学地理学院​​​​​​​的研究人员正在安第斯山脉和喜马拉雅山脉使用树莓派计算机和树莓派高品质相机&#xff0c;建立低成本、长期…

C# simd指令之MaskMove

MaskMove指令说明&#xff1a;该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零&#xff0c;则对应的内存位置不会被修改。 MaskMove指令接受三个参数&#xff08;source、mask、address&#xff09;&#xff1a; 源向量…

养生生活视频素材去哪里找?养生系列视频素材网站分享

如何寻找高质量的养生视频素材。无论您是刚入行的新手&#xff0c;还是拥有众多粉丝的资深创作者&#xff0c;优质的养生视频素材都是吸引观众的关键。接下来&#xff0c;我将介绍一些顶级平台&#xff0c;帮助您轻松获取各类养生视频素材。 蛙学网 首先推荐的平台是蛙学网。这…

鸿蒙开发APP应用UX体验标准

基础体验 应用导航 3.1.1.1 系统返回 页面布局 3.1.2.1 布局基础要求 3.1.2.2 挖孔区适配 人机交互 3.1.3.1 避免与系统手势冲突3.1.3.2 典型手势时长设计3.1.3.3 点击热区 视觉风格 3.1.4.1 色彩对比度3.1.4.2 字体大小 3.1.4.3 图标 3.1.4.3.1 应用图标3.1.4.3.2 界…

个体内比较不同自动化背景增强(BPE)评估方法在乳腺MRI中的效果:| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Intraindividual Comparison of Different Methods for Automated BPE Assessment at Breast MRI: 个体内比较不同自动化背景增强&#xff08;BPE&#xff09;评估方法在乳腺MRI中的效果&#xff1a; Background 背景 The level of background parenchymal enh…

flutter 画转盘

import package:flutter/material.dart; import dart:math;const double spacingAngle 45.0; // 每两个文字之间的角度 // 自定义绘制器&#xff0c;ArcTextPainter 用于在圆弧上绘制文字 class ArcTextPainter extends CustomPainter {final double rotationAngle; // 动画旋…

elementplus 二次封装 select 自定义指令上拉加载更多 完美解决 多次接口调用 重新加载数据多次调用数据!!!

效果&#xff1a;&#xff08;名字都是测试数据 随便乱写的 若有冒犯 请联系&#xff09; select 二次封装 网上的这种自定义指令上拉加载更多的实例有很多&#xff0c;但是基本都是有缺陷和问题的。为了记录这个问题 我研究了一天&#xff0c;在今天终于搞定了 呜呜呜。 网上…