opencv入门学习总结

news2024/11/13 23:50:57

opencv学习总结

不多bb,直接上代码!!!
案例一:

import cv2
# 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式
print(cv2.getVersionString())
"""
作用:它可以读取不同格式的图像文件并将其转换为一个 NumPy 数组
    image = cv2.imread(filename, flags)
    filename: 要读取的图像文件路径,支持绝对路径和相对路径。
    flags(可选): 指定图像读取的方式,控制图像的加载格式。这个参数是可选的,默认为 cv2.IMREAD_COLOR
            cv2.IMREAD_COLOR: 以彩色图像加载,忽略图像的透明度(默认值)。rgb
            cv2.IMREAD_GRAYSCALE: 以灰度图像加载,返回一个单通道图像(没有颜色信息)
            cv2.IMREAD_UNCHANGED: 加载图像包括其 alpha 通道,即加载图像时包括透明度信息(如果有的话)。rgba
"""
image = cv2.imread("opencv_logo.jpg")
print(image.shape)

"""
作用:用于在窗口中显示图像。该函数可以将图像或视频帧显示在一个新的窗口中。
    cv2.imshow(window_name, image)
    window_name:窗口的名称,是一个字符串类型的参数
    image:要显示的图像。它通常是一个 NumPy 数组,表示图像数据
"""
cv2.imshow("image", image)
# 等待用户输入(例如按键事件)任意按键退出

"""
作用:用于等待用户输入键盘事件
    cv2.waitKey(delay)
    delay: 延迟时间,单位:毫秒
"""
cv2.waitKey()


# 关闭所有打开的窗口
cv2.destroyAllWindows()

案例二:



import cv2

image = cv2.imread("opencv_logo.jpg")

"""
1.这段代码展示了如何分别显示 OpenCV 彩色图像的三个颜色通道(蓝色、绿色和红色)单独的图像。
2.OpenCV 中加载的彩色图像是以 BGR(蓝色、绿色、红色)顺序存储的,而不是常见的 RGB 顺序。
    image[:, :, 0]: 表示图像的蓝色通道。
    image[:, :, 1]: 表示图像的绿色通道。
    image[:, :, 1]: 表示图像的红色通道。
    这里使用了数组的切片,返回了一个二维数组。
    例如:
        import numpy as np
        
        # 假设这是一个 3x3 的图像,每个像素有 3 个通道
        image = np.array([[[100, 150, 200], [120, 170, 220], [140, 190, 240]],
                          [[110, 160, 210], [130, 180, 230], [150, 200, 250]],
                          [[120, 170, 220], [140, 190, 240], [160, 210, 260]]])
        
        # 提取蓝色通道
        blue_channel = image[:, :, 0]
        print(blue_channel)
        
    输出:[[100 120 140]
         [110 130 150]
         [120 140 160]]
"""
cv2.imshow("blue", image[:, :, 0])
cv2.imshow("green", image[:, :, 1])
cv2.imshow("red", image[:, :, 2])

"""
    作用:将图像从一种颜色空间转换到另一种颜色空间
    cv2.cvtColor(src, code)
        src:输入图像,通常是一个 NumPy 数组(例如通过 cv2.imread() 读取的图像)。
        code:颜色空间转换代码,指定要应用的转换类型
            常见的几种:
                cv2.COLOR_BGR2RGB:从 BGR 转换为 RGB。
                cv2.COLOR_BGR2GRAY:从 BGR 转换为灰度图像。
                cv2.COLOR_RGB2BGR:从 RGB 转换为 BGR。
"""
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)

cv2.waitKey()


在这里插入图片描述

案例三:


import cv2
# 是在对一个图像 image 进行切割操作,返回一个新的图像区域
image = cv2.imread("opencv_logo.jpg")

crop = image[10:170, 40:200]

cv2.imshow("crop", crop)
cv2.waitKey()

在这里插入图片描述

案例四:


import cv2
import numpy as np

