【机器学习】OpenCV高级图像处理


鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


文章目录

  • OpenCV高级图像处理
    • 图像滤波
      • 线性滤波
        • 高斯滤波
        • 均值滤波
        • 双边滤波
      • 非线性滤波
        • 中值滤波
    • 图像金字塔
      • 高斯金字塔
      • 拉普拉斯金字塔
    • 图像分割
      • 阈值分割
      • 边缘检测
      • 轮廓处理
      • 分水岭算法
    • 特征检测与描述
      • Harris角点检测
      • SIFT特征检测与描述
      • SURF特征检测与描述
    • 图像变换
      • 傅里叶变换
      • 霍夫变换
      • 距离变换
    • 图像修复与增强
      • 去噪
      • 去雾

OpenCV高级图像处理

在掌握了OpenCV的基础知识之后,我们将深入探讨OpenCV在高级图像处理领域的应用。本文将介绍一些常用的高级图像处理技术,包括图像滤波、图像金字塔、图像分割、特征检测与描述、图像变换以及图像修复与增强。
在这里插入图片描述

图像滤波

图像滤波是图像处理中的一个基本操作,用于减少噪声、锐化边缘或提取特征。OpenCV提供了多种滤波算法,包括线性滤波和非线性滤波。
在这里插入图片描述

线性滤波

线性滤波是通过卷积操作实现的,其中卷积核定义了滤波器的性质。常用的线性滤波包括高斯滤波、均值滤波和双边滤波等。

高斯滤波

高斯滤波是一种常用的线性滤波方法,它使用高斯核对图像进行平滑。高斯核的权重由高斯函数决定,中心点的权重最大,远离中心点的权重逐渐减小。

G ( x , y ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2 + y^2}{2\sigma^2}} G(x,y)=2πσ21e2σ2x2+y2

其中, ( x , y ) (x, y) (x,y)是像素坐标,而 σ \sigma σ是高斯核的标准差,决定了滤波的强度。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.GaussianBlur(img, (5, 5), 0)
均值滤波

均值滤波是一种简单的线性滤波方法,它用邻域内所有像素的平均值替换中心像素的值。这种方法可以有效消除高斯噪声,但会导致边缘模糊。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.blur(img, (5, 5))
双边滤波

双边滤波是一种边缘保留滤波,它不仅考虑像素之间的空间距离,还考虑像素值之间的相似性。这使得它能够有效平滑图像同时保留边缘细节。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.bilateralFilter(img, 9, 75, 75)

非线性滤波

非线性滤波是基于像素值的排序统计运算,而不是线性组合。常用的非线性滤波包括中值滤波、最大值滤波和最小值滤波等。

中值滤波

中值滤波是一种非线性滤波方法,它用邻域内像素值的中值替换中心像素的值。这种方法可以有效消除椒盐噪声,同时保留边缘细节。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
blur = cv.medianBlur(img, 5)

图像金字塔

图像金字塔是一种多尺度表示方法,它通过上采样或下采样生成一系列分辨率不同的图像。OpenCV提供了两种图像金字塔:高斯金字塔和拉普拉斯金字塔。
在这里插入图片描述

高斯金字塔

高斯金字塔是通过对原始图像进行连续的高斯平滑和下采样操作生成的。每一层的图像都是上一层图像的缩小版本,分辨率降低一半。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
g_pyr = [img]for i in range(6):img = cv.pyrDown(img)g_pyr.append(img)

拉普拉斯金字塔

拉普拉斯金字塔是通过高斯金字塔的相邻层之间的差值构建的。它保留了原始图像的边缘和细节信息,常用于图像合成和重建。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
g_pyr = [img]
l_pyr = []for i in range(6):img = cv.pyrDown(img)g_pyr.append(img)for i in range(5, -1, -1):l_pyr.append(cv.subtract(g_pyr[i], cv.pyrUp(g_pyr[i+1])))

图像分割

图像分割是将图像划分为多个独立区域的过程,每个区域具有相似的特征,如颜色、纹理或亮度。OpenCV提供了多种图像分割算法,包括阈值分割、边缘检测、轮廓处理和分水岭算法等。
在这里插入图片描述

