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

本文主要是介绍《数字图像处理》-上机 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()

调参数可得最终结果为:

这篇关于《数字图像处理》-上机 5 图像阈值化处理、霍夫变换及形态学算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877140

相关文章

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景