【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

news2024/9/20 9:34:34

1 灰度图

import cv2  # 导入 OpenCV 库,用于图像处理
import numpy as np  # 导入 NumPy 库,用于数组操作
import matplotlib.pyplot as plt  # 导入 Matplotlib 库,用于绘图

# %matplotlib inline 是 Jupyter Notebook 特有的魔法命令,用于在 notebook 中内联显示 Matplotlib 绘图

# 读取图像文件
img = cv2.imread('./img/cat.jpg')  # 使用 OpenCV 的 imread 函数读取图像文件,路径为 './img/cat.jpg'
# 默认情况下,OpenCV 使用 BGR 色彩空间

# 将图像转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 使用 cvtColor 函数将 BGR 图像转换为灰度图像

# 获取灰度图像的形状
img_gray.shape  # 返回图像的形状,格式为 (高度, 宽度),例如 (414, 500)

cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

2 HSV

  • H - 色调(主波长)。
  • S - 饱和度(纯度/颜色的阴影)。
  • V值(强度)
import cv2  # 导入 OpenCV 库

# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道

# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

3 图像阈值

  • ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

import cv2
import matplotlib.pyplot as plt

# 对灰度图像应用不同的阈值处理方法
# img_gray 是输入的灰度图像
# cv2.threshold() 函数用于将图像转换为二值图像,并应用不同的阈值处理方法

# 使用阈值 127 和最大值 255 进行二值化
# cv2.THRESH_BINARY:像素值大于阈值设为最大值,其他设为 0
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)

# 使用阈值 127 和最大值 255 进行反向二值化
# cv2.THRESH_BINARY_INV:像素值小于阈值设为最大值,其他设为 0
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)

# 使用阈值 127 和最大值 255 进行截断
# cv2.THRESH_TRUNC:像素值大于阈值设为阈值,其他保持不变
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)

# 使用阈值 127 和最大值 255 进行零化
# cv2.THRESH_TOZERO:像素值大于阈值保持不变,其他设为 0
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)

# 使用阈值 127 和最大值 255 进行反向零化
# cv2.THRESH_TOZERO_INV:像素值小于阈值保持不变,其他设为 0
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

# 创建标题和图像列表用于显示
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5]

# 使用 matplotlib 显示图像
# 创建一个 2x3 的图像网格进行显示
for i in range(6):
    plt.subplot(2, 3, i + 1)  # 创建子图
    plt.imshow(images[i], 'gray')  # 显示图像,使用灰度色彩图
    plt.title(titles[i])  # 设置子图标题
    plt.xticks([])  # 隐藏 x 轴刻度
    plt.yticks([])  # 隐藏 y 轴刻度

# 显示所有子图
plt.show()

在这里插入图片描述

4 图像平滑处理

import cv2  # 导入 OpenCV 库

# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道

# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述

4.1 方框滤波

# 方框滤波
# 基本和均值一样,可以选择归一化
# 对图像应用方盒滤波
# cv2.boxFilter() 函数用于对图像进行均值滤波,方盒滤波是均值滤波的一种特殊形式

# img 是输入的图像,通常为彩色或灰度图像
# -1 表示输出图像与输入图像具有相同的深度(即数据类型)
# (3, 3) 是滤波器的内核大小,即 3x3 的方形内核
# normalize=True 表示内核的系数会被归一化,使得内核的所有元素之和为 1,这样滤波操作不会改变图像的亮度

# 将方盒滤波应用于图像,进行平滑处理
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.2 均值滤波

# 均值滤波
# 简单的平均卷积操作
import cv2  # 导入 OpenCV 库

# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道

# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"

# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键

# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

4.3 高斯滤波

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
# 对图像应用高斯模糊
# cv2.GaussianBlur() 函数用于对图像进行高斯模糊,以平滑图像并减少噪声

# img 是输入的图像,通常为彩色或灰度图像
# (5, 5) 是高斯内核的大小,即内核的宽度和高度为 5x5
# 内核的尺寸决定了模糊的程度,尺寸越大,模糊效果越强
# 1 是高斯内核在 x 轴方向的标准差 (sigmaX),控制模糊的范围和强度
# 对于高斯模糊,标准差越大,模糊效果越显著

# 将高斯模糊应用于图像,进行平滑处理
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
 

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.4 中值滤波

# 中值滤波
# 相当于用中值代替
# 对图像应用中值滤波
# cv2.medianBlur() 函数用于对图像进行中值滤波,中值滤波是一种有效的去噪方法

# img 是输入图像,通常为彩色或灰度图像
# 5 是滤波器的内核大小,即窗口的尺寸为 5x5
# 内核的大小必须是奇数,并且表示在应用滤波时考虑的像素区域的大小
# 中值滤波会在这个区域内对每个像素进行处理,将该区域内所有像素的中值作为当前像素的值
# 这种方法特别适用于去除椒盐噪声(salt-and-pepper noise)

# 将中值滤波应用于图像,进行噪声去除
median = cv2.medianBlur(img, 5)

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.5 图像展示

# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系…

kitti数据label的2d与3d坐标转为像素坐标方法与教程(代码实现)