阈值分割

阈值分割是一种简单的分割方法,它根据像素值与预设阈值的比较将图像划分为前景和背景。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)

边缘检测

边缘检测是一种常用的图像分割技术,它通过检测图像中的边缘来分割对象。常用的边缘检测算子包括Sobel、Canny等。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
edges = cv.Canny(img, 100, 200)

轮廓处理

轮廓是一个连续的点集,它描述了物体的形状。OpenCV提供了findContours()函数用于查找图像中的轮廓,并提供了一系列操作函数,如drawContours()contourArea()等。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
contours, _ = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img, contours, -1, (0, 255, 0), 2)

分水岭算法

分水岭算法是一种基于拓扑理论的图像分割方法,它将图像看作一个地形,并根据像素值的高低来模拟水流的流向,从而将图像划分为不同的区域。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
_, thresh = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv.dilate(opening, kernel, iterations=3)
dist_transform = cv.distanceTransform(opening, cv.DIST_L2, 5)
_, sure_fg = cv.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
unknown = cv.subtract(sure_bg, sure_fg)
_, markers = cv.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown == 255] = 0
markers = cv.watershed(img, markers)
img[markers == -1] = [255, 0, 0]

特征检测与描述

特征检测和描述是计算机视觉中的一个重要步骤,它用于提取图像中的关键点和描述符,以便进行后续的匹配、跟踪或识别任务。OpenCV提供了多种特征检测和描述算法,包括Harris角点检测、SIFT和SURF等。
在这里插入图片描述

Harris角点检测

Harris角点检测是一种基于图像梯度的角点检测算法,它可以检测出图像中的角点和边缘。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
corners = cv.cornerHarris(gray, 2, 3, 0.04)
corners = cv.dilate(corners, None)
img[corners > 0.01 * corners.max()] = [0, 0, 255]

SIFT特征检测与描述

SIFT(Scale-Invariant Feature Transform)是一种常用的特征检测和描述算法,它可以提取图像中的关键点,并为每个关键点计算一个128维的描述符向量,具有尺度不变性和旋转不变性。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)
img = cv.drawKeypoints(img, kp, None)

SURF特征检测与描述

SURF(Speeded-Up Robust Features)是另一种常用的特征检测和描述算法,它比SIFT更快,但精度略低。SURF也可以提取关键点和计算描述符,具有一定的尺度不变性和旋转不变性。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
surf = cv.xfeatures2d.SURF_create()
kp, des = surf.detectAndCompute(gray, None)
img = cv.drawKeypoints(img, kp, None)

图像变换

图像变换是指对图像进行几何或频域上的转换,以提取特征或改变图像的表示形式。OpenCV提供了多种图像变换算法,包括傅里叶变换、霍夫变换和距离变换等。
在这里插入图片描述

傅里叶变换

傅里叶变换是一种将图像从空间域转换到频域的方法,它可以用于图像滤波、图像重建和图像压缩等应用。OpenCV提供了dft()idft()函数来计算离散傅里叶变换及其逆变换。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
dft = cv.dft(np.float32(img), flags=cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20 * np.log(cv.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

霍夫变换

霍夫变换是一种用于检测图像中直线或圆形等几何形状的技术。它通过在参数空间中寻找累加器的局部最大值来检测这些形状。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150, apertureSize=3)
lines = cv.HoughLines(edges, 1, np.pi / 180, 200)
for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

距离变换

距离变换是一种计算图像中每个像素到最近的非零像素的距离的方法。它常用于图像分割、骨架提取和形状分析等应用。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg', 0)
_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
dist_transform = cv.distanceTransform(thresh, cv.DIST_L2, 5)

图像修复与增强

图像修复和增强是指对图像进行处理,以提高图像质量或修复图像缺陷。OpenCV提供了多种图像修复和增强算法,包括去噪、去雾和超分辨率等。

去噪

去噪是指从图像中去除噪声,以提高图像质量。OpenCV提供了多种去噪算法,如高斯滤波、中值滤波和非局部均值滤波等。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
dst = cv.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)

