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

Opencv之计算机视觉一

一、环境准备

使用opencv库来实现简单的计算机视觉。

需要安装两个库:opencv-python和opencv-contrib-python,版本可以自行选择,注意不同版本的opencv中的某些函数名和用法可能不同

pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simplee


二、读取图片文件

1、使用pillow这个库中的功能

from PIL import Image
aa=Image.open('timg98.jpg')
print(aa)

2、使用opencv中特有的读取文件的方法 

import cv2  # 读取的格式是BGR  numpy
import matplotlib.pyplot as plt  # matplotlib读取的格式与opencv不同
import numpy as np


# '''-------------------读取图片----------------------------'''
a = cv2.imread('timg98.jpg')#读取图片
# print(a)   #  NumPy数组,其中存储了读取的图像文件的像素值。
cv2.imshow('tu',a)  #显示图片。显示图片的名称,显示的图片数据。将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是保存图片数据的变量

b = cv2.waitKey(0)#这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关闭,#如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值

print(b) #显示ASCII的数值,可以对应ASCII的表来查找对应的数值

cv2.destroyAllWindows() #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加。

# # '''调试模型观察shape,dtype、size属性'''

print("图像形状 (shape):", a.shape)   #高、宽、通道数
print("图像数据类型 (dtype):", a.dtype) #无符号 8 位整数,用于表示像素值的范围在 0 到 255 之间。
print("图像大小 (size):", a.size) #表示图像的大小,通常是一个整数,表示图像的总像素数,即图像的高度乘以宽度乘以通道数

3、读取图片的灰度图

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE) ,其中cv2.IMREAD_GRAYSCALE是设置imread读取图片是设置图片为灰度图,如果后面设置为0,则显示彩色图片,不写效果也是彩色。

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE)     #读取图片
c=cv2.resize(c,(500,500))           #图片原尺寸过大,所以这里对图片的大小进行重新设置

cv2.imshow("tupian",c)      #将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是图片的来源

b=cv2.waitKey(0)    #这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关#闭,如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值

print(b)    #显示ASCII的数值,可以对应ASCII的表来查找对应的数值

cv2.destroyAllWindows()     #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可#以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加


print("图像的形状:",c.shape)

print("图像的数据类型:",c.dtype)

print("图像的大小:",c.size)


#图片的保存,后面的两个参数,第一个是图片保存的位置,第二个是图片储存的变量
cv2.imwrite('tupian_gray.jpg',b)

4、视频文件的读取

import cv2
# 打开视频文件
video_capture = cv2.VideoCapture('转场.mp4')  #  摄像头:0
# 检查视频是否成功打开
if not video_capture.isOpened():
    print("无法打开视频文件")
    exit()
# 循环读取视频帧
while True:
    # 逐帧读取视频
    ret, frame = video_capture.read()  #ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧
    # 检查是否成功读取帧
    if not ret:
        break
    # 将图像从一种颜色空间转换为另一种颜色空间。
    frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # 显示当前帧
    cv2.imshow('Video', frame)
    # 检查用户是否按下 'esc' 键,如果是则退出循环
    if cv2.waitKey(100) == 27:
        break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()

5、区域切割

ROI:区域感兴趣(Region of Interest)的缩写。它指的是图像或视频中感兴趣的特定区域,需要进行分析或处理。
ROI可以由用户手动选择,也可以使用计算机视觉算法自动检测。

a = cv2.imread(r'./timg98.jpg')
b = a[100:300,100:300]  #直接对numpy数组进行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(100000)
cv2.destroyAllWindows()

6、提取RGB颜色通道 

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道
# g 包含绿色通道
# r 包含红色通道
cv2.imshow('result', a2)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()

注意:我们这里是显示蓝色通道的图像,但是所显示的图片确实灰色的,那是因为只显示蓝色通道时,
实际上是将蓝色通道作为亮度值,而将绿色和红色通道设置为默认的最大值,也就是255。这会导致图像呈现为灰色。
想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。

7、图片的复制.copy()

import cv2
a = cv2.imread(r'./timg98.jpg')
# 复制原始图像以避免更改原始图像
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
# 创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

 8、合并颜色通道

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道  g 包含绿色通道  r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用这行代码
cv2.imshow('result', img)
cv2.waitKey(100000)
cv2.destroyAllWindows()

9、图片修改

1、图片打码 

# 图片打码
import numpy as np

a = cv2.imread(r'./timg98.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

 2、图片组合

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b[200:350,200:350] = a[50:200,100:250]#注意:矩阵的大小必须要统一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图片的放缩

cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。
# fx:沿x轴的缩放系数。
# fy:沿y轴的缩放系数。

a = cv2.imread('timg98.jpg')

#方法一
a_new = cv2.resize(a,(200,600))   # 宽、高

#方法二
# a_new = cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
# print(a.shape)  # 高、宽、通道数

cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

10、图像的运算

1、图像的加法一


当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和,
当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去256,例如相加之后时260,则世纪时260-256=4。

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
c = a+10    #图片,
cv2.imshow('yuan',a)
cv2.imshow('a+10',c)
cv2.waitKey(100000)

c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(100000)

2、图像的加法二


​​​​​​​对于cv2的add()运算,当对图像a,图像b进行加法求和时,遵循以下规律
当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和
当某位置像素相加得到的数值大于255时,该位置数值为255

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c = cv2.add(a,b)   #也可以使用使用
cv2.imshow('a add b',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图像的加权运算

就是计算在两幅图像的像素值之和时,将每幅图像的权值考虑进来,可以用公式表示为dst=src1×α+src×β+γ

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
#
c =cv2.addWeighted(a,0.2,b,0.8,0)   # 10:图像的亮度值(常数),将添加到加权和上
cv2.imshow('addWeighted',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()


http://www.kler.cn/a/591961.html

相关文章:

  • 网络空间安全(34)安全防御体系
  • Python----数据分析(Pandas二:一维数组Series,Series的创建,Series的属性,Series中元素的索引与访问)
  • 【redis】什么是持久化之 RDB
  • TypeScript中的类型断言(type assertion),如何使用类型断言进行类型转换?
  • R语言零基础系列教程-03-RStudio界面介绍与关键设置
  • DeepSeek关键技术再总结
  • DNS解析查询工具
  • 设计模式(行为型)-观察者模式
  • Android第四次面试(Java基础篇)
  • 机器学习——深入浅出理解朴素贝叶斯算法
  • Redis项目:短信验证码登录
  • 【JDK17】开源应用服务器大比对
  • logparser日志分析详解
  • ubuntu20.04安装mysql-workbench
  • DataWhale 大语言模型 - 模型详细配置
  • conda 的 envs_dirs 配置出错
  • 解决 ECharts 切换图表时的 Resize 问题
  • 博客图床 VsCode + PicGo + 阿里云OSS
  • SQLark中如何进行数据筛选与排序
  • 批量测试IP和域名联通性2