《数字图像处理》-上机 5 图像阈值化处理、霍夫变换及形态学算法

news2025/1/19 11:07:09

一、上机目的

学习图像阈值化处理、霍夫变换、形态学算法及编程实现方法

二、相关知识及练习

1、图像阈值化处理

图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提 取图像中的物体,将图像的背景和噪声区分开来。 灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。阈值化处 理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式所示: 当某个像素点的灰度 Gray(i,j)小于阈值 T 时,其像素设置为 0,表示黑色;当灰度 Gray(i,j)大于或等于阈值 T 时,其像素值为 255,表示白色。 在 Python 的 OpenCV 库中,提供了固定阈值化函数 threshold()和自适应阈值化函数 adaptiveThreshold(),将一幅图像进行阈值化处理。

(1) 固定阈值化处理

OpenCV 中提供了函数 threshold()实现固定阈值化处理,其函数原型如下: dst = cv2.threshold(src, thresh, maxval, type[, dst]) – src 表示输入图像的数组,8 位或 32 位浮点类型的多通道数 – dst 表示输出的阈值化处理后的图像,其类型和通道数与 src 一致 – thresh 表示阈值 – maxval 表示最大值,当参数阈值类型 type 选择 CV_THRESH_BINARY 或 CV_THRESH_BINARY_INV 时,该参数为阈值类型的最大值 – type 表示阈值类型 其中,threshold()函数不同类型的处理算法如表所示。

2、霍夫变换

霍夫变换是一种在图像中寻找直线,圆形以及其他简单形状的方法。霍夫变换采用类似 于投票的方式来获取当前图像内的形状集合,该变换由 Paul Hough(霍夫)于 1962 年首次 提出。 最初的霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能够识别直线,还能识 别其他简单的图形结构,常见的有圆形,椭圆等。 我们下面来看看如何使用霍夫变换来检测直线。一条直线可以用数学表达式 y = mx + 或者 ρ = xcosθ + y sinθ表示(极坐标)

  • 上机目的

学习图像阈值化处理、霍夫变换、形态学算法及编程实现方法

  • 相关知识
  1. 图像阈值化处理
  1. 固定阈值化处理
  2. 自适应阈值处理
  1. 霍夫变换
  2. 图像形态学算法
  1. 图像腐蚀与图像膨胀
  • 上机练习

按照上面相关知识的介绍,学会利用 opencv 进行灰度图像及彩色图像的读、显示及写 操作,并编写相应的测试程序。

  1. 图像阈值化处理
  1. 练习:运行程序并查看结果,尝试修改阈值查看结果变化

A、二进制阈值化

代码部分:

运行截图:

将阈值修改为原来的一般,即“127”→“64”后的结果为:

    1. 截断阈值化

代码部分:

运行结果为:

可见相比于二进制阈值的处理结果,图像的明暗程度变浅了。

    1. 阈值化为 0

练习:编写图像阈值化为 0 处理的程序,并与上面的两种阈值化处理算法进行比较。

代码部分:

运行结果:

可见:

当图像阈值化为 0 处理时,效果要比上面的两种阈值化处理算法的灰度值是不一样的。

  1. 自适应阈值化处理

运行程序,并对程序中用到的三种阈值化算法进行对比。

代码部分:

运行结果:

可见,当同一幅图像上的不同部分具有不同亮度时,采用自适应阈值化处理方法可以使得同一幅图像上的不同区域采用不同的阈值,在亮度不同的情况下得到了更好的结果。

  1. 霍夫变换:

练习:理解并运行程序,通过调整参数查看检测结果的变化。

代码部分:

运行结果为:

4、图像腐蚀代码实现

练习:运行上述程序,查看运行结果是否完全去除干扰细线,针对运行结果尝试 进一步改善。

代码部分:

运行结果为:

修改参数可得效果更有的结果:

5、图像膨胀代码实现

练习:理解并运行上述程序,查看运行结果,评价运行效果及分析原因。

代码部分:

运行结果:

 

通过结果可见:将图像中的高亮区域 或白色部分进行扩张,其运行结果图比原图的高亮区域更大,线条变粗了。

  • 编程练习作业:尝试利用形态学算法实现下面的指纹图像预处理

首先图像腐蚀:

import cv2
import numpy as np
#读取图片
src = cv2.imread('Fingerprint2.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((9,9), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow(
"result", erosion)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

接着图像膨胀处理:

import cv2
import numpy as np
#读取图片
src = cv2.imread('Fingerprint2.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((9,9), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel)
#显示图像

kernel2 = np.ones((2,2), np.uint8)
erosion2 = cv2.dilate(erosion
, kernel)
cv2.imshow(
"src", erosion)
cv2.imshow(
"result", erosion2)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

最后再腐蚀:

import cv2
import numpy as np
#读取图片
src = cv2.imread('Fingerprint2.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((9,9), np.uint8)
#图像腐蚀处理
erosion = cv2.erode(src, kernel)
#显示图像

kernel2 = np.ones((4,4), np.uint8)
erosion2 = cv2.dilate(erosion
, kernel)

kernel3 = np.ones((
0,0), np.uint8)
erosion3 = cv2.erode(erosion2
, kernel)
cv2.imshow(
"src", erosion2)
cv2.imshow(
"result", erosion3)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

调参数可得最终结果为:

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

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

相关文章

【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )

文章目录 一、函数定义方法1、命名函数2、函数表达式3、函数表达式示例 一、函数定义方法 1、命名函数 定义函数的标准方式 就是 命名函数 , 也就是之前讲过的 声明函数 ; 函数 声明后 , 才能被调用 ; 声明函数的语法如下 : function functionName(parameters) { // 函数体 …

探索前端架构:MVC、MVVM和MVP模式

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可,左侧放置图片label,右侧放置文字label,就如上图所示; 但是这时的hover,press的伪状态是没有办法“传递”给里面的控件的,对btn的伪状态样式表的设置,是不…

提升工作效率:B端工作台设计基础详解

随着互联网和信息技术的快速发展,越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分,越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。 1. B端工作台设计原则 B端工…

16.springboot项目下使用事务(springboot-016-transaction)

事务是一个完整的功能&#xff0c;也叫作是一个完整的业务 事务只跟什么SQL语句有关&#xff1f;事务只跟DML语句有关系&#xff1a;增删改 DML,DQL,DDL,TCL,DCL 首先添加两个依赖以及MyBatis代码自动生成插件 <!--MySql驱动--><dependency><groupId>mysql…

Spring-IoC 基于注解

基于xml方法见&#xff1a;http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理&#xff0c;简化 Spring的 XML配置。 格式&#xff1a;注解(属性1"属性值1",...) 可以加在类上…

全球主机监控

全球主机监控 - 国内外VPS、云服务器的库存监控和优惠信息全球主机VPS库存监控补货通知 Stock Monitor 绿云GreenCloudVPS库存监控 搬瓦工BandwagonHost库存监控 斯巴达SpartanHost库存监控 CloudCone库存监控 AlphaVps库存监控 BuyVm 库存监控 Dmit库存监控 xTom/V.PS库存监控…

【上海大学计算机组成原理实验报告】二、数据传送实验

一、实验目的 了解在模型机中算术、逻辑运算单元的控制方法。学习机器语言程序的运行过程。通过人工译码&#xff0c;加深对译码器基本工作原理的理解。 二、实验原理 根据实验指导书的相关内容&#xff0c;本次实验所要用的CP226实验仪在手动方式下&#xff0c;运算功能通过…

前视声呐目标识别定位(三)-部署至机器人

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

攻防世界 xff_referer 题目解析

xff_referer 一&#xff1a;了解xxf和Referer X-Forwarded-For:简称XFF头&#xff0c;它代表客户端&#xff0c;也就是HTTP的请求端真实的IP&#xff0c;只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的&#xff0…

js表达式

js 数据&#xff1a; 字面量 1 123 变量 a 表达式 12 2*2 a&&b 表达式都会有一个返回结果。表达式仍然是数据&#xff0c;所有可以写字面量&#xff0c;变量的地方都可以写表达式 在JavaScript中&#xff0c;表达式中的运算符具有不同的优先级&#xff0c;这决定…

【OJ】动规练习六

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 413. 等差数列划分1.1 分析1.2 代码 2. 978. 最长湍流子数组2.1 分析2.2 代码 3. 139. 单词拆分3.1 分析3.2 代码 1. 413. 等差数列划分 1.1 分析 一、题目解析&#xff1a; 至少有三个元素才能构成等差数列&#xff…

JWT--study

JWT 1、简介 2、结构 头部 载荷 签证 应用 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>Token 生成 解析token package com.wang.utils;import io.…

用anaconda创建新的虚拟环境

1.打开Anaconda Prompt&#xff0c;进入base环境 2.确定新的虚拟环境的名字及python版本 conda create -n test python3.9选y并回车 3.创建成功 4.激活test环境 conda activate test然后就可以开始你的操作了~

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

Oracle RAC One Node,双胞胎变独生子?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

【Week-Y4】修改yolov5s中C3模块的结构,common.py文件解读

修改C3模块的结构 一、commom.py文件解析二、修改代码&#xff0c;运行train.py训练 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 &#x1f4d5;本次任务&#xff1a;将yolov5s网络模型…

LangChain入门:11.Pydantic(JSON)解析器实战

摘要 在数字化营销的浪潮中&#xff0c;自动化内容生成成为了提升效率和用户参与度的利器。本文将详细介绍如何利用LangChain的自然语言处理能力和Pydantic的数据验证特性&#xff0c;构建一个自动化的花店文案生成器。通过这个工具&#xff0c;您可以快速为各种花卉生成吸引人…

LLM:检索增强生成(RAG)

1 Embedding技术 简单地说&#xff0c;嵌入(Embedding)思想可以视为一种尝试通过用向量来表示所有东西的“本质”的方法&#xff0c;其特性是“相近的事物”由相近的数表示。 1.1 文本向量(Text Embedding) 在GPT中&#xff0c;文本嵌入(Text Embedding)是通过将输入文本中的每…