image = np.zeros([300, 300, 3], dtype=np.uint8)
"""
作用:在图像上绘制一条直线
    cv2.line(image, start_point, end_point, color, thickness)
    image:要在其上绘制线条的图像(通常是一个 NumPy 数组)。
    start_point:线条的起始点坐标,格式为 (x, y),其中 x 是水平坐标(列),y 是垂直坐标(行)。
    end_point:线条的结束点坐标,格式为 (x, y)。
    color:线条的颜色,通常是 BGR 格式的元组,即 (蓝色, 绿色, 红色)。
    thickness:线条的粗细,单位是像素。
"""
cv2.line(image, (100, 200), (250, 250), (255, 0, 0), 2)

"""
作用:在图像上绘制一个矩形
    cv2.rectangle(image, start_point, end_point, color, thickness)
    image:目标图像,矩形将被绘制在此图像上。
    start_point:矩形的左上角坐标,格式为 (x, y),其中 x 为水平坐标(列),y 为垂直坐标(行)
    end_point:矩形的右下角坐标,格式同样为 (x, y)。
    color:矩形的颜色,采用 BGR(蓝色、绿色、红色)格式。
    thickness:线条的粗细,单位是像素。
"""
cv2.rectangle(image, (30, 100), (60, 150), (0, 255, 0), 2)

"""
作用:在图像上绘制一个圆形
    cv2.circle(image, center, radius, color, thickness)
    image:目标图像,圆形将被绘制在此图像上。
    center:圆形的中心点坐标,格式为 (x, y),其中 x 为水平坐标(列),y 为垂直坐标(行)。
    radius:圆形的半径,单位为像素。
    color:圆形的颜色,采用 BGR(蓝色、绿色、红色)格式。
    thickness:圆形的边框宽度,单位为像素。如果设置为负值(如 -1),则表示填充圆形。
"""
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)

"""
作用:在图像上添加文本
    cv2.putText(image, text, position, font, font_scale, color, thickness, line_type)
    image:目标图像,文本将被绘制在此图像上。
    text:要绘制的文本字符串。
    position:文本的左下角位置(起始坐标),格式为 (x, y),其中 x 是水平坐标(列),y 是垂直坐标(行)。
    font:字体类型(通过 OpenCV 提供的常量来指定)。0 表示使用 OpenCV 默认字体 cv2.FONT_HERSHEY_SIMPLEX
    font_scale:字体的缩放比例(即字体大小)。
    color:文本颜色,采用 BGR(蓝色、绿色、红色)格式。
    thickness:文本的线条粗细,单位为像素。
    line_type:线条类型,用于指定文本的抗锯齿(通常设置为 1 表示抗锯齿)。
"""
cv2.putText(image, "hello", (100, 50), 0, 1, (255, 255, 255), 2, 1)

cv2.imshow("image", image)
cv2.waitKey()

在这里插入图片描述

案例5:

首先我们先明白什么是噪点?

噪点(Noise) 是指图像中出现的随机、无关的像素值,它们通常表现为干扰、杂散的亮度或颜色变化,可能会影响图像的质量和分析。噪点通常是由于图像捕获、传输、处理等过程中引入的误差或不稳定因素。

如何去除噪点?

​ 去噪点(去噪)是图像处理中常见且重要的一步,目的是减少图像中的噪声,恢复图像的质量和细节。不同类型的噪点(如椒盐噪声、高斯噪声等)可以通过不同的去噪方法进行处理。下面是一些常见的去噪方法:


import cv2

image = cv2.imread("plane.jpg")


# 用均值滤波去除噪点
mean_blur = cv2.blur(image, (5, 5))  # 5x5 窗口
# 用高斯滤波去除噪点
gauss = cv2.GaussianBlur(image, (5, 5), 0) # 5x5 窗口 标准差为 0
# 用中值滤波去除噪点
median = cv2.medianBlur(image, 5) # 5 是邻域大小
# 用双边滤波去除噪点
# 参数1:直径,参数2:颜色空间标准差,参数3:坐标空间标准差
bilateral_blur = cv2.bilateralFilter(image, 9, 75, 75)


cv2.imshow("image", image)
cv2.imshow("mean_blur", mean_blur)
cv2.imshow("gauss", gauss)
cv2.imshow("median", median)
cv2.imshow("bilateral_blur", bilateral_blur)