去雾

去雾是指从图像中去除由于大气环境造成的雾霾效应,以提高图像的对比度和清晰度。OpenCV提供了基于暗通道先验的去雾算法。

import cv2 as cv
import numpy as npimg = cv.imread('image.jpg')
haze_removal = cv.dehaze(img.copy())

End

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

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

相关文章

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)

1.存储结构 https://cplusplus.com/reference/vector/vector/ namespace zone {template<class T> //需要模板class vector{public:private:iterator _start;iterator _finish;iterator _endofstorage;}; } 可见&#xff0c;vector内核是由三个指针实现的 2.默认成员函…

LabVIEW机械产品几何精度质检系统

随着制造业的发展&#xff0c;对产品质量的要求越来越高&#xff0c;机械产品的几何精度成为衡量其品质的重要指标。为了提高检测效率和精度&#xff0c;开发了一套基于LabVIEW的几何精度质检系统&#xff0c;该系统不仅可以自动化地进行几何尺寸的测量&#xff0c;而且能实时分…

高校宿舍电费管理怎么实现

1引言 在大学的象牙塔里&#xff0c;宿舍不仅是学子们休憩的港湾&#xff0c;更是青春记忆的重要载体。然而&#xff0c;随着科技的发展与生活习惯的改变&#xff0c;宿舍内的电器设备日益增多&#xff0c;电费管理成为了一个不可忽视的问题。本文将从高校宿舍电费管理的现状出…

ORA-28032 Your password has expired and the database is set to read only

做个记录。 non-cdb 处于只读状态&#xff0c;CDB创建到noncdb的dblink后产生的报错&#xff0c;dblink可以成功创建&#xff0c;但无法连接到non-cdb。 解决&#xff1a;一开始以为是cdb的密码不正确&#xff0c;mos上找到问题&#xff0c;non-cdb的密码过期了&#xff0c;并且…

【软件测试】测试的岗位有哪些?

求职入口有很多&#xff1a;相关企业官网、求职软件、校招、公众号等等。 下面就在某招聘网站上看看测试有哪些岗位吧&#xff01; 测试只是一个统称&#xff0c;在测试下面还有很多细分岗位。 但是测试的岗位主要分为以下俩个方面&#xff1a; 软件测试开发工程师&#xff…

3.ChatGPT在教育领域的应用:教学辅助与案例分享(3/10)

ChatGPT在教育领域的应用&#xff1a;教学辅助与案例分享 引言 在21世纪的教育领域&#xff0c;技术革新正以前所未有的速度改变着传统的教学和学习方式。随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;教育技术&#xff08;EdTech&#xff09;领域迎来了新的…

Vm软件安装_链接相机

工业相机的驱动连接 下载安装MVS MVS 客户端支持安装在 Windows XP/7/10 32/64bit&#xff0c;Linux 32/64bits 以及MacOS64bits操作系统上。本文以 Windows 系统为例进行介绍。 具体操作步骤如下&#xff1a; 请从海康机器人官网&#xff08;www.hikrobotics.com&#xff0…

前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)

图形验证码是网站安全防护的重要组成部分&#xff0c;能有效防止自动化脚本进行恶意操作&#xff0c;如何实现一个简单的运算图形验证码&#xff1f;本文封装了一个简单的js类&#xff0c;可以用于生成简单但安全的图形验证码。它支持自定义验证码样式&#xff0c;包括字体大小…

硬件工程师笔试面试——保险丝

目录 10、保险丝 10.1 基础 保险丝原理图 保险丝实物图 10.1.1 概念 10.1.2 保险丝的工作原理 10.1.3 保险丝的主要类型 10.1.4 保险丝的选择和使用注意事项 10.2 相关问题 10.2.1 保险丝的额定电流和额定电压是如何确定的? 10.2.2 保险丝的熔断速度对电路保护有何…

