OpenCV实战(基础知识三)

news2024/9/25 1:23:21

简介

OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C++语言编写,同时也支持Python、Java、C等语言。由于其开源和广泛使用的特点,在计算机视觉和机器学习领域得到了广泛的应用。

1.图像阈值

图像阈值化(Image Thresholding)是一种常用的图像处理技术,它用来将图像分割成不同的区域或提取出感兴趣的目标。阈值化基于图像中像素灰度值的阈值进行二值化处理,将像素分为两个类别:满足条件的像素为一个类别,不满足条件的像素为另一个类别 。

图像阈值化的主要步骤如下:

  1. 灰度化:将彩色图像转换为灰度图像,这样每个像素只有一个灰度值。

  2. 选择阈值:根据应用需求和图像特性,选择一个适当的阈值。

  3. 阈值化处理:将图像中的每个像素与阈值进行比较,并根据比较结果设置像素的输出值。

在 OpenCV 中,可以使用 cv2.threshold() 函数来执行图像阈值化操作。

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

 

  1. ret:阈值化操作的阈值,即根据阈值对图像进行二值化后得到的阈值。

  2. dst:阈值化后的输出图像,即应用阈值化操作后得到的二值图像。

其中,src 是输入的源图像,thresh 是用于二值化的阈值,maxval 是输出图像中设置为最大值的像素值,type 是阈值化的类型。

除了上述两个返回参数外,你还可以选择性地传递额外的 dst 参数作为输出图像的占位符,以便在函数调用时直接指定输出图像的尺寸和数据类型。如果未提供 dst 参数,函数将会创建一个与输入图像 src 相同尺寸和数据类型的输出图像。

请注意,阈值化类型 type 可以是以下选项之一:

  • cv2.THRESH_BINARY:二值阈值化,大于阈值的像素值设为 maxval,小于等于阈值的像素值设为 0。

  • cv2.THRESH_BINARY_INV:反二值阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值设为 maxval

  • cv2.THRESH_TRUNC:截断阈值化,大于阈值的像素值设为阈值,小于等于阈值的像素值保持不变。

  • cv2.THRESH_TOZERO:零阈值化,大于阈值的像素值保持不变,小于等于阈值的像素值设为 0。

  • cv2.THRESH_TOZERO_INV:反零阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值保持不变。

import cv2
import matplotlib as plt
import numpy as np

# 读取图像
image = cv2.imread('image/1.jpg')

# 使用不同阈值化方法进行图像处理
# 阈值为127,最大值为255
# cv2.THRESH_BINARY: 二值阈值化
ret, img = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# cv2.THRESH_BINARY_INV: 反二值阈值化
ret, img1 = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV)
# cv2.THRESH_TRUNC: 截断阈值化
ret, img2 = cv2.threshold(image, 127, 255, cv2.THRESH_TRUNC)
# cv2.THRESH_TOZERO: 零阈值化
ret, img3 = cv2.threshold(image, 127, 255, cv2.THRESH_TOZERO)
# cv2.THRESH_TOZERO_INV: 反零阈值化
ret, img4 = cv2.threshold(image, 127, 255, cv2.THRESH_TOZERO_INV)

# 将多个处理后的图像水平拼接在一起
result = np.hstack([img, img1, img2])

# 显示结果图像
cv2.imshow('IMG', result)
cv2.waitKey()
cv2.destroyAllWindows()

这边展示前三种的效果,有兴趣可以全部尝试一下

2.形态学

2.1 膨胀操作

1、什么是膨胀与腐蚀

膨胀与腐蚀属于形态学范围,具体的含义根据字面意思来理解即可。但是更形象的话就是“增肥”与“减肥”。

它们的用途就是用来处理图形问题上。总结性的来说: + 膨胀用来处理缺陷问题; + 腐蚀用来处理毛刺问题。

膨胀就是把缺陷给填补了,腐蚀就是把毛刺给腐蚀掉了。这里其实说的并不严谨,也是为了大家理解方便。下面我们就用实例来进行演示。

dst = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数说明:

  • src:输入图像,可以是灰度图像或彩色图像,数据类型为 uint8
  • kernel:膨胀操作的结构元素,用于定义膨胀的形状和大小。通常为矩形、十字形或椭圆形。
  • dst:输出图像,与输入图像具有相同的大小和类型,可选参数。
  • anchor:锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心点。
  • iterations:膨胀操作的迭代次数,默认为 1。
  • borderType:边界扩展类型,默认为 cv2.BORDER_CONSTANT
  • borderValue:边界值,在使用 cv2.BORDER_CONSTANT 边界扩展类型时有效,默认为 0。
import cv2
import numpy as np

image = cv2.imread('image/img.png')

kernel = np.ones((3 * 3), dtype=np.uint8)
dilate = cv2.dilate(image, kernel, 1)

result = np.hstack([image, dilate])

cv2.imshow('IMG', result)
cv2.waitKey()
cv2.destroyAllWindows()

可以看到右边的线条比左边的要粗一下,这个就是膨胀操作

