当前位置: 首页 > news >正文

计算机视觉----基础概念、卷积

一、概述
1.计算机视觉的定义
计算机视觉(Computer Vision)是一个跨学科的研究领域,主要涉及如何使计算机能够通过处理和理解数字图像或视频来自动进行有意义的分析和决策。其目标是使计算机能够从视觉数据中获取高层次的理解,类似于人类的视觉处理能力。

具体来说,计算机视觉包括以下几个主要任务:

图像分类:识别图像中主要的物体或场景。例如,给定一张图片,确定它是猫还是狗。
目标检测:在图像中定位和识别多个目标。例如,在街景图像中识别并标注汽车、行人和交通标志的位置。
图像分割:将图像分割成不同的区域或对象。例如,将一张医疗影像分割成不同的器官和组织。
姿态估计:识别和分析人体或物体的姿态。例如,识别人类骨骼的关键点位置以估计其动作。
场景理解:从图像中理解更复杂的场景信息,包括物体之间的关系和背景环境。
三维重建:从二维图像中恢复三维结构信息。例如,从多张二维图片生成一个三维模型。
动作识别:从视频中识别和分类动作。例如,识别视频中人物是否在走路、跑步或跳舞。
计算机视觉技术在许多领域有广泛的应用,包括但不限于自动驾驶、医疗影像分析、人脸识别、监控系统、增强现实和虚拟现实、机器人技术以及智能制造。

为了实现这些目标,计算机视觉结合了多种技术和方法,包括但不限于图像处理、模式识别、机器学习和深度学习等。近年来,随着深度学习尤其是卷积神经网络(CNN)的发展,计算机视觉技术取得了显著的进展,显著提高了在图像和视频分析任务中的性能。

2.计算机视觉的应用/任务
计算机视觉在许多领域有广泛的应用,涵盖了从日常生活到高科技工业的各个方面。以下是一些主要的应用和任务:

1. 自动驾驶
目标检测和识别:识别道路上的车辆、行人、交通标志和其他障碍物。
车道检测:检测道路上的车道线,帮助车辆保持在正确的车道内。
路径规划:根据周围环境的变化规划行驶路线。
2. 医疗影像分析
图像分割:分割医学影像中的不同器官和病变区域,如肿瘤检测。
诊断辅助:辅助医生对X光片、CT扫描、MRI影像等进行诊断。
手术导航:在手术过程中提供实时的影像指导。
3. 安防监控
人脸识别:用于身份验证和监控,识别人脸并匹配数据库中的身份信息。
行为分析:检测和分析人群行为,识别潜在的异常或危险行为。
入侵检测:检测并报警未授权的进入。
4. 零售和电子商务
产品识别:识别商品并进行分类,用于库存管理和推荐系统。
虚拟试穿:通过增强现实技术,顾客可以虚拟试穿衣服或配饰。
客户分析:通过摄像头分析顾客的行为和购物模式,以优化店铺布局和营销策略。
5. 工业自动化
质量检测:检测生产线上产品的缺陷,如裂缝、瑕疵和尺寸偏差。
机器人引导:为工业机器人提供视觉导航,执行复杂的组装和操作任务。
自动化监控:监控生产过程,检测异常情况并及时报警。
6. 智能家居
人脸识别:用于智能门锁、安防系统和用户个性化服务。
姿态识别:识别用户的姿态和动作,用于控制家电设备或提供健康监测。
环境监测:通过摄像头监测家居环境,检测火灾、烟雾或水泄漏等情况。
7. 文档处理
光学字符识别(OCR):将扫描的文档或图片中的文字转换为可编辑的文本。
表单识别和处理:自动识别和提取表单中的信息,用于数据录入和管理。
手写体识别:识别和转换手写文字为数字文本。
8. 娱乐和媒体
视频编辑:自动标记和剪辑视频中的精彩片段,生成视频摘要。
特效制作:在电影和电视制作中添加视觉特效和动画。
增强现实(AR)和虚拟现实(VR):为游戏和娱乐应用提供沉浸式体验。
9. 农业和环境监测
作物监测:通过无人机和卫星图像监测农作物的生长情况和健康状态。
害虫检测:识别农作物上的病害和害虫,提供早期预警和防治措施。
环境保护:监测森林、河流和海洋的生态环境,检测污染和自然灾害。
这些应用展示了计算机视觉在不同领域的广泛潜力和实际价值。随着技术的不断进步,计算机视觉的应用范围和深度将会进一步扩展。

