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

news2024/11/14 15:08:40

鑫宝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 np

img = cv.imread('image.jpg')
blur = cv.GaussianBlur(img, (5, 5), 0)
均值滤波

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

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
blur = cv.blur(img, (5, 5))
双边滤波

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

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
blur = cv.bilateralFilter(img, 9, 75, 75)

非线性滤波

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

中值滤波

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

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
blur = cv.medianBlur(img, 5)

图像金字塔

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

高斯金字塔

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

import cv2 as cv
import numpy as np

img = 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 np

img = 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 np

img = cv.imread('image.jpg', 0)
_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)

边缘检测

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

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg', 0)
edges = cv.Canny(img, 100, 200)

轮廓处理

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

import cv2 as cv
import numpy as np

img = 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 np

img = 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 np

img = 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 np

img = 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 np

img = 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 np

img = 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 np

img = 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 * rho
    y0 = b * rho
    x1 = 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 np

img = 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 np

img = cv.imread('image.jpg')
dst = cv.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)

去雾

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

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
haze_removal = cv.dehaze(img.copy())

End

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

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

相关文章

AD域控服务器

1.AD域控服务器安装 2.客户端Windows10加入域环境 3.组织单位OU和域用户创建 目的是分部门管理用户和使用域用户登录客户端 4.域用户安全策略 5.当客户端密码锁住了,管理员解锁账户。 6.只允许域用户使用自己的电脑

链动 2+1 模式 S2B2C 商城小程序源码与营销策略创新

摘要:本文探讨了营销策略在产品营销中的重要性,阐述了如何从产品的目标客群、主张价值和盈利模式出发制定各种价格运营策略以及品牌影响力策略,以实现“让用户心甘情愿掏口袋”的目标。引入“链动 21 模式 S2B2C 商城小程序源码”&#xff0c…

Linux 查看磁盘 df -h 已经查看目录大小 du -sh ./*

使用df -h 命令可以查看磁盘信息 df -h 如下图所示: 获取当前目录 每个目录大小 du -sh ./* du -sh ./* 如果文件比较多 我们想获取文件大小最大的前10个 可以运行如下命令: du -ah | sort -rh | head -n 10 du -ah:显示当前目录及其子目录的所有文件和目录的…

寻呼机爆炸,炸醒通讯安全警惕心

据央视新闻报道:当地时间17日下午,黎巴嫩首都贝鲁特以及黎巴嫩东南部和东北部多地发生寻呼机爆炸事件。黎巴嫩公共卫生部长阿卜亚德称,爆炸已造成9人死亡,约有2800人受伤,其中约200人伤情危重。 来源:央视新…

JavaWeb笔记整理——Redis

目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 ​编辑操作hash类型的数据 ​编辑 操作列表类…

连续18年全球第一,三星电视持续引领科技浪潮

作者 | 曾响铃 文 | 响铃说 对于很多80、90年代的人来说,电视机一定都是童年生活中必不可少的存在,是不少美好回忆的载体。 但与过去单纯地看电视不同,如今的电视机产品正在承担更多价值。就比如电视产品开始从单纯的功能性消费品&#xf…

无公网IP远程访问内网部署的OpenMediaVault NAS

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

PCIe扫盲(九)

系列文章目录 PCIe扫盲(一) PCIe扫盲(二) PCIe扫盲(三) PCIe扫盲(四) PCIe扫盲(五) PCIe扫盲(六) PCIe扫盲(七&#xff09…

支持异步线程自动传递上下文(例如当前请求)的工具类(支持自定义上下文传递逻辑,支持拦截所有异步操作)

文章目录 支持异步线程自动传递上下文(例如当前请求)的工具类(支持自定义上下文传递逻辑,支持拦截所有异步操作)使用示范ContextSupportedAsyncUtil .java自动拦截所有异步线程池操作ContextSupportedExecutorAspect.j…

【Python基础】Python文件处理

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢! 文章目录 一、前言二、打开文件三、读取文件内容四、写入文件内容五、高级文件操作六、总结 一、前言 ​ 在Python中&am…

VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

地平线4登录xbox后提示需要登录档案怎么解决

这个游戏是真nt(在联机上),典型搞联机2小时游玩半小时,多半时间都花费在联机上了,不是为了联机和朋友跑车,早给他卸载了。 本人的游戏问题:看了一些视频感觉没什么作用,我的现象就是…

防火墙配置变更管理

在任何组织中,当涉及到网络安全时,频繁地更换防火墙是必要的,实施简化的防火墙更改管理策略模板可以减少管理时间,还可以减少每次变更引入新的安全性或合规性问题的可能性。典型的防火墙变更管理流程将包括以下步骤: …

【Finetune】(一)、transformers之BitFit微调

文章目录 0、参数微调简介1、常见的微调方法2、代码实战2.1、导包2.2、加载数据集2.3、数据集处理2.4、创建模型2.5、BitFit微调*2.6、配置模型参数2.7、创建训练器2.8、模型训练2.9、模型推理 0、参数微调简介 参数微调方法是仅对模型的一小部分的参数(这一小部分可…

Java lambda表达式的变量捕获

有人看到这个lambda表达式能够访问isQuit这个变量而且还是可以被修改的变量,就发出疑问了,之前不是说lambda不能不或变量吗? 1.规则 java的lambda表达式变量捕获规则只是针对于外部作用域的局部变量来说的!!&#xf…

3D虚拟商城是什么?有哪些优势?

在数字化转型的澎湃浪潮中,3D虚拟商店作为一股革新力量,正逐步构筑起商业展示与交易的全新维度,成为企业及商户不可或缺的战略资产。视创云展为品牌搭建3D虚拟商城提供技术支持,凭借高度精细的三维模拟空间,不仅为顾客…

vue2项目实现国际化(若依框架示例)

本文主要梳理vue2项目实现全项目格式化,在导航栏中切换,页面中所有的组件的默认语言随之切换,搭配vue-i18n插件 文章目录 基础准备引入插件vue-i18n 实现示例流程1. 创建国际化文件1.1 element文件夹1.2 locales文件夹1.3 index.js1.4 change…

设计模式之访问者模式:灵活访问对象结构的强大工具

访问者模式 访问者模式(Visitor Pattern)是一种行为型设计模式,允许在不改变数据结构的前提下定义在这些结构上的新操作。它将操作行为与对象结构分离,使得可以在不修改对象结构的情况下添加新的操作行为。 访问者模式的应用场景…

在网络环境中怎么保护个人信息安全?

在网络环境中保护个人信息安全非常重要,以下是一些基本的建议来帮助您保护自己的个人信息: 使用强密码:确保您的所有在线账户都使用强密码。强密码通常包含大写字母、小写字母、数字以及特殊字符,并且长度至少为12位以上。 启用双…

【Node.js】初识微服务

概述 Node.js 的微服务架构是一种通过将应用程序分解为独立的、松耦合的小服务的方式进行系统设计。 每个微服务负责处理一个特定的业务功能,并且这些服务可以独立开发、部署、扩展和管理,并且可以通讯。 它的核心思想就是解耦。 微服务和微前端是类…