cv2.waitKey()


在这里插入图片描述

​ 除了以上opencv中自带的函数去除噪点,还可以使用深度学习模型更好的去除噪点。

​ OpenCV本身并不直接提供深度学习去噪的实现,但你可以利用深度学习框架(如TensorFlow、PyTorch等)和预训练的去噪模型(如DnCNN、U-Net等)来进行去噪。下面是一个使用深度学习去噪的简化示例(假设你已经有一个训练好的模型)。

import cv2
import torch
import numpy as np

# 加载训练好的模型 (假设你已经训练了一个去噪模型)
model = torch.load("denoising_model.pth")  # 这是一个假设的模型路径
model.eval()

# 读取图像
image = cv2.imread("plane.jpg")
image_tensor = torch.from_numpy(image).float().unsqueeze(0).unsqueeze(0)  # 转换为 PyTorch Tensor

# 将图像输入模型进行去噪
with torch.no_grad():
    denoised_image_tensor = model(image_tensor)

# 将去噪后的 Tensor 转换回图像格式
denoised_image = denoised_image_tensor.squeeze().numpy().astype(np.uint8)

# 显示原图像和去噪后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Denoised Image (Deep Learning)", denoised_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

总结:

1. 均值滤波:适用于轻度噪声,简单但可能模糊图像细节。

2. 中值滤波:特别适用于去除椒盐噪声,能够保留边缘细节。

3. 高斯滤波:适用于去除高斯噪声,可以有效平滑图像。

4. 双边滤波:去噪的同时能够保留图像边缘,适用于需要保持细节的情况。

5. 深度学习去噪:通常提供最好的去噪效果,尤其适用于复杂的噪声类型,但需要预训练的深度学习模型和计算资源。

可以根据噪声的类型和图像的特性选择合适的去噪方法。

总结:

1. 均值滤波:适用于轻度噪声,简单但可能模糊图像细节。

2. 中值滤波:特别适用于去除椒盐噪声,能够保留边缘细节。

3. 高斯滤波:适用于去除高斯噪声,可以有效平滑图像。

4. 双边滤波:去噪的同时能够保留图像边缘,适用于需要保持细节的情况。

5. 深度学习去噪:通常提供最好的去噪效果,尤其适用于复杂的噪声类型,但需要预训练的深度学习模型和计算资源。

可以根据噪声的类型和图像的特性选择合适的去噪方法。

目前更新到这里,后续会增加。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 中的索引下推功能

看到索引,应该大家都可以联想到这个是和查询效率有关系的,既然有这个功能,那么那句古话说的好啊:存在即合理。那么这个就是说有了这个功能,可以提升查询效率。 什么是索引下推 我们先有一个大概的理解:在…

重拾CSS,前端样式精读-媒体查询

前言 本文收录于CSS系列文章中,欢迎阅读指正 说到媒体查询,大家首先想到的可能是有关响应式的知识点,除此之外,它还可以用于条件加载资源,字体大小,图像和视频的优化,用户界面调整等等方面&am…

物理设备命名规则(Linux网络服务器 15)

Linux系统中的一切都是文件,硬件设备也不例外。既然都是文件,就必须有文件名称。系统内核中udev设备管理器会自动把硬件名称规范化起来,目的是让用户通过设备文件的名字可以大致了解设备属性以及分区信息。这对于陌生的设备来说特别方便。另外…

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南:入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…

猿创征文|Inscode桌面IDE:打造高效开发新体验

猿创征文|Inscode桌面IDE:打造高效开发新体验 引言 在当今快速发展的软件开发领域,一个高效、易用的集成开发环境(IDE)是每个开发者必不可少的工具。Inscode 桌面 IDE 作为一款新兴的开发工具,凭借其强大…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

激活函数解析:神经网络背后的“驱动力”

神经网络中的激活函数&#xff08;Activation Function&#xff09;是其运作的核心组件之一&#xff0c;它们决定了神经元如何根据输入信号进行“激活”&#xff0c;进而影响整个模型的表现。理解激活函数的工作原理对于设计和优化神经网络至关重要。本篇博客将深入浅出地介绍各…