二、图像处理基本操作
1.图像存储在矩阵中,其中每个元素代表像素值


2.图像的表示:二值图像,灰度图,RGB图

3.常见颜色空间


HSV
HSV(Hue, Saturation, Value)是色彩空间的一种,它将颜色表示为色调(Hue)、饱和度(Saturation)和明度(Value)。这种表示方法与人类对颜色的感知更接近,因此在图像处理和计算机视觉中被广泛使用。下面是对HSV色彩空间的详细解释:

1. 色调 (Hue)
色调表示颜色的类型,范围通常在0到360度。
每个角度对应一种颜色:0度为红色,120度为绿色,240度为蓝色。
色调环绕一圈形成一个色环。
2. 饱和度 (Saturation)
饱和度表示颜色的纯度或灰度成分的多少。
范围从0到1(或0%到100%)。
0表示完全没有颜色(灰色),1表示完全纯色。
3. 明度 (Value)
明度表示颜色的亮度或强度。
范围从0到1(或0%到100%)。
0表示最暗(黑色),1表示最亮(白色或最亮的颜色)。
4.优势
直观:HSV色彩空间更符合人类对颜色的感知方式。
灵活:在进行颜色筛选和调整时,HSV比RGB更方便。
5.应用场景
图像分割:通过色调筛选特定颜色。
颜色校正:调整饱和度和明度以改善图像质量。
增强现实:在实时视频处理中使用色调分割对象。
HSV色彩空间在图像处理和计算机视觉中具有广泛的应用和实用性,尤其适合需要处理和分析颜色的任务。

YUV
YUV是一种颜色表示方法,广泛应用于视频压缩、图像处理和传输中。它将颜色信息分解为亮度(Y)和色度(U和V)分量。与RGB色彩空间不同,YUV分离了图像的亮度和色度信息,便于在图像处理和视频压缩中进行高效处理。

1. 分量介绍
Y(Luminance):亮度分量,表示图像的明暗程度。这个分量包含了图像的灰度信息。
U(Chrominance - Blue Projection):色度分量之一,表示蓝色的投影。
V(Chrominance - Red Projection):色度分量之一,表示红色的投影。
2. 优势
分离亮度和色度:YUV分离了亮度和色度信息,使得在视频压缩和传输中可以优先保留更多的亮度信息,而降低色度信息的精度,从而减少数据量。
兼容性:YUV色彩空间与黑白电视信号兼容,确保在彩色电视上播放时可以兼容黑白电视。
3. 应用场景
视频压缩:许多视频压缩标准(如MPEG、H.264)都使用YUV色彩空间,因为它能更好地压缩视频数据。
图像处理:在图像处理中,可以独立处理亮度和色度分量,提高处理效率和效果。
电视广播:YUV色彩空间在模拟和数字电视广播中被广泛使用。
4.总结
YUV色彩空间通过将颜色分解为亮度和色度分量,提供了一种高效的颜色表示方法。它在视频压缩、图像处理和传输中具有广泛的应用,尤其适用于需要处理和优化亮度和色度信息的场景。

4.图像平滑:均值滤波、中值滤波、低通滤波(允许低频分量通过,高平分量滤除)
图像平滑是一种区域增强的算法,主要目的是通过减少图像中的高频噪声来改善图像的质量。能够减少甚至消除噪声并保持高频边缘信息是图像平滑算法追求的目标。

均值滤波(Mean Filtering)
均值滤波(Mean Filtering),也称为平均滤波,是一种简单且常用的图像平滑技术,用于减少图像中的噪声。其基本思想是通过用局部邻域内像素的平均值替换中心像素值来达到平滑效果。这种方法在平滑图像的同时,可以有效地保留图像的主要特征。

4. 优点和缺点
优点:

简单易实现:均值滤波算法简单,计算开销低。
平滑效果好:能够有效地去除图像中的高频噪声。
缺点:

