当前位置: 首页 > 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)

结果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 再见Figma!!新的设计,代码协作神器!【送源码】
  • C#单例模式
  • HTML5+JavaScript绘制彩虹和云朵
  • GNU/Linux - copy_{to,from}_user: 用户和内核空间的内存互拷贝
  • C++中的IO流
  • oracle使用sql生成表结构文档
  • 虚拟人实时主持创意互动方案:赋能峰会论坛会议等活动科技互动感
  • 011 | efinance分析豆一主连期货
  • 电脑开机后出现bootmgr is missing原因及解决方法
  • Microsoft VBA Excel VBA函数学习笔记——数据切分熟练度+1
  • 知识库管理软件购买指南:2024年十大选择
  • 【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API
  • WPF 资源、引用命名空间格式、FrameworkElement、Binding、数据绑定
  • zdpgo_gin_sessions 专为zdpgo_gin打造的session框架,当需要使用session存储数据的时候可以考虑使用此框架
  • ZKRollup
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Android优雅地处理按钮重复点击
  • const let
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Github访问慢解决办法
  • input实现文字超出省略号功能
  • JS实现简单的MVC模式开发小游戏
  • linux学习笔记
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • SQL 难点解决:记录的引用
  • 应用生命周期终极 DevOps 工具包
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #VERDI# 关于如何查看FSM状态机的方法
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $.ajax,axios,fetch三种ajax请求的区别
  • (14)Hive调优——合并小文件
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (CPU/GPU)粒子继承贴图颜色发射
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (六)DockerCompose安装与配置
  • (六)激光线扫描-三维重建
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)基于IDEA的JAVA基础12
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Linux整合apache和tomcat构建Web服务器
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net反混淆脱壳工具de4dot的使用
  • .net后端程序发布到nignx上,通过nginx访问