基于表格滚动截屏(表格全部展开,没有滚动条)

import html2canvasPro from html2canvas // 截图&#xff0c;平辅表格 async function resetAgSize() {const allColumns gridApi.value.getColumns()let totalColumnWidth 0let totalColumnHeight 0// 遍历每一个行节点gridApi.value.forEachNode((rowNode) > {totalCo…

vs2015QT项目添加多语言翻译总结

一、简介 当软件有国际化的需求时&#xff0c;就需要多语言翻译功能&#xff0c;最常见的语言就是支持中文和英语&#xff0c;本文介绍在vs2015QT环境下&#xff0c;进行国际化翻译的具体流程。 二、多语言翻译实现流程 1.底层实现原理介绍 QT写的客户端软件&#xff0c;能…

wireshark演进之路——从GTK到Qt

Wireshark 自 1998 年诞生至今&#xff0c;已有超过26年的历史了。它最早由 Gerald Combs 创建&#xff0c;最初名为 Ethereal。2006 年&#xff0c;Ethereal 更名为 Wireshark&#xff0c;并继续发展成了全球领先且人尽皆知的网络协议分析工具&#xff0c;其GUI演变就是其中非…

哈希表的实现--C++

文章目录 一、哈希概念1.1、直接定址法1.2、哈希冲突1.3、负载因子1.4、将关键字转为整数1.5、哈希函数1.5.1、除法散列法/除留余数法1.5.2、乘法散列法1.5.3、全域散列法1.5.4、其他方法 二、处理哈希冲突2.1、开放定址法2.1.1、线性探测2.1.2、二次探测2.1.3、双重散列2.1.4、…

Python学习从0到1 day26 第三阶段 Spark ② 数据计算Ⅰ

人总是会执着于失去的&#xff0c;而又不珍惜现在所拥有的 —— 24.11.9 一、map方法 PySpark的数据计算&#xff0c;都是基于RDD对象来进行的&#xff0c;采用依赖进行&#xff0c;RDD对象内置丰富的成员方法&#xff08;算子&#xff09; map算子 功能&#xff1a;map算子…

D67【python 接口自动化学习】- python基础之数据库

day67 Python操作MySQL基础使用 学习日期&#xff1a;20241113 学习目标&#xff1a;MySQL数据库-- 136 Python操作MySQL基础使用 学习笔记&#xff1a; pymysql 创建MySQL的数据库链接 执行sql语句 总结 Python中使用第三方库&#xff1a;pymysql来操作MySQL&#xff0c;…

Linux驱动开发基础——Hello驱动程序(一)

目录 一、Hello驱动 一、Hello驱动 我们选用的内核都是 4.x 版本&#xff0c;操作都是类似的&#xff1a; 1.1、APP 打开的文件在内核中如何表示 open函数原型&#xff1a; int open(const char *pathname, int flags, mode_t mode); 仔细看函数的参数&#xff0c;再对比看 内…

2.初始sui move

vscode安装move插件 查看sui 客户端版本号 sui client --version 创建新项目 sui move new <项目名> sui move new hello_world 项目目录结构&#xff1a; hello_world ├── Move.toml ├── sources │ └── hello_world.move └── tests└── hello_world…

学习日志009--面向对象的编程

一、面向对象 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计应用程序和计算机程序。它利用了抽象、封装、继承和多态这些概念。 一、面向对象编程的核心概念 封装&#xff08;Encaps…

Redis8:商户查询缓存2

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中&#xff0c;数据绑定是一个非常重要的特性&#xff0c;它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式&#xff0c;当数据源更新时&#xff0c;UI 会自动更新&#xff1b;同样&#xff0c;当 UI 中的元素&#xff08;如文本框&#xff09;发生改变时…

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…

# filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝, 失败,无法连接服务器”解决方案

filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝&#xff0c; 失败&#xff0c;无法连接服务器”解决方案 一、问题描述&#xff1a; 当我们用filezilla客户端 连接 虚拟机ubuntu系统时&#xff0c;报错“尝试连接 ECONNREFUSED - 连接被服务…