模糊边缘:由于计算均值时考虑了周围所有像素,图像的边缘和细节部分可能会被模糊。
不适用于脉冲噪声:对于含有脉冲噪声的图像,均值滤波可能无法有效去噪,反而可能扩散噪声。
5. 应用场景
噪声去除:均值滤波广泛用于图像预处理,去除随机噪声。
图像平滑:在图像处理中,均值滤波常用于平滑图像,以减少图像中的细节或进行图像分割前的预处理。
均值滤波作为一种基础的图像处理技术,在图像预处理和噪声去除中具有广泛的应用。然而,对于某些应用场景,如边缘保留和去除脉冲噪声,可能需要使用更高级的滤波技术,如中值滤波或双边滤波。

中值滤波(Median Filtering)
中值滤波(Median Filtering)是一种常用的非线性滤波技术,用于去除图像中的噪声,同时保留图像的边缘信息。它在处理椒盐噪声(salt-and-pepper noise)方面特别有效。中值滤波的基本思想是用邻域内像素值的中值替换中心像素值,从而减少噪声的影响。

1. 基本原理


3. Python 示例
使用Python和OpenCV实现中值滤波:

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 读取灰度图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 应用中值滤波
kernel_size = 5
filtered_image = cv2.medianBlur(image, kernel_size)
 
# 显示原始图像和中值滤波后的图像
plt.figure(figsize=(10, 5))
 
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
 
plt.subplot(1, 2, 2)
plt.title(f'Median Filtered Image (Kernel Size: {kernel_size}x{kernel_size})')
plt.imshow(filtered_image, cmap='gray')
plt.axis('off')
 
plt.show()

4. 优点和缺点
优点:

保留边缘:中值滤波在去噪的同时,能够很好地保留图像的边缘信息。
有效去除脉冲噪声:特别适用于去除椒盐噪声和其他类似的脉冲噪声。
缺点:

计算复杂度较高:由于需要对窗口内的像素进行排序,中值滤波的计算复杂度高于均值滤波。
不适用于高斯噪声:对于高斯噪声,中值滤波的效果可能不如高斯滤波。
5. 应用场景
噪声去除:中值滤波广泛用于去除图像中的椒盐噪声和其他类似的脉冲噪声。
图像预处理:在图像分割、边缘检测等图像处理任务中,中值滤波常用于平滑图像,同时保留重要的边缘信息。
中值滤波作为一种非线性滤波技术,在去除脉冲噪声和保留边缘信息方面具有显著优势。虽然计算复杂度较高,但在许多实际应用中,中值滤波仍然是非常有效的选择。

低通滤波器(Low-Pass Filter)
低通滤波器(Low-Pass Filter)是一种允许低频信号通过并阻止高频信号的滤波器。它在图像处理中的主要作用是平滑图像,减少图像中的高频噪声,同时保留图像中的低频信息。低通滤波器在边缘检测、图像降噪和图像重采样等领域中有广泛的应用。

1. 低通滤波的基本原理
在图像处理中,低通滤波的基本思想是将图像的高频成分(如噪声、细节等)进行衰减,而保留图像的低频成分(如整体的光滑区域)。这可以通过空间域或频域来实现。

空间域中的低通滤波
在空间域中,低通滤波通常通过卷积操作实现,常用的低通滤波器包括均值滤波器和高斯滤波器。

均值滤波器(Mean Filter):使用邻域内像素的平均值替代中心像素值。
高斯滤波器(Gaussian Filter):使用加权平均值替代中心像素值,其中权重由高斯分布决定。


频域中的低通滤波


2. 数学表示


3. Python 示例
以下是使用Python和OpenCV实现低通滤波的示例:

使用均值滤波器(空间域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 应用均值滤波
kernel_size = 5
mean_filtered_image = cv2.blur(image, (kernel_size, kernel_size))
 
# 显示原始图像和均值滤波后的图像
plt.figure(figsize=(10, 5))
 
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
 
plt.subplot(1, 2, 2)
plt.title(f'Mean Filtered Image (Kernel Size: {kernel_size}x{kernel_size})')
plt.imshow(mean_filtered_image, cmap='gray')
plt.axis('off')
 
plt.show()

使用高斯滤波器(空间域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 应用高斯滤波
kernel_size = 5
sigma = 1.0
gaussian_filtered_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
 
# 显示原始图像和高斯滤波后的图像
plt.figure(figsize=(10, 5))
 
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
 
plt.subplot(1, 2, 2)
plt.title(f'Gaussian Filtered Image (Kernel Size: {kernel_size}x{kernel_size}, Sigma: {sigma})')
plt.imshow(gaussian_filtered_image, cmap='gray')
plt.axis('off')
 
plt.show()

使用低通滤波器(频域)
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 进行傅里叶变换
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
 
# 创建低通滤波器
rows, cols = image.shape
crow, ccol = rows // 2 , cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
r = 30  # 低通滤波器的半径
center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0])**2 + (y - center[1])**2 <= r*r
mask[mask_area] = 1
 
