OpenCV实战(基础知识三)

简介

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 npimage = 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 npimage = 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 npimage = 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.rhkb.cn/news/107191.html

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

相关文章

网络安全(红队)自学学习路线

想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全…

UE4 地形编辑基础知识 学习笔记

之前自己写过这样的功能,今天看到一个UE现成的 点击地形,选择样条 按住CTRL键点击屏幕中某一个点会在场景内生成一个这样的图标 再点两次,会生成B样条的绿线条 点击号再选择一个模型,会生成对应的链条状的mesh 拉高最远处的一个图…

python网络爬虫指南二:多线程网络爬虫、动态内容爬取(待续)

文章目录 一、多线程网络爬虫1.1 线程的基础内容、GIL1.2 创建线程的两种方式1.3 threading.Thread类1.4 线程常用方法和锁机制1.5 生产者-消费者模式1.5.1 生产者-消费者模式简介1.5.2 Condition 类协调线程 1.6 线程中的安全队列1.6 多线程爬取王者荣耀壁纸1.6.1 网页分析1.6…

开源双语对话语言模型 ChatGLM-6B 本地私有化部署

本文首发于:https://www.licorne.ink/2023/08/llm-chatglm-6b-local-deploy/ ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级…

H36M VS 3DPW datasets

1采集设备方面 H36M使用了高精度的多视角摄像机动态捕捉系统获得了非常准确和连贯的3D关节坐标标注。 3DPW使用了单目摄像机与IMU的复合传感系统进行采集,存在一定程度的标注噪声。 2场景环境方面 H36M主要针对室内定向动作,背景单一简洁。 3DPW重点是室外复杂环境中人的自…

3d max插件CG MAGIC中的蜂窝材质功能可提升效率吗?

工作中能提升效率也都是大家所想的,对于设计师的一个设计过程中,可能想怎么样可以更快呀,是哪个步骤慢了呢? 这样的结果只能说会很多,但是建模这个步骤,肯定是有多无少的。 为了让模型更加逼真&#xff0c…

html实现元素拖动替换

效果 实现 复制粘贴.html即可使用 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>拖动替换</title></head><style>.box {width: 500px;height: 500px;background: gainsboro;border-radius: 10px;}…

开源的经济影响:商业与社区的平衡

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Docker搭建私有仓库并迁移

目录 方案 A、B机器安装docker 设置阿里云镜像源 安装 Docker-CE并设置为开机自动启动 A机器准备数据 拷贝数据 B机器运行redis、mysql镜像 重启docker服务 方案 准备两台机器&#xff1a;A机器&#xff08;可以连接外网&#xff09;&#xff0c;B机器&#xff08;内网机器…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的&#xff1f; 蜂鸣器 是 一种 一体化结构 的电子训响器&#xff0c;可以发出声音的电子元器件 蜂鸣器分类&#xff1f; ①压电式蜂鸣器&#xff08;图左&#xff09; 称&#xff1a; 无源蜂鸣器 ②电磁式蜂鸣器&#xff08;图右&#xff09; 称&#xf…

电商PC端设计之店招

设计总资料&#xff1a; 1、裂帛 2、小狗电器 3、店招120PX&#xff0c;导航栏30px 4、毕业那些年的店招 5、操作实例&#xff0c;建立120PX的画布 6、产品多的时候要加搜索框 7、产品店招在左边&#xff0c;主推产品在右边 8、贝蒂佩琪 实战案例 1、利用画布调整图像大小 2、…

前端需要理解的Vue知识

1 模板语法 Vue使用基于 HTML 的模板语法&#xff0c;能声明式地将其组件实例的数据绑定到DOM。所有Vue 模板可以被符合规范的浏览器和 HTML 解析器解析。Vue 会将模板编译成高度优化的 JavaScript 代码。结合响应式系统&#xff0c;当应用状态变更时&#xff0c;Vue 能够智能…

AUTOSAR规范与ECU软件开发(实践篇)6.6 BSW模块代码生成

在BCT界面中配置完所需要的BSW模块后&#xff0c; 可以进行BSW模块相关代码与描述文件的生成&#xff0c; 点击ISOLAR-A主菜单中“ ”右边箭头&#xff0c; 选择Run Configuraions&#xff0c; 如图6.57所示。 将弹出如图6.58所示的界面。 图6.57 Run Configuraions配置&#x…

Cpp学习——编译链接

目录 ​编辑 一&#xff0c;两种环境 二&#xff0c;编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三&#xff0c;执行环境 一&#xff0c;两种环境 在程序运行时会有两种环境。第一种便是编译环境&#xff0c;第二种则是执行环境。如下图&#xff1a; 在程序运…

UI位置与布局

UI位置与布局 引言 发现UGUI的RectTransform定位还是很复杂的&#xff0c;感觉有必要详细了解一下 RectTransform 继承自Transform。他的local position由其他几个变量控制。建议不要直接设置position 目的是为了实现UI自动布局。这套方法将绝对定位&#xff0c;相对定位&a…

mysql sql 执行流程

监控查询缓存的命中率 show status like ‘%qcache%’; mysql 缓存机制&#xff0c;以及 8.0 为啥取消 select sql_NO_Cache * from 表 where xxx; # 不使用缓存

K8s学习笔记3

Kubernetes功能&#xff1a; Kubernetes是一个轻便的可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中&#xff0c;会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Goog…

origin导出pdf曲线超出边框

软件版本 软件版本Word2021Origin2021Adobe Acrobat Pro2023 问题描述 Origin导出的emf格式矢量图片&#xff0c;插入到Word中&#xff0c;显示正常&#xff0c;但是在使用Word导出→创建Adobe PDF→创建Adobe PDF导出PDF文件后&#xff0c;图片曲线就会超出边框&#xff0c…

cuda编程day001

一、环境&#xff1a; ①、linux cuda-11.3 opecv4.8.0 不知道头文件和库文件路径&#xff0c;用命令查找&#xff1a; # find /usr/local -name cuda.h 2>/dev/null # 查询cuda头文件路径 /usr/local/cuda-11.3/targets/x86_64-linux/include/cuda.h # find /usr/…