文章目录 前言一、kitti标签label坐标转换的主函数1、主函数调用代码2、数据格式示意图二、kitti数据获取1、图像获取2、label标签数据获取3、标定文件数据获取 三、kitti标签坐标转换方法1、集成主函数-labels_boxes2pixel_in_image2、标签3d坐标转像素坐标-compute_box_3d(ob…

Caffenie配合Redis做两级缓存

一、什么是两级缓存 在项目中。一级缓存用Caffeine,二级缓存用Redis,查询数据时首先查本地的Caffeine缓存,没有命中再通过网络去访问Redis缓存,还是没有命中再查数据库。具体流程如下 二、简单的二级缓存实现-v1 目录结构 2…

MySQL——主从复制、读写分离

目录 前言 一、MySQL主从复制的概述 1、MySQL主从复制的概念 2、Mysql主从复制功能和使用场景 2.1、Mysql主从复制功能 2.2、Mysql主从复制使用场景 3、MySQL支持的复制类型 3.1、基于语句的复制 3.2、基于行的复制 3.3、混合复制 4、主从复制的工作过程 5、MySQL三…

iOS 15推出后利用邮件打开率的7种方法

自从苹果在2021年底推出iOS 15以来,邮件打开率就一直是一个让人头疼的指标。 Klaviyo市场情报主管Mindy Regnell表示:“对于启用了Apple邮件隐私保护(MPP)的用户来说,苹果会打开这些邮件并预先下载内容到他们的服务器…

2024年“华为杯”第二十一届中国研究生数学建模竞赛(附2004-2023年优秀论文合集)

中国研究生数学建模竞赛(以下简称“竞赛”)是教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一。本届比赛报名时间为:2024年6月1日&#xf…

数据结构——线性表(静态链表、循环链表以及双向链表)

1、静态链表 用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。 静态链表需要对数组的第一个和最后一个元素作为特殊元素处理,不存数据。 最后一个指向第一个有数据的下标地址,第一个游标指向第一个没有数据的下标地址。 我们对…

[译] 大模型推理的极限:理论分析、数学建模与 CPU/GPU 实测(2024)

译者序 本文翻译自 2024 年的一篇文章: LLM inference speed of light, 分析了大模型推理的速度瓶颈及量化评估方式,并给出了一些实测数据(我们在国产模型上的实测结果也大体吻合), 对理解大模型推理内部工…

职场答案薄

公司做大的过程就是创始人把职责一层层分摊下去的过程,公司里的各级领导在招聘时的原始诉求都是一样的,就是招到可以帮自己分担一部分工作的人,然后自己好集中精力去做更重要的工作 如何去做运营 1.流程制度(三个目的:…

AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级

随着人工智能(AI)和边缘计算技术的快速发展,两者在安防视频领域的应用日益广泛,为传统安防系统带来了革命性的变革。AI边缘计算技术通过将AI算法和模型部署在边缘设备上,实现了数据处理和智能决策的即时响应&#xff0…

FuTalk设计周刊-Vol.073

#AI漫谈 热点捕手 1.Midjourney 样式分享网站 群里设计师创建的 Midjourney 风格网站,用来收集高质量 Sref Codes,展示示例图并且展示风格关键词,使用场景,以及示例提示词,作者称会持续更新 链接https://aiartsecre…

【Java】String StringBuffer与StringBuilder(实操+面试+记忆方法)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 代码学习与性能测试4.1.1 代码4.1.2 性能测试结果 4.2 区别 五、总结&#…

uniapp升级Vue3:避坑指南与步骤详解

为什么要升级到 Vue3 Vue3 是 Vue.js 的最新版本,相比 Vue2,它带来了许多改进和新特性,比如更小的包体积、更好的性能、更强大的组合式 API 等。通过升级到 Vue3,我们可以享受到这些新特性带来的好处,提升项目的开发效…

全国-住宅区AOI数据

数据量级:54万,更新时间:2024年3月 覆盖字段: 名称,地址,经纬度,一级分类,二级分类,三级分类,默认图片,AOI围栏 数据来源于:魔行观察…

从知识孤岛到知识共享:内部知识库如何促进团队协作

在当今快速变化的商业环境中,企业内部的知识管理和协作能力成为决定其竞争力的关键因素之一。然而,许多企业面临着“知识孤岛”的困境,即各部门和团队之间信息交流不畅,知识和经验难以有效传递和共享,导致资源浪费、决…

Sanster/IOPaint:AIGC大模型GFPGAN人像修复/美颜:修复历史人物老照片(3)

Sanster/IOPaint:AIGC大模型GFPGAN人像修复/美颜:修复历史人物老照片(3) 使用大模型GFPGAN进行人像修复/美颜,比如修复历史上某些人物的老照片。 一、首先pip安装组件依赖库: pip install gfpgan 二&…

大模型之三十-语音合成TTS(coqui)

TTS是text2speech的简称,TTS主要的一些常见包括小说、对话、视频配音、chatbot、虚拟人等场景,因coqui/XTTS-v2生成质量高、完全开源、多语言支持等特点,所以本篇基于coqui/XTTS-v2工具包浅出TTS。官方文档见[link]。 介绍 Coqui TTS 是一个…

形象化理解pytorch中的tensor.scatter操作

定义 scatter_(dim, index, src, *, reduceNone) -> Tensor pytorch官网说这个函数的作用是从src中把index指定的位置把数据写入到self里面,然后给了一个公式: self[index[i][j][k]][j][k] src[i][j][k] # if dim 0self[i][index[i][…

ROS CDK魔法书:建立你的游戏王国(TypeScript篇)

引言 在虚拟游戏的世界里,数字化的乐趣如同流动的音符,谱写着无数玩家的共同回忆。而在这片充满创意与冒险的乐园中,您的使命就是将独特的游戏体验与丰富的技术知识相结合,打造出令人难以忘怀的作品。当面对如何实现这一宏伟蓝图…

MOS管G极串联电阻的作用是什么

MOS管栅极串联电阻是如何抑制谐振? 为什么会震荡? 首先了解一下LC串联谐振电路,虽然,LC串联在电路中运用的并不多,但是在无意中总会形成串联谐振,从而产生很多各种各样的现象。如果不了解其本质,会让我们很难理解。比如,使用同样的LC电路滤波,用到两个电路上,有的电…