《从Python小白到机器视觉大神:进阶之路全解析》
一、Python 编程基础
1.1 语法基础
Python 作为一种高级编程语言,具有简洁、易读的语法结构,为后续的机器视觉学习提供了坚实的基础。在数据类型方面,Python 涵盖了丰富多样的类型。整型用于表示整数,如5、-10等,可进行各种算术运算。浮点型则用于处理小数,像3.14、-2.5等,适用于需要高精度计算的场景。布尔型只有两个值,即True和False,常用于条件判断和逻辑运算。字符串是由字符组成的序列,用单引号或双引号括起来,如’Hello’、”World”,支持字符串拼接、切片等操作。
变量的定义极为简单,只需直接赋值即可,例如age = 20,这里age就是变量名,20是变量值。变量名的命名需遵循一定规则,由字母、数字和下划线组成,但不能以数字开头,且要具有描述性,便于理解。
运算符是对数据进行操作的符号。算术运算符有加(+)、减(-)、乘(*)、除(/)、取余(%)等,如3 + 5、10 / 2。赋值运算符用于给变量赋值,如=,a = 10表示将10赋给变量a。比较运算符用于比较两个值的大小关系,如大于(>)、小于(<)、等于(==)等,5 > 3返回True。逻辑运算符有与(and)、或(or)、非(not),True and False返回False。
表达式由变量、常量和运算符组成,例如2 * (3 + 4)。语句则是执行特定操作的代码行,如print(‘Hello, World!’)用于在控制台输出字符串。控制流语句包括条件语句(if – elif – else)和循环语句(for、while)。if语句根据条件的真假决定是否执行相应代码块,例如:
age = 18
if age >= 18:
print('你已成年')
else:
print('你未成年')
for循环常用于遍历可迭代对象,如列表、字符串等,如下代码用于遍历列表并打印每个元素:
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)
while循环则在条件为真时持续执行循环体,例如:
count = 0
while count < 5:
print(count)
count += 1
1.2 函数与模块
函数是组织好的、可重复使用的代码块,用于实现特定功能。定义函数使用def关键字,例如定义一个计算两数之和的函数:
def add(a, b):
return a + b
在这个函数中,a和b是参数,函数体计算两数之和并通过return语句返回结果。调用函数时,只需传入相应的参数,如result = add(3, 5),此时result的值为8。函数可以有多个参数,也可以没有参数,还可以有默认参数,如:
def greet(name, message='Hello'):
print(f'{message}, {name}')
这里message是默认参数,若调用时不传入该参数,则使用默认值Hello。
模块是一个包含 Python 定义和语句的文件,以.py为扩展名。通过模块,可以将相关的代码组织在一起,提高代码的可维护性和可重用性。例如,在一个名为math_operations.py的文件中定义了一些数学运算函数:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
在另一个文件中使用这些函数时,需要先导入模块。导入模块有多种方式,如import math_operations,之后通过math_operations.add(3, 5)调用函数;也可以使用from math_operations import add,这样就可以直接使用add(3, 5)调用函数;还可以使用from math_operations import add as my_add,给函数起别名,以避免命名冲突。Python 标准库提供了大量实用的模块,如math模块用于数学计算,os模块用于操作系统相关的操作,datetime模块用于处理日期和时间等。
1.3 面向对象编程
在 Python 中,面向对象编程(OOP)是一种强大的编程范式。类是对象的蓝图或模板,用于定义对象的属性和方法。定义类使用class关键字,例如定义一个表示学生的类:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f'我叫{self.name},今年{self.age}岁')
在这个类中,__init__方法是构造函数,用于初始化对象的属性。self代表类的实例,通过它可以访问对象的属性和方法。name和age是对象的属性,introduce是对象的方法。创建类的实例时,只需调用类名并传入相应的参数,如student1 = Student(‘Alice’, 20),此时student1就是Student类的一个实例,可以调用其方法student1.introduce()。
继承是面向对象编程的重要特性之一,它允许一个类从另一个类继承属性和方法。例如,定义一个表示研究生的类,继承自Student类:
class GraduateStudent(Student):
def __init__(self, name, age, major):
super().__init__(name, age)
self.major = major
def research(self):
print(f'{self.name}正在研究{self.major}方向')
在这个类中,通过super().__init__(name, age)调用父类的构造函数初始化继承的属性,major是研究生类特有的属性,research是特有的方法。多态是指不同的对象对相同的方法做出不同的响应。例如,定义一个动物类和它的两个子类猫和狗:
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print('Meow')
class Dog(Animal):
def speak(self):
print('Woof')
当调用不同对象的speak方法时,会得到不同的输出,这体现了多态性。面向对象编程的封装特性通过将数据(属性)和操作数据的方法(方法)封装在一个对象中,同时限制外部对对象的直接访问,提高了代码的安全性和可维护性。
1.4 数据结构
Python 提供了丰富的数据结构,用于存储和处理数据。列表是一种有序、可变的数据结构,可以存储任意类型的数据。创建列表可以使用方括号,如fruits = [‘apple’, ‘banana’, ‘cherry’]。通过索引可以访问列表中的元素,索引从 0 开始,例如fruits[0]返回’apple’。可以使用append方法在列表末尾添加元素,fruits.append(‘orange’);使用insert方法在指定位置插入元素,fruits.insert(1, ‘kiwi’);使用remove方法删除指定元素,fruits.remove(‘banana’)。还可以使用切片操作获取列表的一部分,如fruits[1:3]返回[‘kiwi’, ‘cherry’]。
字典是一种无序、可变的数据结构,通过键 – 值对存储数据。创建字典可以使用花括号,如student = {‘name’: ‘Alice’, ‘age’: 20, ‘major’: ‘Computer Science’}。通过键可以访问对应的值,例如student[‘name’]返回’Alice’。可以使用update方法更新字典中的键值对,student.update({‘age’: 21});使用pop方法删除指定键的键值对,student.pop(‘major’)。
元组是一种有序、不可变的数据结构,创建元组可以使用圆括号,如coordinates = (10, 20)。元组的元素不能被修改,但可以通过索引访问,如coordinates[0]返回10。集合是一种无序、不重复的数据结构,用于成员关系测试和去重操作。创建集合可以使用花括号或set函数,如numbers = {1, 2, 3, 3, 4},集合会自动去除重复元素。可以使用add方法添加元素,numbers.add(5);使用remove方法删除元素,numbers.remove(2)。
1.5 文件操作
在 Python 中,文件操作是处理数据持久化的重要手段。文件操作包括文件的读取、写入和追加等。打开文件使用open函数,该函数接受文件名和打开模式作为参数。常见的打开模式有’r’(只读)、’w’(写入,会覆盖原有内容)、’a’(追加,在文件末尾添加内容)等。例如,以只读模式打开一个文件:
file = open('example.txt', 'r')
读取文件内容可以使用read方法,该方法会一次性读取文件的全部内容,如content = file.read()。读取文件的每一行可以使用readlines方法,该方法会返回一个包含每行内容的列表,例如:
lines = file.readlines()
for line in lines:
print(line.strip())
这里strip方法用于去除每行末尾的换行符。写入文件使用write方法,例如以写入模式打开一个文件并写入内容:
file = open('output.txt', 'w')
file.write('Hello, World!')
file.close()
追加内容到文件使用a模式,例如:
file = open('output.txt', 'a')
file.write('\nThis is a new line')
file.close()
在文件操作完成后,务必使用close方法关闭文件,以释放系统资源。为了确保文件在操作完成后被正确关闭,通常使用with语句,它会在代码块结束时自动关闭文件,例如:
with open('example.txt', 'r') as file:
content = file.read()
通过上述 Python 编程基础的学习,为后续深入学习机器视觉相关知识奠定了坚实的基础,使得学习者能够更好地理解和运用 Python 语言进行机器视觉项目的开发。
二、机器视觉基础概念
2.1 定义与原理
机器视觉是一门综合性技术,旨在通过光学装置和非接触式传感器,自动获取并处理真实物体的图像,以获取所需信息或用于控制机器人运动。其核心原理是模拟人类视觉系统,将光学图像转化为电信号,再经过一系列复杂的算法处理,实现对物体的识别、测量、定位和检测等功能。
从系统组成来看,机器视觉系统主要包含硬件和软件两大部分。硬件部分如同人类视觉系统的 “眼睛” 和 “神经系统”,其中相机的作用类似于人眼的视网膜,负责将通过镜头的光信号转换为电信号。相机的种类繁多,按芯片技术可分为 CCD 相机和 CMOS 相机;按靶面类型可分为面阵相机和线阵相机;按输出模式可分为模拟相机和数字相机等 。不同类型的相机在分辨率、速度、灵敏度等方面各具特点,适用于不同的应用场景。例如,在对图像质量要求极高的工业检测领域,常选用高分辨率的 CCD 相机;而在对帧率要求较高的视频监控场景中,CMOS 相机则更为常见。
镜头相当于人眼的晶状体,负责实现光束变换,将目标成像在图像传感器的光敏面上。镜头的性能直接影响到成像的质量,其参数如焦距、光圈、景深等对图像的清晰度、视野范围和层次感起着关键作用。焦距决定了镜头的视角和拍摄范围,短焦距镜头(广角镜头)具有较大的视角,适合拍摄广阔的场景;长焦距镜头(长焦镜头)则可以将远处的物体拉近,适用于对细节要求较高的拍摄。光圈控制着光线的进入量,影响图像的亮度和景深,大光圈可以获得浅景深效果,突出主体,虚化背景;小光圈则能使画面中的前后景物都保持清晰。景深是指在镜头聚焦调节中,能清晰成像的景物空间深度范围,合适的景深设置对于准确识别和测量物体至关重要。
光源的作用是照亮目标,突出感兴趣的特征,为相机提供良好的拍摄条件。光源的类型丰富多样,包括高频荧光灯、卤素灯、LED 灯等,其中 LED 灯因其具有能制成各种形状尺寸和角度、可按需调节亮度、散热好、亮度稳定、寿命长、反应快、电源可外触发、启动速度快可作频闪灯、综合成本低以及可实现客制化等诸多优点,在机器视觉领域得到了广泛应用 。照明方式也多种多样,如亮视野与暗视野、低角度照明、前向光直射照明、前向光漫射照明、背光照明等,不同的照明方式适用于不同的物体表面和检测需求。例如,对于表面光滑的物体,采用暗视野照明可以突出表面的缺陷;而对于需要检测物体轮廓的场景,背光照明则能提供清晰的轮廓信息。
软件部分则如同人类视觉系统的 “大脑”,承担着图像处理和分析的重任。图像处理算法是软件的核心,通过对相机采集到的图像进行预处理、增强、分割、特征提取等一系列操作,实现对物体的准确识别和分析。在工业生产中,通过对产品图像进行边缘检测算法处理,可以精确测量产品的尺寸,判断其是否符合规格;利用图像分割算法将产品从背景中分离出来,进而分析其表面是否存在缺陷 。随着深度学习技术的发展,基于神经网络的图像识别和分类算法在机器视觉中得到了广泛应用,能够实现对复杂场景和物体的高精度识别。
2.2 应用领域
机器视觉技术凭借其高精度、高可靠性、非接触式检测等优势,在众多领域展现出了巨大的应用价值。
在工业制造领域,机器视觉如同一位不知疲倦且精准无比的质检员,广泛应用于产品质量检测、尺寸测量、装配验证等环节。在汽车制造过程中,利用机器视觉系统可以对汽车零部件的尺寸进行精确测量,确保其符合设计要求;通过对车身表面进行缺陷检测,及时发现划痕、凹陷等问题,保证汽车的外观质量 。在电子制造行业,机器视觉可用于检测电路板上元器件的焊接质量,识别是否存在虚焊、漏焊等缺陷,提高电子产品的生产可靠性。在手机制造过程中,机器视觉系统能够快速准确地检测手机屏幕的亮点、坏点,以及外壳的平整度和颜色一致性。
安防监控领域中,机器视觉技术的应用使得监控系统从传统的被动监控向智能监控转变。通过人脸识别技术,安防系统可以快速识别人员身份,实现门禁控制、人员追踪等功能。在机场、火车站等公共场所,安装的智能监控摄像头能够实时监测人群流动情况,一旦发现异常行为,如人员聚集、奔跑等,立即发出警报,为维护公共安全提供有力支持。利用视频分析技术,还可以对监控画面进行实时分析,识别车辆的车牌号码、车型等信息,实现交通流量监测和违章行为抓拍。
自动驾驶是近年来发展迅猛的领域,机器视觉在其中扮演着不可或缺的角色,如同车辆的 “眼睛”,帮助车辆感知周围环境。通过摄像头采集道路图像,机器视觉系统可以识别交通标志、车道线、行人、车辆等目标,为自动驾驶汽车的决策和控制提供关键信息。在车辆行驶过程中,机器视觉系统能够实时监测前方车辆的距离和速度,自动调整车速,保持安全车距;当检测到行人时,及时发出警报并采取制动措施,避免碰撞事故的发生 。此外,机器视觉还可以与其他传感器(如激光雷达、毫米波雷达)融合,提高自动驾驶系统的可靠性和安全性。
医疗影像领域,机器视觉技术为医生提供了更精准、更高效的诊断工具。在医学影像诊断中,如 X 光、CT、MRI 等图像的分析,机器视觉可以帮助医生快速检测出病变区域,辅助诊断疾病。通过对肺部 CT 图像的分析,机器视觉系统能够自动识别出肺部结节,并判断其大小、形状和性质,为肺癌的早期诊断提供重要依据。在手术导航中,机器视觉技术可以实时跟踪手术器械的位置和运动轨迹,为医生提供精确的操作指导,提高手术的准确性和安全性。
2.3 发展历程与趋势
回顾机器视觉的发展历程,它犹如一部波澜壮阔的科技进化史,经历了多个重要阶段的演进。
早期阶段(20 世纪 50 年代 – 60 年代),机器视觉处于萌芽期,当时主要以简单的图像处理技术为主,如光学字符识别等,这些技术仅能对二维图像进行初步的分析和识别,功能相对单一 。1956 年,Rosenblatt 提出的感知机模型,作为机器学习和神经网络的早期尝试,为后续机器视觉技术的发展奠定了理论基础。
基于特征的方法阶段(20 世纪 60 年代 – 80 年代),研究人员开始关注图像的低级特征提取,如边缘检测、角点检测等技术应运而生。1970 年代,David Marr 提出的 “计算视觉” 理论,强调从图像中提取不同层次的特征以实现物体识别,这一理论为机器视觉的发展提供了重要的理论框架,推动了该领域的研究向更深层次迈进。
知识推理方法阶段(20 世纪 70 年代 – 80 年代),机器视觉的研究逐渐转向利用先前编程的规则和知识来理解和解释图像,试图让机器具备一定的智能推理能力。但这种方法受到规则和知识获取的限制,难以适应复杂多变的实际场景。
统计学习方法阶段(20 世纪 80 年代 – 90 年代),支持向量机、随机森林等统计学习方法开始引入机器视觉领域,用于目标检测和分类任务。这些方法通过对大量数据的学习,提高了机器视觉系统的性能和泛化能力。
随着深度学习时代(21 世纪初至今)的到来,机器视觉迎来了革命性的发展。2012 年,AlexNet 在 ImageNet 竞赛上的胜利,标志着深度学习在机器视觉中的崛起。深度学习的卷积神经网络(CNN)在图像分类、目标检测和语义分割等任务上取得了巨大成功,能够自动学习图像中的复杂特征,大大提高了识别的准确率和效率 。随后,GoogLeNet、VGG、ResNet 等一系列先进的深度学习模型不断涌现,进一步推动了机器视觉技术的发展和应用。
展望未来,机器视觉技术将呈现出以下几个重要发展趋势:
智能化将成为机器视觉发展的核心方向。随着人工智能技术的不断进步,机器视觉系统将具备更强的自主学习和决策能力,能够自动适应不同的场景和任务需求。通过深度学习算法的不断优化,机器视觉系统可以从大量的数据中学习到更丰富的特征和模式,实现对复杂物体和场景的精准理解和分析。在工业生产中,机器视觉系统能够自动识别不同类型的产品缺陷,并根据缺陷的严重程度提出相应的处理建议。
3D 视觉技术将得到更广泛的应用和发展。相比于传统的 2D 视觉,3D 视觉能够提供更丰富的物体信息,如物体的深度、形状等,在工业检测、自动驾驶、虚拟现实等领域具有巨大的应用潜力。在工业制造中,3D 视觉技术可以实现对复杂零部件的高精度三维测量和检测,提高产品质量控制的水平;在自动驾驶领域,3D 视觉与激光雷达等传感器的融合,能够更准确地感知周围环境,为车辆的自动驾驶提供更可靠的保障。
多模态融合也是未来机器视觉发展的重要趋势。将机器视觉与其他感知技术(如语音识别、触觉感知等)相结合,可以实现更全面、更准确的信息获取和理解。在智能机器人领域,通过视觉与触觉的融合,机器人能够更精确地操作物体,完成复杂的任务;在智能家居环境中,视觉与语音的结合可以实现更自然、便捷的人机交互。
随着物联网技术的普及,机器视觉将与物联网深度融合,实现设备之间的互联互通和数据共享。在工业生产中,机器视觉系统可以将采集到的数据实时传输到云端或其他设备上,实现远程监控和管理。通过对大量设备数据的分析,可以优化生产流程,提高生产效率和质量。
三、图像处理基础库 OpenCV
3.1 安装与配置
OpenCV 是一个功能强大的开源计算机视觉库,为机器视觉开发提供了丰富的工具和算法。在不同操作系统上安装 OpenCV 的方式各有特点,以下为你详细介绍。
在 Windows 系统中,若使用预编译的二进制文件,首先需访问 OpenCV 的官方网站或 GitHub 页面,下载适用于 Windows 的预编译二进制文件。下载完成后,解压该文件,将其中的库文件和头文件添加到你的项目中。若使用 Python,安装则更为简便,在命令行中运行pip install opencv-python即可完成安装。
对于 macOS 系统,可通过 Homebrew 或 pip 进行安装。使用 Homebrew 安装时,需先确保已安装 Homebrew,随后在终端中运行brew install opencv命令。若使用 Python,在终端执行pip install opencv-python便能完成安装。
Linux 系统下,安装方式有使用包管理器和从源代码编译两种。基于 Debian 的系统(如 Ubuntu),可在终端执行sudo apt-get install libopencv-dev进行安装;基于 Red Hat 的系统(如 Fedora 或 CentOS),则可使用sudo dnf install opencv-devel或sudo yum install opencv-devel命令 。从源代码编译的话,需从 OpenCV 的 GitHub 页面下载源代码,解压后进入相应目录,再按照 OpenCV 的官方文档进行编译和安装。
在完成 OpenCV 的安装后,还需进行环境配置。以 Windows 系统为例,在安装完成后,需将 OpenCV 的库文件路径添加到系统环境变量中。假设 OpenCV 安装在C:\opencv目录下,需将C:\opencv\build\x64\vc15\bin添加到系统变量的Path中。在 Visual Studio 中配置 OpenCV 时,新建项目后,在项目属性中进行如下设置:在 “VC++ 目录” 下的 “包含目录” 中添加C:\opencv\build\include、C:\opencv\build\include\opencv和C:\opencv\build\include\opencv2;在 “库目录” 中添加C:\opencv\build\x64\vc15\lib;在 “链接器” 的 “输入” 中,添加附加依赖项,如opencv_world453d.lib(根据实际安装的 OpenCV 版本而定)。
3.2 图像的读取、显示和保存
在 OpenCV 中,图像的读取、显示和保存是基础且重要的操作。
读取图像可使用cv2.imread()函数,该函数接受两个参数,第一个参数为图像的路径,第二个参数为读取模式,是可选参数。例如,img = cv2.imread(‘image.jpg’, cv2.IMREAD_COLOR)表示以彩色模式读取image.jpg图像,此时会忽略图像的透明度信息;若使用img = cv2.imread(‘image.jpg’, cv2.IMREAD_GRAYSCALE),则是以灰度模式读取图像,图像会被转换为单通道的灰度图像;而img = cv2.imread(‘image.jpg’, cv2.IMREAD_UNCHANGED)会读取包含透明通道的图像,保留图像的所有信息。
显示图像使用cv2.imshow()函数,该函数需要两个参数,第一个参数为显示图像的窗口名称,第二个参数为要显示的图像。例如,cv2.imshow(‘My Image’, img)会创建一个名为My Image的窗口,并在其中显示img图像。为了确保窗口能够正常显示,需要使用cv2.waitKey()函数等待按键事件,该函数的参数是以毫秒为单位的时间。例如,cv2.waitKey(0)表示无限期等待,直到用户按下任意键;cv2.waitKey(5000)则表示等待 5 秒,若在 5 秒内用户按下任意键,程序将继续执行,否则 5 秒后程序继续执行。在图像显示完成后,可使用cv2.destroyAllWindows()函数关闭所有由 OpenCV 创建的窗口,释放资源。
保存图像使用cv2.imwrite()函数,该函数接受两个参数,第一个参数为要保存的图像文件名,第二个参数为要保存的图像。例如,cv2.imwrite(‘new_image.jpg’, img)会将img图像保存为new_image.jpg文件。在保存图像时,需注意文件名的格式和路径,确保保存的文件能够正确存储在指定位置。
3.3 基本数据结构
在 OpenCV 中,Mat 是最为重要的数据结构,用于表示图像。Mat 对象由两部分数据组成,即矩阵头和一个指向存储所有像素值的矩阵的指针。矩阵头包含了矩阵的尺寸、存储方法、存储地址等信息,而指针则指向实际的像素数据。Mat 类提供了多种构造函数,用于创建不同类型的 Mat 对象。例如,Mat M(4, 4, CV_8UC3, Scalar(0, 0, 255))创建了一个 4×4 的 3 通道无符号 8 位整型矩阵,并初始化为蓝色(Scalar(0, 0, 255)表示蓝色)。
除了 Mat,OpenCV 中还有一些其他基本数据结构。例如,Point类用于表示二维坐标系下的点,它包含两个整形数据成员x和y,以及一些简单的成员方法。Point2f表示二维单精度浮点型点类,Point2d表示二维双精度浮点型点类,Point3i表示三维整型点类。Scalar是一个使用 4 个元素指定的特殊的Vec4X向量类模板的类模板,常用于表示颜色值,如Scalar(255, 0, 0)表示蓝色(在 OpenCV 中,颜色通道顺序通常为 BGR)。
在实际应用中,Mat 对象的操作非常丰富。例如,可以通过Mat对象的成员函数获取图像的属性,如img.rows获取图像的行数,img.cols获取图像的列数,img.channels()获取图像的通道数。还可以对 Mat 对象进行切片操作,获取图像的某个区域,如roi = img[100:200, 100:200]获取了图像中从第 100 行到第 200 行、第 100 列到第 200 列的区域。此外,Mat 对象还支持与其他数据结构的转换,如将 Mat 对象转换为 Numpy 数组,以便使用 Numpy 提供的丰富的数组操作函数。
四、图像处理技术
4.1 图像预处理
图像预处理是机器视觉中不可或缺的环节,旨在改善图像质量,为后续的分析和处理奠定良好基础。
灰度化是将彩色图像转换为灰度图像的过程,其原理是通过某种算法将彩色图像的三个颜色通道(如 RGB 通道)合并为一个灰度通道,从而去除颜色信息,仅保留亮度信息。这一操作大大简化了后续处理的复杂性,因为灰度图像在处理时只需考虑一个通道的数据,减少了计算量。在实际应用中,加权平均法是常用的灰度化方法,其公式为Gray = 0.299 * R + 0.587 * G + 0.114 * B,其中R、G、B分别代表红色、绿色和蓝色通道的值,通过这种方式计算出的Gray值作为灰度图像中对应像素的灰度值 。在 Python 中,利用 OpenCV 库实现灰度化的代码如下:
import cv2
# 读取彩色图像
img = cv2.imread('color_image.jpg')
# 转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这段代码中,cv2.imread()函数读取彩色图像,cv2.cvtColor()函数将彩色图像从 BGR 格式转换为灰度格式,最后通过cv2.imshow()函数显示灰度图像。
二值化是将灰度图像进一步转换为只有黑白两种颜色的图像,通过设定一个阈值,将灰度图像中的像素点根据这个阈值划分为两类:高于阈值的像素点被设置为白色(通常用 255 表示),低于阈值的像素点被设置为黑色(通常用 0 表示)。二值化操作使得图像中只包含目标和背景两种信息,极大地简化了图像内容,便于后续处理,如特征提取、边缘检测等任务。在 Python 中,实现二值化的代码如下:
import cv2
# 读取灰度图像
gray_img = cv2.imread('gray_image.jpg', 0)
# 二值化操作
ret, binary_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这段代码中,cv2.threshold()函数实现了二值化操作,其中第一个参数是输入的灰度图像,第二个参数是设定的阈值(这里为 127),第三个参数是最大值(这里为 255,即高于阈值的像素点将被设置为 255),第四个参数是阈值类型(这里为cv2.THRESH_BINARY,表示二值化操作)。
图像缩放是根据实际需求对图像的尺寸进行调整,常见的缩放方法有最近邻插值、双线性插值和双三次插值等。最近邻插值是最简单的插值方法,它将目标图像中的每个像素点直接映射到原图像中最近的像素点上,这种方法计算速度快,但可能会导致图像出现锯齿状边缘。双线性插值则是通过对目标像素点周围的四个像素点进行线性插值来计算目标像素的值,这种方法可以得到更平滑的图像,但计算量相对较大。双三次插值则是在双线性插值的基础上,对目标像素点周围的 1
作者:空云风语