当前位置: 首页 > news >正文

Opencv图像处理

Opencv图像处理

图像阈值处理

图像阈值的处理通过cv2.threshold函数来进行处理,该函数的具体说明如下所示

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的反转

  1. 读取图像信息并将其转化为灰度图
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 
def showimg(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
img_dog = cv2.imread('./res/dog.jpg')
# 转化为灰度图
img_gray = cv2.cvtColor(img_dog,cv2.COLOR_BGR2GRAY)
img_gray.shape
showimg("dog",img_gray)

在这里插入图片描述

  1. 测试图像阈值的处理,并在行内绘制经过图像阈值处理之后的图像信息(彩色图像进行处理)
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img_dog, thresh1, thresh2, thresh3, thresh4, thresh5]
# 绘制出所需的图像信息
for i in range(6):plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

图像平滑处理

首先引出图像平滑处理的概念 -> 读入(给出)一张含有多个图像噪音的图片。对图像进行平滑处理可以简单的理解为使用滤波去除图像中噪音的过程

  1. 读入并展示含有噪音的经典图像数据
img_n = cv2.imread('./res/lenaNoise.png')
showimg('noise',img_n)

在这里插入图片描述

滤波可以类比与卷积操作,对图像中的像素值进行处理
使用均值滤波对图像进行处理。

cv2.blur(img, (3, 3))

  • img输入图像
  • (3,3)(5,5)处理的区域大小
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img_n, (3, 3))cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

从而可以看出明显的平滑处理的样式

在这里插入图片描述

# 方框滤波
# 基本和均值一样,可以选择归一化(True进行平均 False )
box = cv2.boxFilter(img_n,-1,(3,3), normalize=False)  cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

其他使用较多的方式包括了均值滤波和高斯滤波等一些常规的方法

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img_n, (5, 5), 1)  cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
#%%
# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img_n, 5)  # 中值滤波cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

所有的平滑处理结果进行展示

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

在这里插入图片描述

图像形态学操作

图像的形态学操作大多处理的是黑白背景的图片

图像的腐蚀操作 :(即设置迭代的次数和操作的大小)对白色的边缘区域来进行进一步的处理。

在这里插入图片描述

dige = cv2.imread('./res/dige.png')cv2.imshow('img', dige)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.erode(dige,kernel,iterations = 2)

  • 图像
  • 操作大小
  • 迭代次数
kernel = np.ones((3,3),np.uint8) 
erosion = cv2.erode(dige,kernel,iterations = 2)cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

腐蚀操作的一个逆操作可以看作是一个膨胀操作。(使得白色的区域变大)

在执行腐蚀完成之后白色的小区域虽然去掉了,但是线条的大小变小,因此需要使用膨胀操作

cv2.dilate(erosion,kernel,iterations = 1)

  • erosion经过腐蚀操作之后的图像。
kernel = np.ones((3,3),np.uint8) 
dige_dilate = cv2.dilate(erosion,kernel,iterations = 1)cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
完成膨胀操作进行扩充线条的粗细。

开运算与闭运算

开运算(cv2.MORPH_OPEN):先腐蚀,再膨胀 闭运算(cv2.MORPH_CLOSE):先膨胀,再腐蚀

本质就是一个综合进行处理的过程信息。cv2.morphologyEx()

# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 闭:先膨胀,再腐蚀
img = cv2.imread('dige.png')kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

梯度运算

梯度(cv2.MORPH_GRADIENT)=膨胀-腐蚀:简单理解是梯度运算是用来筛选图片的边界区域的。

  1. 水平连接经过膨胀和腐蚀的两个区域。
    res = np.hstack((dilate,erosion))
# 梯度=膨胀-腐蚀
pie = cv2.imread('./res/pie.png')
kernel = np.ones((7,7),np.uint8) 
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)res = np.hstack((dilate,erosion))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

  1. 执行梯度运算来进行筛选。
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

相关文章:

Opencv图像处理

Opencv图像处理 图像阈值处理 图像阈值的处理通过cv2.threshold函数来进行处理,该函数的具体说明如下所示 ret, dst cv2.threshold(src, thresh, maxval, type) src: 输入图,只能输入单通道图像,通常来说为灰度图 dst&#x…...

LeetCode | 2879.显示前三行

在 pandas 中,可以使用 head() 方法来读取 DataFrame 的前几行数据。如果想读取指定数量的行,可以在 head() 方法中传入一个参数 n,读取前 n 行 import pandas as pddef selectFirstRows(employees: pd.DataFrame) -> pd.DataFrame:retur…...

Qt实现简易播放器

效果如图 源码地址: 简易播放器: 基于Qt的简易播放器,底层采用VLC源码 - Gitee.com GitHub:GitHub - a-mo-xi-wei/easy-player: 基于Qt的调用VLC的API的简易播放器...

适配Android12启动页