kernel = np.ones((4 * 4), dtype=np.uint8) 更改卷积核大小
dilate = cv2.dilate(image, kernel, 3)更改迭代次数

二者均可使膨胀效果更为明显

 

2.2 腐蚀操作

腐蚀操作和膨胀操作相反,也就是将毛刺消除

这边的函数参数和膨胀的是一样的这里就不做详细说明了。

import cv2
import numpy as np

image = cv2.imread('image/img.png')

# kernel = np.ones((3 * 3), dtype=np.uint8)
# dilate = cv2.dilate(image, kernel, 1)
# result = np.hstack([image, dilate])
kernel = np.ones((3*3),dtype=np.uint8)
erosion = cv2.erode(image,kernel,1)
result = np.hstack([image,erosion])

cv2.imshow('IMG', result)
cv2.waitKey()
cv2.destroyAllWindows()

 

2.3 开运算和闭运算

开运算:先腐蚀,在膨胀 闭运算:先膨胀,在腐蚀

我们在上面的膨胀和腐蚀的图片中可以看到,图片大小程度上都受到了损失,字体信息缺失或者变粗等等。如果我们不想更改原有信息,即字体粗细。那么我们可以使用上面的两种运算。例如开运算,先对字体进行变细,在对字体进行变粗,整体上字体粗细不会发生变化。毛刺信息在腐蚀的时候就已经消除了,膨胀也不会膨胀出多余信息。

2.3.1、开运算

dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • src:输入图像,可以是灰度图像或彩色图像,数据类型为 uint8
  • op:形态学操作类型,可选项包括 cv2.MORPH_ERODE(腐蚀)、cv2.MORPH_DILATE(膨胀)、cv2.MORPH_OPEN(开运算)、cv2.MORPH_CLOSE(闭运算)等。
  • kernel:形态学操作的结构元素,用于定义操作的形状和大小。通常为矩形、十字形或椭圆形。
  • dst:输出图像,与输入图像具有相同的大小和类型,可选参数。
  • anchor:锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心点。
  • iterations:形态学操作的迭代次数,默认为 1。
  • borderType:边界扩展类型,默认为 cv2.BORDER_CONSTANT
  • borderValue:边界值,在使用 cv2.BORDER_CONSTANT 边界扩展类型时有效,默认为 0。

 

import cv2
import numpy as np

image = cv2.imread('image/img_1.png')

kernel = np.ones((4 * 4), dtype=np.uint8)
# dilate = cv2.dilate(image, kernel, 1)
# result = np.hstack([image, dilate])

# kernel = np.ones((4 * 4), dtype=np.uint8)

opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, 1)
result = np.hstack((image, opening))

# erosion = cv2.erode(image, kernel, 2)
# result = np.hstack([image, erosion])

cv2.imshow('IMG', result)
cv2.waitKey()
cv2.destroyAllWindows()

 我们发现大部分毛刺已经消除,而且字体信息也没有发生变化,这也就是我们想要的效果。虽然仍然有一部信息没有被清除,我们只需要调整卷积核的大小就可以实现。

2.3.2、闭运算

字体不改变的前提下,我们把字体缺陷信息补全。 

3.梯度计算

梯度计算主要显示的是边缘信息。计算的方法:

膨胀的图像 - 腐蚀的图像

我们明显的看出,用大一圈的图像减去小一圈的图像正好就是边缘的信息。

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

 

 

我们可以看出来,我们形成了一个空心的字体样式

4、高帽和黑帽

高帽计算

我们知道开运算的结果就是去除毛刺,我们原始图像减去开运算结果就是我们要消除的毛刺信息。

 可以看出来,所有的毛刺信息我们全部提取了出来。

  可以看出来,所有的毛刺信息我们全部提取了出来。

黑帽操作

高帽操作显示毛刺,那么黑帽就是显示缺陷

高帽操作显示毛刺,那么黑帽就是显示缺陷。

这里我们看的不是很明显,我们只需要只要黑帽所处理的问题是什么。针对不同的场景应用不用的方法。 

 

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

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

相关文章

RocketMQ零拷贝原理

1 PageCache ●由内存中的物理page组成,其内容对应磁盘上的block。 ●page cache的大小是动态变化的。 ●backing store:cache缓存的存储设备。 ●一个page通常包含多个block,而block不一定是连续的。 1.1读Cache ●当内核发起一个读请求时&#x…

Meta发布AI编码工具,或可实现智能生成代码和调试代码

据悉,日前Meta推出名为 Code Llama 的AI编码工具,号称“最先进的大型编码语言模型”。 该模型基于Llama 2大型语言模型打造,可以理解为“Llama 2 的写代码专用版”,能够“生成新的代码并调试人类编写的工作”,目前已上…

Mycat事务补偿设计

1.概述 在使用数据分片场景下,单库下的事务处理无法满足系统的需求,因而需要进行分布式事务处理设计。 2.主要方案对比分析 处理分布式场景下的事务有很多种方案,主要方案如下表所示: 主要技术 优点 缺点 适用场景 XA with 2PC (JTA)、…

