深度学习-OpenCV运用(3)

2024-09-03 10:36
文章标签 学习 opencv 深度 运用

本文主要是介绍深度学习-OpenCV运用(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、简介
  • 二、OpenCV运用
    • 1. 图片扩充
    • 2.图像阈值处理
    • 3.添加椒盐噪声
  • 三、总结

一、简介

深度学习(Deep Learning)与OpenCV(Open Source Computer Vision Library)的结合为计算机视觉领域带来了强大的解决方案。OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了大量的视觉处理算法,包括但不限于图像和视频处理、特征检测、对象识别等。

二、OpenCV运用

1. 图片扩充

import cv2a = cv2.imread('2.png')
top, bottom, left, right = 50, 50, 50, 50constant = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(0, 0, 0))
reflect = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_WRAP)
cv2.imshow('a', a)
cv2.waitKey(0)
cv2.imshow('constant', constant)
cv2.waitKey(0)
cv2.imshow('reflect', reflect)
cv2.waitKey(0)
cv2.imshow('reflect101', reflect101)
cv2.waitKey(0)
cv2.imshow('replicate', replicate)
cv2.waitKey(0)
cv2.imshow('wrap', wrap)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.BORDER_CONSTANT(常量边框):
    • 使用指定的颜色值填充边框。在您的代码中,颜色被设置为黑色((0, 0, 0))。
    • 使用场景:当你需要在图像周围添加纯色边框时,比如为了美观或标记。
  • cv2.BORDER_REFLECT(反射边框):
    • 边框像素是图像边缘像素的镜像反射,但不包括边缘本身。
    • 使用场景:当你需要图像边缘的平滑过渡,但不想引入新的颜色或内容时。
  • cv2.BORDER_REFLECT101(反射101边框):
    • 与BORDER_REFLECT类似,但包括边缘像素的镜像。
    • 使用场景:与BORDER_REFLECT相似,但如果你需要确保边缘像素也被考虑在内。
  • cv2.BORDER_REPLICATE(复制边框):
    • 边框像素是图像边缘像素的复制。
    • 使用场景:当你需要图像边缘的精确复制时,比如在某些图像处理算法中,边缘像素的值对结果有重要影响。
  • cv2.BORDER_WRAP(包裹边框):
    • 边框像素是从图像的另一侧“包裹”过来的。例如,左边缘的边框像素是从图像的右边缘取的。
    • 使用场景:当你处理的是具有周期性或循环性质的图像时,比如全景图像或某些类型的纹理图像。

2.图像阈值处理

import cv2image = cv2.imread('3.png', cv2.IMREAD_GRAYSCALE)
ret, binary = cv2.threshold(image, 180, 255, cv2.THRESH_BINARY)  # maxval:0
ret1, binaryinv = cv2.threshold(image, 180, 255, cv2.THRESH_BINARY_INV)  # 0:maxval
ret2, trunc = cv2.threshold(image, 190, 255, cv2.THRESH_TRUNC)  # thresh:当前灰度值
ret3, tozero = cv2.threshold(image, 100, 255, cv2.THRESH_TOZERO)  # 当前灰度值:0
ret4, tozeroinv = cv2.threshold(image, 190, 255, cv2.THRESH_TOZERO_INV)  # 0:当前灰度值cv2.imshow('image', image)
cv2.waitKey(0)
cv2.imshow('binary', binary)
cv2.waitKey(0)
cv2.imshow('binaryniv', binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc', trunc)
cv2.waitKey(0)
cv2.imshow('tozero', tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv', tozeroinv)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.THRESH_BINARY:这是最基本的阈值类型。如果像素值大于阈值,则将其设置为maxval(在您的例子中为255),否则将其设置为0。
  • cv2.THRESH_BINARY_INV:这与THRESH_BINARY相反。如果像素值小于阈值,则将其设置为maxval,否则设置为0。
  • cv2.THRESH_TRUNC:如果像素值大于阈值,则将其设置为阈值本身,否则保持不变。这通常用于去除图像中的亮点。
  • cv2.THRESH_TOZERO:如果像素值小于阈值,则将其设置为0,否则保持不变。这有助于从图像中去除暗区域。
  • cv2.THRESH_TOZERO_INV:这与THRESH_TOZERO相反。如果像素值大于阈值,则保持不变,否则设置为0。这有助于从图像中去除亮区域。

3.添加椒盐噪声

import cv2  
import numpy as np
def add_peppersalt_noise(image, n=10000):result = image.copy()h, w = image.shape[:2]for i in range(n):x = np.random.randint(1, h)y = np.random.randint(1, w)if np.random.randint(0, 2) == 0:result[x, y] = 0else:result[x, y] = 255return resultimage = cv2.imread('3.png')
cv2.imshow('a', image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
  • 定义函数:定义函数,这个函数接收一个图像和一个可选的整数 n(默认为
    10000)作为参数。它的目的是向图像中添加椒盐噪声,即随机地将图像中的像素点设置为黑色(0)或白色(255)。
  • 处理图像:创建一个图像的副本,以避免修改原始图像。然后,获取图像的高度 h 和宽度 w,循环 n 次,每次循环都随机选择一个像素点 (x,
    y),并将其设置为黑色或白色。
  • 添加噪声并显示结果:读取图像并显示原始图像,调用函数添加噪声,并显示结果图像。

三、总结

OpenCV作为一个开源的计算机视觉库,具有显著的优点和一定的缺点。以下是对其优缺点的详细分析:

  • 优点
    • 开源与免费:OpenCV是开源的,允许用户自由使用、修改和分发,且对非商业应用和商业应用都是免费的。这大大降低了使用成本,促进了计算机视觉技术的普及和发展。
    • 跨平台性:OpenCV支持多个操作系统,包括Windows、Linux、Mac OS等,且可以在不同平台上使用相同的代码。这种跨平台性使得OpenCV的应用范围更加广泛,便于开发者在不同环境下进行开发和部署。
    • 多功能性:OpenCV提供了丰富的图像处理和计算机视觉算法,包括图像增强、特征提取、目标检测、人脸识别等。这些功能能够满足各种视觉应用的需求,使得开发者能够轻松实现复杂的计算机视觉任务。
    • 高效性能:OpenCV使用C/C++编写,具有高效的运行速度,可以处理实时视频流和大规模图像数据。这使得OpenCV在实时性要求较高的应用场景中表现出色。
    • 可扩展性:OpenCV支持多种编程语言,包括C++、Python、Java等,也支持与其他库的集成。这种可扩展性使得OpenCV能够与其他技术栈无缝对接,方便进行开发和部署。
  • 缺点
    • 学习曲线陡峭:OpenCV的接口相对复杂,需要一定的学习成本。对于初学者来说,可能需要花费一些时间来理解和掌握其使用方法。此外,OpenCV的文档和示例虽然丰富,但也可能存在不够直观或难以理解的情况。
    • 部分功能不完善:尽管OpenCV提供了很多功能,但对于一些特定的应用场景,可能还需要额外的算法或库来完成更复杂的任务。这可能需要开发者自行实现或寻找其他解决方案。
    • 依赖性:OpenCV可能需要依赖于其他库和工具,例如NumPy、Matplotlib等。这增加了开发和部署的复杂性,需要开发者在项目中额外考虑这些依赖项的管理和配置。
    • 深度学习支持相对较弱:虽然OpenCV提供了一些基本的机器学习算法,但在深度学习方面的支持相对较弱。对于需要深度学习功能的项目,可能需要借助其他框架(如TensorFlow、PyTorch等)来完成深度学习任务。

这篇关于深度学习-OpenCV运用(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132729

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用