今天我们讲个什么话题呢?我们今天讲的内容是,Android12新启动页的支持API。 启动页我想大家都不陌生吧,通常的写法就是先创建一个SplashActivity,在onCreate中 Handler(Looper.getMainLooper()).postDelayed({// 在这里跳转主界…...

人工智能在医学领域的应用及技术实现

欢迎来到 Papicatch的博客 目录 🍉引言 🍉 医学影像分析 🍈技术实现 🍍数据准备 🍍模型构建 🍍模型训练 🍍模型评估 🍍应用部署 🍈示例代码 🍉 基因…...

MySQL—多表查询—练习(1)

一、引言 上几篇关于多表查询的基本几个部分全部学习完了。 多表查询的基本类型的查询包括以下: 1、内连接(隐式内连接、显示内连接):... [INNER] JOIN ... ON 条件; ) 2、外连接(左外连接、右外连接&…...

千益畅行:合法合规的旅游卡服务,打破误解

近期,千益畅行旅游卡服务引起了公众的广泛关注。然而,一些人对该服务存在误解,认为其存在某种欺诈行为。但经过深入了解和全网搜索证据,我们可以确认,千益畅行实际上是一家合法合规的旅游卡服务提供商。 千益畅行旅游…...

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本,这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示: 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…...

怎样把便签里的内容移到桌面?桌面便签软件使用方法

每次打开电脑,我总是被满屏的文件和图标弄得眼花缭乱。那些记录在各式各样便签里的重要事项,经常被埋没在这信息的海洋中,找起来真是头疼。想必很多人都有过这样的困扰:如何在繁杂的桌面环境中,一眼就看到自己需要提醒…...

量化入门:qmt获取可转债基本信息和行情数据

💻专业版获取可转债数据 今天将展示如何使用Python和QMT来获取可转债的实时数据和财务数据。 🔬 获取可转债基本信息 迅投的券商版和基础版都不支持可转债行情,投研专业版才支持,一年大概5000元。免费的券商版可参考QMT量化入门 投研专业版才有权限调用download_cb_d…...

AVL树 ---(C++)

本篇讲全面的讲解 AVL 树的插入,旋转以及验证 AVL 树的性能(本篇未实现删除代码)。至于为什么会有 AVL 树,这是因为简单的二叉搜索树并不能直接的保证搜索的效率,因为当我们在二叉搜索树中插入一段有序的序列的时候&am…...

基于spring boot+MySQL 小区物业管理系统-计算机毕设 附源码37236

spring boot 小区物业管理系统 摘 要 在网络信息的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,小区物业只能以客户为导向,以产品的持续创新作为小区物…...

Linux/Ubuntu/Debian常用服务管理命令

Linux/Ubuntu/Debian常用服务管理命令 在 Linux 系统中,服务管理是系统管理员日常维护工作的重要组成部分。通过一些常用的命令,我们可以查看服务状态、启动或停止服务、重启服务等。掌握这些命令,可以让系统管理工作更加高效和便捷。 1. s…...

Maven的三种项目打包方式——pom,jar,war的区别

1、pom:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。 聚合工程只是用来帮助其他模块构建的工具,本身并没有实质的内容。具体每个工程代码的编写还是在生成的工程中去写。 对于在父工程…...

[手游] 三色绘恋S Mobile Link

语音合成TTS: 文字转成语音的工具 WPS免登录一键修改器: 去除烦人的登录且能正常使用 故事简介: 深秋的雨季即将到来,正值那个为人所熟知的故事发生的前一年—— 地点:湖北省的重点高中,武汉师贰高校。 新学年开始,各…...

nss刷题(4)

1、[SWPUCTF 2021 新生赛]easyrce <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> if(isset($_GET[url])) isset函数用来检测url变量是否存在&#xff1b;$_GET函数获取变量数据 eval($_GET[url]); eval函数用…...

iOS调整collectionViewCell顺序

效果图 原理 就是设置collectionView调整顺序的代理方法&#xff0c;这里要注意一点 调整过代理方法之后&#xff0c;一定要修改数据源&#xff0c;否则导致错乱。 还有就是在collectionView上面添加一个长按手势&#xff0c;在长按手势的不同阶段&#xff0c;调用collectionV…...

【回调函数】

1.回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方…...

找树左下角的值-力扣

本题个人认为不能叫做 找树左下角的值&#xff0c;左下角再怎么说也应当在树的左子树上&#xff0c;本题要求的节点是树最底层最左边的值。 首先想到的解法是对二叉树进行层序遍历&#xff0c;并记录本层第一个节点的值&#xff0c;当层序遍历结束时&#xff0c;此时记录的值即…...

【AI应用探讨】— Gemma2模型应用场景

目录 1. 金融风险管理 2. 营销策略优化 3. 医疗保健领域 4. 供应链管理 5. 人力资源管理 6. 自然语言处理&#xff08;NLP&#xff09; 7. 图像识别 8. 音频信号处理 9. 总结 1. 金融风险管理 场景描述&#xff1a;Gemma 2模型在金融领域可用于预测金融市场的波动性和…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...