# 应用滤波器并进行逆傅里叶变换
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
 
# 显示原始图像和低通滤波后的图像
plt.figure(figsize=(10, 5))
 
plt.subplot(1, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
 
plt.subplot(1, 2, 2)
plt.title('Low-Pass Filtered Image (Frequency Domain)')
plt.imshow(img_back, cmap='gray')
plt.axis('off')
 
plt.show()

4. 优点和缺点
优点:

减少噪声:有效去除图像中的高频噪声。
平滑图像:使图像变得更加平滑,适合在图像分割和特征提取之前使用。
缺点:

模糊细节:会模糊图像中的细节和边缘。
不适用于所有噪声类型:对于某些类型的噪声(如低频噪声),效果不佳。
5. 应用场景
图像降噪:在去除图像中的随机噪声时使用。
图像平滑:在图像分割、边缘检测等处理之前对图像进行平滑处理。
信号处理:在音频和通信信号处理中,用于滤除高频干扰信号。
低通滤波器作为一种基本的图像处理工具,在去除噪声和平滑图像方面具有广泛的应用。然而,在使用时需要注意它可能带来的图像模糊问题,并根据具体应用选择合适的滤波器和参数。

5.图像锐化:高通滤波(加强图像的边缘)
高通是图像锐化 低通图像平滑

• 在图像的判读或识别中常需要突出边缘和轮廓信息,而图像锐化处理的目的是加

强图像中景物的边缘和轮廓,使模糊图像变得更清晰。

• 图像模糊的可能是因为图像受到平均或积分运算,因此对图像采用逆运算。例

如对连续图像微分或对离散图像差分运算,即可使模糊图像的质量得到改善。

• 从频率域角度看,图像的模糊是因为高频分量受到衰减,所以采用合适的高通

滤波器也可以使图像的清晰度增加

三、图形去噪/边缘检测/深度学习基础
1.常见图像噪声:高斯噪声、椒盐噪声、脉冲噪声
噪声的特点是什么

噪声在图像处理和信号处理中是一个常见的概念,它具有几个基本特点,包括以下几点:

1.随机性(随机分布):

噪声是在信号或图像中无规律地出现的不希望的信号成分。它通常由于环境、传感器本身的限制、传输过程中的干扰等因素引入。
噪声的分布通常是随机的,没有明显的可预测模式,如白噪声和高斯噪声。
2.无用信息(非信息性):

噪声是与所需信号或图像信息无关的信号成分,它不包含任何有用的信息,通常会干扰或模糊真实数据的内容。
3. 影响信号质量:

噪声会降低信号或图像的质量,使得原始信息变得不清晰或难以识别。
在图像中,噪声可能表现为像素的随机变化,使图像看起来粗糙或不连续。
4. 多样性:

噪声可以有多种形式和来源,如椒盐噪声(随机黑白像素)、高斯噪声(服从高斯分布的随机变化)等。
每种类型的噪声可能需要不同的处理方法来有效降低其对信号或图像的影响。
5.波动性:

噪声的强度和分布通常会随着时间或空间的变化而波动,这使得在处理中需要考虑噪声的动态特性。
在图像处理中,理解噪声的特点对于选择合适的去噪方法和优化处理步骤至关重要。不同类型的噪声可能需要不同的处理策略,以在保留尽可能多有用信息的同时有效降低噪声水平。

常见图像噪声:

• 椒盐噪声:黑色像素和白色像素随机出现,椒盐噪声也称为脉冲噪声

• 脉冲噪声:白色像素随机出现

• 高斯噪声:噪声强度变化服从高斯分布

2.图像去噪流程,如高斯噪声(高斯平滑),椒盐噪声(中值滤波)(综合题)
(1)高斯噪声
高斯噪声(Gaussian Noise)是图像处理和信号处理中的常见问题,去除高斯噪声的过程称为去噪。以下是一个标准的高斯噪声去噪流程:

1. 图像预处理
在进行去噪之前,首先需要对图像进行预处理。这可能包括:

灰度化:如果图像是彩色的,可以先将其转换为灰度图像。
归一化:将像素值归一化到0-1范围内,以便后续处理。
2. 选择去噪方法
去除高斯噪声的方法有很多种,常用的包括:

3. 应用去噪方法
根据选择的去噪方法,对图像进行处理。一般步骤包括:

构建滤波器:根据选择的滤波器构建滤波器核或函数。
应用滤波器:将滤波器应用到图像上,得到去噪后的图像。
4. 后处理
去噪后,可以进行一些后处理来提高图像质量:

对比度调整:调整图像的对比度,使得细节更明显。
锐化处理:增强图像的边缘和细节。
5. 评价去噪效果
通过一些评价指标来判断去噪效果,例如:

峰值信噪比(PSNR):评估去噪后图像的质量。
结构相似性(SSIM):评估去噪后图像与原图像的相似性。
示例代码
以下是一个简单的Python代码示例,使用OpenCV进行高斯噪声的去噪:

import cv2
import numpy as np
 
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 高斯滤波去噪
denoised_image = cv2.GaussianBlur(image, (5, 5), 1.5)
 
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过以上步骤和代码,可以实现高斯噪声的有效去除,从而提高图像的质量。不同的方法适用于不同的场景,需要根据实际情况选择合适的去噪方法。

(2)椒盐噪声
椒盐噪声(Salt-and-Pepper Noise)是一种常见的图像噪声,表现为图像中出现随机的黑白像素点。去除椒盐噪声的过程可以通过多种方法实现。以下是一个详细的椒盐噪声去噪流程:

1. 图像预处理
在进行去噪之前,首先需要对图像进行预处理,这可能包括:

灰度化:如果图像是彩色的,可以先将其转换为灰度图像。
归一化:将像素值归一化到0-1范围内,以便后续处理。
2. 选择去噪方法
去除椒盐噪声的方法有多种,常用的包括:

3. 应用去噪方法
根据选择的去噪方法,对图像进行处理。一般步骤包括:

构建滤波器:根据选择的滤波器构建滤波器核或函数。
应用滤波器:将滤波器应用到图像上,得到去噪后的图像。
4. 后处理
去噪后,可以进行一些后处理来提高图像质量:

对比度调整:调整图像的对比度,使得细节更明显。
锐化处理:增强图像的边缘和细节。
5. 评价去噪效果
通过一些评价指标来判断去噪效果,例如:

峰值信噪比(PSNR):评估去噪后图像的质量。
结构相似性(SSIM):评估去噪后图像与原图像的相似性。
示例代码
以下是一个简单的Python代码示例,使用OpenCV进行椒盐噪声的去噪:

import cv2
import numpy as np
 
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
 
# 添加椒盐噪声
def add_salt_and_pepper_noise(image, prob):
    noisy = np.copy(image)
    num_salt = np.ceil(prob * image.size * 0.5)
    num_pepper = np.ceil(prob * image.size * 0.5)
 
    # 添加盐噪声
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    noisy[coords[0], coords[1]] = 1
 
    # 添加胡椒噪声
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    noisy[coords[0], coords[1]] = 0
 
    return noisy
 
noisy_image = add_salt_and_pepper_noise(image, 0.05)
 
# 中值滤波去噪
denoised_image = cv2.medianBlur(noisy_image, 3)
 
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.imshow('Denoised Image', denoised_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过以上步骤和代码,可以有效地去除椒盐噪声,从而提高图像的质量。不同的方法适用于不同的场景,需要根据实际情况选择合适的去噪方法。

3.边缘检测流程,如canny边缘检测(综合题)
边缘检测是图像处理中的一种重要技术,用于识别图像中的边缘。边缘是图像中灰度变化显著的区域,通常对应物体的边界。以下是一个标准的边缘检测步骤:

1. 图像预处理
在进行边缘检测之前,通常需要对图像进行预处理。这些预处理步骤可能包括:

灰度化:将彩色图像转换为灰度图像,以简化处理。
平滑处理:使用高斯滤波等方法对图像进行平滑处理,减少噪声对边缘检测的影响。
import cv2
 
# 读取彩色图像
image = cv2.imread('image.jpg')
 
# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# 使用高斯滤波进行平滑处理
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 1.5)
2. 计算梯度
计算图像的梯度以获取边缘信息。常用的方法有Sobel算子、Prewitt算子和Roberts算子等。梯度算子会计算图像在x和y方向的导数。

# 使用Sobel算子计算梯度
grad_x = cv2.Sobel(blurred_image, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(blurred_image, cv2.CV_64F, 0, 1, ksize=3)
 
# 计算梯度幅值和方向
magnitude = cv2.magnitude(grad_x, grad_y)
angle = cv2.phase(grad_x, grad_y, angleInDegrees=True)
3. 非极大值抑制
非极大值抑制用于细化边缘,通过保留局部最大值并抑制其他值,使得边缘更加清晰。

def non_maximum_suppression(magnitude, angle):
    row, col = magnitude.shape
    suppressed = np.zeros((row, col), dtype=np.float32)
    angle = angle % 180
 
    for i in range(1, row-1):
        for j in range(1, col-1):
            q = 255
            r = 255
            # 根据梯度方向选择比较的像素
            if (0 <= angle[i, j] < 22.5) or (157.5 <= angle[i, j] <= 180):
                q = magnitude[i, j+1]
                r = magnitude[i, j-1]
            elif 22.5 <= angle[i, j] < 67.5:
                q = magnitude[i+1, j-1]
                r = magnitude[i-1, j+1]
            elif 67.5 <= angle[i, j] < 112.5:
                q = magnitude[i+1, j]
                r = magnitude[i-1, j]
            elif 112.5 <= angle[i, j] < 157.5:
                q = magnitude[i-1, j-1]
                r = magnitude[i+1, j+1]
 
            # 保留局部最大值
            if (magnitude[i, j] >= q) and (magnitude[i, j] >= r):
                suppressed[i, j] = magnitude[i, j]
            else:
                suppressed[i, j] = 0
 
    return suppressed
 
suppressed_image = non_maximum_suppression(magnitude, angle)

4. 双阈值处理
双阈值处理用于进一步筛选边缘,通过设置高阈值和低阈值,将边缘分为强边缘、弱边缘和非边缘。

# 设置高阈值和低阈值
high_threshold = suppressed_image.max() * 0.09
low_threshold = high_threshold * 0.5
 
# 应用双阈值
strong_edges = (suppressed_image > high_threshold)
weak_edges = ((suppressed_image >= low_threshold) & (suppressed_image <= high_threshold))
 
# 初始化输出图像
edges = np.zeros_like(suppressed_image)
edges[strong_edges] = 255
edges[weak_edges] = 75
5. 边缘连接
连接弱边缘和强边缘,确保弱边缘连接到强边缘才被保留。

def edge_tracking(edges, weak=75, strong=255):
    row, col = edges.shape
    for i in range(1, row-1):
        for j in range(1, col-1):
            if edges[i, j] == weak:
                # 检查8邻域是否有强边缘
                if ((edges[i+1, j-1] == strong) or (edges[i+1, j] == strong) or (edges[i+1, j+1] == strong)
                    or (edges[i, j-1] == strong) or (edges[i, j+1] == strong)
                    or (edges[i-1, j-1] == strong) or (edges[i-1, j] == strong) or (edges[i-1, j+1] == strong)):
                    edges[i, j] = strong
                else:
                    edges[i, j] = 0
    return edges
 
final_edges = edge_tracking(edges)
6. 显示结果
显示原始图像和处理后的边缘检测结果。

cv2.imshow('Original Image', image)
cv2.imshow('Edges', final_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过上述步骤,可以有效地进行边缘检测。常用的边缘检测算法包括Canny边缘检测、Sobel边缘检测和Laplacian边缘检测,其中Canny边缘检测结合了上述多个步骤,效果较好。

Canny
Canny边缘检测是一种广泛使用的边缘检测算法,旨在提取图像中的边缘特征。其主要步骤如下:

高斯滤波 (Gaussian Filtering):


计算梯度 (Gradient Calculation):
使用Sobel算子计算图像的梯度强度和方向。Sobel算子分别在水平方向(Gx)和垂直方向(Gy)上计算梯度。


非极大值抑制 (Non-maximum Suppression):
在梯度方向上对梯度强度进行抑制,只保留局部最大值,以细化边缘,使边界更清晰。具体步骤包括:
对每个像素,沿梯度方向检查两个相邻像素的梯度强度。
如果当前像素的梯度强度大于相邻像素的梯度强度,则保留,否则抑制为0。
双阈值检测 (Double Thresholding):
使用两个阈值(低阈值和高阈值)进一步过滤边缘。
如果像素的梯度强度大于高阈值,则被认为是强边缘。
如果像素的梯度强度介于低阈值和高阈值之间,则被认为是弱边缘。
如果像素的梯度强度小于低阈值,则被抑制为非边缘。
边缘连接 (Edge Tracking by Hysteresis):
通过连接弱边缘和强边缘来形成最终的边缘。
从强边缘像素开始,沿着梯度方向搜索弱边缘,如果连接到强边缘,则将弱边缘视为真实边缘。
总结来说,Canny边缘检测算法通过这五个步骤实现了对图像边缘的准确检测,减少了噪声的影响,精确地定位边缘,并通过双阈值和边缘连接步骤保证了边缘检测的连贯性。

4.全连接神经网络结构:输入层、隐藏层、输出层
全联接网络的输出层什么的。设计一下手写字,激活函数选择 结构图画出

全连接神经网络(Fully Connected Neural Network, FCNN)是一种基础的神经网络结构,由输入层、隐藏层和输出层组成。每一层中的神经元与前一层的所有神经元相连接。以下是各个层的详细介绍:

1. 输入层(Input Layer)
输入层是神经网络的第一层,它接受外部数据并将其传递给网络的下一层。输入层的神经元数量取决于输入数据的特征数量。例如,如果输入的是一个28x28像素的灰度图像,输入层将有784个神经元(28x28=784)。

2. 隐藏层(Hidden Layers)
隐藏层位于输入层和输出层之间,可以有一个或多个隐藏层。每一层中的神经元通过权重与前一层的所有神经元相连接。隐藏层的作用是通过激活函数引入非线性,使网络能够学习和表示复杂的模式和特征。

a. 权重和偏置(Weights and Biases)
每个连接都有一个权重,用于调整输入信号的强度。每个神经元还有一个偏置,用于调整激活函数的输出。

b. 激活函数(Activation Function)
每个隐藏层的神经元通常使用非线性激活函数,如ReLU、Sigmoid、Tanh等,以引入非线性并使网络能够学习复杂的特征。

3. 输出层(Output Layer)
输出层是神经网络的最后一层,它将隐藏层的输出转换为网络的最终输出。输出层的神经元数量取决于具体任务。例如,对于二分类问题,输出层通常有一个神经元,输出一个表示类别概率的值。对于多分类问题,输出层的神经元数量等于类别数量,通

相关文章:

  • 【Docker】Windows10环境下安装DockerDesktop
  • Spring Boot requestBody postman
  • Math工具类全面指南
  • 深入理解Java适配器模式:从接口兼容到设计哲学
  • 前端最新面试题及答案 (2025)
  • 通过MCP让LLM调用系统接口
  • HTML5 浮动(Float)详解
  • VastBase的日常操作记录
  • 计算机网络:手机和基站之间的通信原理是什么?
  • 解决SQL Server SQL语句性能问题(9)——合理使用表分区
  • Chrome浏览器实验性API computePressure的隐私保护机制如何绕过?
  • 位与运算
  • windows版redis的使用
  • 用Array.from实现创建一个1-100的数组
  • element基于表头返回 merge: true 配置列合并
  • Mixup
  • LeetCode热题100--234.回文链表--简单
  • 院校机试刷题第二天:1479 01字符串、1701非素数个数
  • 部署GraphRAG配置Neo4j实现知识图谱可视化【踩坑经历】
  • 用git下载vcpkg时出现Connection was reset时的处理
  • 山东市监局回应“盒马一批次‘无抗’鸡蛋抽检不合格后复检合格”:系生产商自行送检
  • GDP逼近五千亿,向海图强,对接京津,沧州剑指沿海经济强市
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 韩国总统选战打响:7人角逐李在明领跑,执政党临阵换将陷入分裂
  • 学者纠错遭网暴,人民锐评:“饭圈”该走出畸形的怪圈了
  • 李公明 | 一周画记:印巴交火会否升级为第四次印巴战争?