Arthas thread(查看当前JVM的线程堆栈信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.2 thread&#xff08;查看当前JVM的线程堆栈信息&#xff09;举例1&#xff1a;展示[数字]线程的运行堆栈&#xff0c;命令&#xff1a;thread 线程ID举例2&#xff1a;找出当前阻塞其他线程的线程 二、命令列表 2.1 jvm相关命令 2.…

USB摄像头视频流转RTSP流

一、VLC查看USB摄像头视频流原理&#xff1a; USB摄像头的工作原理与VLC播放其他视频文件类似&#xff0c;主要区别在于视频流的来源是实时捕获的&#xff0c;而不是预先录制的文件。如果使用VLC将USB摄像头的视频流作为RTSP服务器广播&#xff0c;需要进一步配置 二、VLC查看…

【machine learning-六-supervise learning之线性回归模型】

监督学习之线性回归模型 线性回归模型线性模型回归模型 如何使用线性模型实现智能化预测呢寻找数据训练模型输入、特征、目标、预测值、模型代价函数 线性模型是人工智能监督学习中最广泛的应用&#xff0c;所以有必要先学习一下这个基础模型&#xff0c;做好基石。 线性回归模…

Reactor介绍,如何从简易版本的epoll修改成Reactor模型(demo版本代码+详细介绍)

目录 Reactor demo​​​​​​​ 引入 比喻 修改代码 connection tcp_server ET模式 主逻辑 处理事件 运行结果 代码 完善功能 读取数据 运行结果 ​编辑 代码 处理数据 回指指针 如何处理写事件 引入 循环内 处理对写事件的关心 异常处理 代码 se…

C# 携手 7-Zip 命令行:大文件压缩的终极武器?

前言 嗨&#xff0c;大家好&#xff01; 今天咱们来聊聊如何用 C# 调用 7-Zip 命令行来压缩大文件&#xff0c;这是个既高效又稳定的好办法&#xff0c;亲测有效&#xff01; 在实际工作中&#xff0c;压缩文件几乎是家常便饭&#xff0c;但可惜的是&#xff0c;许多常用的方…

【科技论文写作与发表】论文分类

目录 一、实验性论文特点写作结构适用学科方向 二、报道性论文特点写作结构适用学科方向 三、理论性论文特点写作结构适用学科方向 一、实验性论文 通过科学实验获得的数据和结果进行详细阐述和分析&#xff0c;检验某一科学理论或假说。 特点 详细描述实验目的、实验设计、实…

ORM框架详解:为什么不直接写SQL?

想象一下&#xff0c;你正在开发一个小型的在线书店应用。你需要存储书籍信息、用户数据和订单记录。作为一个初学者&#xff0c;你可能会想&#xff1a;“我已经学会了SQL&#xff0c;为什么还要使用ORM框架呢&#xff1f;直接写SQL语句不是更简单、更直接吗&#xff1f;” 如…

Uniapp的alertDialog返回值+async/await处理确定/取消问题

今天在使用uniui的alertDialog时&#xff0c;想添加一个确定/取消的警告框时 发现alertDialog和下面的处理同步进行了&#xff0c;没有等待alaertDialog处理完才进行 查询后发现问题在于 await 关键字虽然被用来等待 alertDialog.value.open() 的完成&#xff0c;但是 alertDi…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提&#xff1a; 事情是这样的&#xff0c;老板想要我们写一个demo拿去路演/拉项目&#xff0c;有一些数据&#xff0c;希望前端接一下&#xff0c;写几个表格&a…

vs code 跳转很慢

查看结构体、接口等非常之慢。c/c语言服务功能使用了智能引擎所致&#xff0c;设置为模糊检索即可。 修改如下&#xff1a; 1.打开"文件"&#xff0c;选"首选项"&#xff0c;"设置" 2.弹出的窗口中搜索 "C_Cpp.intelliSenseEngine" …

TCP客户端编码和解码处理:发送和接收指定编码消息

文章目录 引言基于Netty实现TCP客户端Netty发送GBK编码指令Netty接收GBK编码基于Channel发送指令基于ChannelHandlerContext发送指令:建立连接时发送登陆指令开启日志,查看报文信息基于ChannelInboundHandlerAdapter进行业务逻辑处理原生API实现TCP客户端基于DataOutputStrea…