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

一、上机目的

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

二、相关知识及练习

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()

调参数可得最终结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI ClipSeg插件报错- resize_image出错应该怎么办

上一篇刚介绍了这个插件,结果emm..很快发现事情并不简单...结果又报错了。 后台报错信息: Unused or unrecognized kwargs: padding. !!! Exception during processing !!! Traceback (most recent call last): File "F:\ComfyUI-aki\execution.p…

4.2总结

了解了部分Api的使用并学习了接口的API API API包含了较多种类(System,Runtime等) System其实就是一个工具类,提供了一些与系统相关的方法 下面有一些常间的System方法 方法名说明public static void exit (int status)终止当前运行的ja…

配置code-server和texlive实现网页写tex

使用overleaf太卡了,有云服务器或者nas小主机,配置自己的code-servertexlive,来写论文。 之前用服务器配置过自己的overleaf,感觉不是很好用,缺少东西。 一、思路 使用docker先安装一个ubuntu,用dockerfil…

基于Python的微博舆论分析,微博评论情感分析可视化系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

c 语言 插值搜索(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素,跳转搜索需要 O(? n) 时间,二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进,…

(Mac/win)Lightroom Classic 2024---摄影师的必备工具,解锁图片处理新境界

Lightroom Classic 2024是一款由Adobe公司推出的专业照片编辑和管理软件。它提供了全面的照片处理工具,包括裁剪、色彩调整、滤镜等,并支持RAW格式编辑。该软件以强大的组织和管理功能闻名,允许用户通过关键字、标签等方式轻松查找和整理照片…

SAP新的扩展策略

在软件即服务(SaaS)应用的推动下,SAP Cloud优先的战略非常明显,随之带来的是SAP Clean core的战略,从经典的 ABAP 可扩展性模式转变为 SAP S/4HANA 现代可扩展性模式。那么Clean core战略到底是什么?新的扩…

MATLAB 统计滤波(去除点云噪声)(55)

MATLAB 统计滤波法(去除点云噪声)(55) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 点云统计滤波,是一种常用的去噪点方法,原始的点云数据中包含多种噪点,无法直接使用,往往需要通过一些方法去除噪点,而统计滤波在这方面的使用非常广泛常见,下面是去噪点后的…

书生作业2

Task 1 生成200字以上的笑话,可以看到使用不同的提示词,会有不同的效果。 如果使用提示词“讲一个笑话.200字以上”, 会有偶发的输出较短的笑话的情况。 如果使用提示词“讲一个200字以上的笑话”时,结果相对稳定。 下载目前两种…

MinGW使用std::thread报错error: ‘thread‘ is not a member of ‘std‘

目录 问题描述简单的测试代码报错及解决 问题描述 在windows上用vscode编写c代码进行编译时,一直上报error: ‘thread’ is not a member of std’的错误,搜索该错误上报都是说c版本不匹配,然后我在task.json里面添加了-stdc11之后还是报错&…

【Vue】watch监听复杂数据,新值与旧值一样

问题 watch监听复杂数据,例如数组,旧值与新值一样 解决方案 监听回调里返回新数组,新、旧数组地址改变,得到的值也就不一样,例↓ ()>[...data] 码 test.js // 数据 const musicList ref([{ id: 540000200805…

STM32-05基于HAL库(CubeMX+MDK+Proteus)串行通信案例(中断方式接收命令)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式,生成代码四、MDK打开生成项目,编写HAL库的功能代码五、运行仿真程序,调试代码 一、功能需求分析 在中断机制实现按键检测的案例之后,我们介绍串…

Rust egui(4) 增加自己的tab页面

如下图,增加一个Sins也面,里面添加一个配置组为Sin Paraemters,里面包含一个nums的参数,范围是1-1024,根据nums的数量,在Panel中画sin函数的line。 demo见:https://crazyskady.github.io/index.…

3. python练习题3-自由落体

3. python练习题3-自由落体 【目录】 文章目录 3. python练习题3-自由落体1. 目标任务2. 解题思路3. 知识回顾-%占位符格式化处理3.1 概述3.2 占位符的多种用法3.3 格式化操作符辅助指令3.4 将整数和浮点数格式化为字符串 4. 解题思路4.1 球第1次下落4.2 球第2次下落 5. 最终代…

可能是最便宜的姿态传感器,国产三轴加速度计SC7A20

可能是最便宜的姿态传感器 三轴检测 批量参考价格:整盘单价:1.242,一个包装10K,希望厂家能出点数量少的包装,这一盘太多了:) 特点 宽电压范围 1.71V-3.6V 1.8V 兼容数字 IO 口 低功耗模式下…

【论文精读】 GPT,GPT-2,GPT-3:大力出奇迹

系列文章目录 【论文精读】Transformer:Attention Is All You Need 【论文精读】BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding 文章目录 系列文章目录一、前言二、GPT(一)文章概览&#xf…

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包…

vue快速入门(五)v-show与v-if

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-if与v-show底层的区别v-if与v-show的效果 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

排序算法-希尔排序

希尔排序是插入排序的一种改进版本&#xff0c;通过将整个序列按一定间隔分组&#xff0c;对每个分组进行插入排序&#xff0c;然后逐渐减小间隔&#xff0c;直到间隔为1&#xff0c;最后对整个序列进行一次插入排序。希尔排序的核心思想是利用插入排序对近乎有序的序列进行排序…

Vue监听器watch的基本用法

文章目录 1. 作用2. 格式3. 示例3.1 value 值为字符串3.2 value 值为函数3.3 value 值为对象 4. 与计算属性对比 1. 作用 监视数据变化&#xff0c;执行一些业务逻辑或异步操作。 2. 格式 监听器 watch 内部以 key &#xff1a;value 的形式定义&#xff0c;key 是 data 中的…