左耳朵耗子:TCP 的那些事儿(下)

原文地址:https://coolshell.cn/articles/11609.html 这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西。但是T…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法: udf对象 sparksession.udf.register(参数1,参数2,参数3) 参数1:UDF名称,可用于SQL风格 参数2:被注册成UDF的方法名 参数3:声明UDF的返回值类型 ud…

部分调试记录

Ubuntu16.04纯命令行安装VMwareTools hudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools -yhudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools-desktop无法加载so文件,版本问题 [rootdragonboard /]# ./Qserial -qws .…

工厂生产作业流程合规检测

工厂生产作业流程合规检测系统通过yolov7网络模型算法,工厂生产作业流程合规检测对作业人员的操作行为进行全面监测,通过图像识别算法和数据分析,对人员的操作动作、工具使用、安全防护等方面进行检测和评估,能够实时监测工人的操…

10行Python代码能做出哪些酷炫的事情?

Python凭借其简洁的代码,赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代码实现许多有趣的操作。下面我们来看看,我们用不超过10行代码能实现些什么有趣的功…

【Linux】【驱动】驱动挂载的时候给驱动传递参数

【Linux】【驱动】驱动挂载的时候给驱动传递参数 绪论1.什么是驱动传参驱动传参就是传递参数给我们的驱动举例:2.驱动传参数有什么作用呢?3. 传递单个参数使用如下的数组4. 传递数组使用以下函数: 传递数字值代码指令 传递数组代码传递数组指令 绪论 1.什么是驱动…

拒绝摆烂!C语言练习打卡第六天

🔥博客主页:小王又困了 📚系列专栏:每日一练 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、选择题 📝1.第一题 📝2.第二题 &#x1f4d…

hbuilderx小程序基于Android的个人健身运动记录生活APP_45n2x

近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,记录生活信息利用计算机网络实现信息化管理,使整个记录生活管理的发展和服务水平有显著提升。 本文拟采用Android平台进行…

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

前言 基于我个人的工作内容和兴趣,想要在家里搞一套服务器集群,用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器,比如 Dell R730, 还搞了一套配置清单,如下: Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…

【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录 一、OSI & TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 一、OSI & TCP/IP模型 首先我们要了解OSI七层模型,和预支对应的TCP/IP 四层的模型。 用下面的图可以看出,TCP UDP 工作在传输层&…

JavaScript:基本语法(变量与函数的定义与使用)

文章目录 script 标签srcdefer 延迟加载 基本语法定义变量 与 使用变量基本类型typeof 查看变量类型复合类型数组类型定义对象类型定义 函数定义函数使用函数 script 标签 src 和scc一样可以内嵌也可以外src外引。 一般是推荐外引。 <script src"idx.js">&l…

机器视觉应用开发四大软件,那一个对我们从0到1建设你的机器视觉知识体系更好

我们首先要理解什么是知识体系&#xff1a; 我们身处一个知识爆炸时代&#xff0c;我们面对各种课程&#xff0c;各种知识&#xff0c;“自身学习”&#xff0c;“高效记忆”&#xff0c;“批判性思维”&#xff0c;“解决问题的能力”。各种平台课程太多&#xff0c;各种买买…

《华为认证》配置vlan聚合

1、实验环境&#xff1a;如图所示&#xff0c;配置vlan 10、20、100 &#xff0c;vlan 100作为聚合vlan&#xff0c;vlan 10、vlan20作为子vlan&#xff0c;vlan 10和vlan 20配置成相同网段的ip地址。Vlanif 100 作为vlan 10 和vlan20的网关&#xff0c;在vlanif100上配置arp代…

linux查看正在运行的nginx在哪个文件夹当中

1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录&#xff08;当前工作目录&#xff09;

基于Nodejs+vue的学习笔记分享系统设计与开发

本系统结合现今主流管理系统的功能模块以及设计方式进行分析&#xff0c;使用nodejs语言和vue.js框架进行开发设计&#xff0c;具体研究内容如下&#xff1a; (1) 管理员主要对个人中心&#xff0c;用户管理&#xff0c;笔记本管理&#xff0c;笔记分享管理&#xff0c;分享…

流量洪峰?不惧!手把手教你应对高并发挑战!

大家好&#xff0c;我是你们的小米&#xff01;今天我要和大家聊一个充满挑战和创意的话题&#xff1a;如何解决瞬时大流量高并发&#xff1f;想必很多小伙伴们在开发过程中都遇到过这个让人头疼的问题吧。别担心&#xff0c;我在这里和你分享我的经验&#xff0c;让你轻松驾驭…

网站巡检的重要性及其后果分析

在信息化、电子化的今天&#xff0c;网站已经成为企业、组织和个人展示形象、传播信息、提供服务的重要窗口。与此同时&#xff0c;为了确保网站的正常运行、用户体验和数据安全&#xff0c;定期的网站巡检就显得尤为重要。以下对网站巡检的重要性和可能的后果进行深入分析&…