头歌-边缘检测

server/2024/12/28 21:43:31/

第1关:边缘检测的基本原理与图像增强

任务描述
本关任务:理解边缘检测的基本概念,掌握 Roberts 算子的原理与操作。

相关知识
为了完成本关任务,你需要掌握:
1.边缘检测的概念;
2. Roberts 算子的原理与操作。

边缘检测
边缘是图像最基本的特征,所谓边缘就是指周围灰度强度有反差变化的那些像素的集合,是图像分割所依赖的重要基础,也是纹理分析和图像识别的重要基础。理想的边缘检测应当正确解决边缘的有无、真假、和定向定位。

从人的直观感受来说,边缘对应于物体的几何边界。图像上灰度变化剧烈的区域比较符合这个要求,一般会以这个特征来提取图像的边缘。

当遇到包含纹理的图像,例如图像中的人穿了黑白格子的衣服,一般的算法提取的边缘会把衣服上的纹理提取,如图1所示。但是这种图像我们往往不希望提取出来的边缘包括衣服上的方格,这就又涉及到纹理图像的处理等方法。

import cv2
import numpy as npdef task1():filename = '/data/workspace/myshixun/task1/CRH.png'########## Begin ########### 1. 灰度模式读取图像,图像名为CRHCRH = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)  # 读取为灰度图像# 转换数据格式CRH = CRH.astype('float')  # 将图像数据类型转换为float# 2. 计算图像梯度# 创建与图像相同大小的梯度矩阵gradient = np.zeros_like(CRH)# 计算梯度的水平和垂直方向for x in range(CRH.shape[0] - 1):for y in range(CRH.shape[1] - 1):gx = abs(CRH[x + 1, y] - CRH[x, y])  # 水平梯度gy = abs(CRH[x, y + 1] - CRH[x, y])  # 垂直梯度gradient[x, y] = gx + gy  # 总梯度是水平梯度和垂直梯度之和# 3. 对图像进行增强,增强后的图像变量名为sharpsharp = CRH + gradient  # 将梯度加到原图像上,进行增强########## End ########### 将增强后的图像和梯度图像限制在[0, 255]范围内sharp = np.where(sharp > 255, 255, sharp)  # 阈值处理,避免像素值超过255sharp = np.where(sharp < 0, 0, sharp)      # 阈值处理,避免像素值低于0# 数据类型变换gradient = gradient.astype('uint8')  # 将梯度转换为uint8类型sharp = sharp.astype('uint8')        # 将增强后的图像转换为uint8类型# 保存图像filepath = '/data/workspace/myshixun/task1/'cv2.imwrite(filepath + 'out/gradient.png', gradient)  # 保存梯度图像cv2.imwrite(filepath + 'out/sharp.png', sharp)      # 保存增强后的图像

第2关:Roberts 算子

任务描述
本关任务:理解和掌握 Roberts 算子的基本原理并用它提取物体边缘。

相关知识
为了完成本关任务,你需要掌握:

Roberts 算子的基本原理;
使用 Roberts 算子提取边缘。
Roberts 算子的基本原理
Roberts 算子是利用局部差分寻找边缘的一种算子,是最简单的边缘检测算子。Roberts 算子利用对角线方向相邻两像素之差近似梯度幅值来检测边缘,检测垂直边缘的效果要优于其他方向边缘,定位精度高,但对噪声的抑制能力较弱。边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,同时也包含方向的确定。

# -*- coding: utf-8 -*-
import cv2
import numpy as npdef robs():filepath = '/data/workspace/myshixun/task2/'# 读取图像img = cv2.imread(filepath + 'road.png')########## Begin ########### 1. 灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2. 定义两个 Roberts算子kernelx = np.array([[-1, 0], [0, 1]], dtype=int)  # 水平方向的算子kernely = np.array([[0, -1], [1, 0]], dtype=int)  # 垂直方向的算子# 3. 使用 Roberts算子进行卷积操作x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)  # 计算水平方向梯度y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)  # 计算垂直方向梯度# 4. 数据格式转换absX = cv2.convertScaleAbs(x)  # 将水平方向的梯度转换为绝对值absY = cv2.convertScaleAbs(y)  # 将垂直方向的梯度转换为绝对值# 5. 组合梯度图像Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)  # 按照0.5权重进行加权组合########## End ########### 保存组合后的图像cv2.imwrite(filepath + "out/roberts.png", Roberts)  # 保存处理后的图像

第3关:Prewitt 算子与 Sobel 算子

任务描述
本关任务:理解和掌握 Prewitt 算子与 Sobel 算子的基本原理并用 Sobel 算子提取物体边缘。

相关知识
为了完成本关任务,你需要掌握:

Prewitt 算子与 Sobel 算子的基本原理;
使用 Sobel 算子提取边缘。
Prewitt 算子的基本原理
Prewitt 是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于 Prewitt 算子采用3×3大小的模板对区域内的像素值进行计算,而 Roberts 算子的模板为2×2,故 Prewitt 算子的边缘检测结果在水平方向和垂直方向均比 Roberts 算子更加明显。

# -*- coding: utf-8 -*-
import cv2
import numpy as npdef sob():filepath = '/data/workspace/myshixun/task3/'# 读取图像img = cv2.imread(filepath+'road.png')########## Begin ########### 1. 灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2. 求Sobel 算子x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)# 3. 数据格式转换absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)# 4. 组合图像Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)########## End ########### 保存图像cv2.imwrite(filepath+"out/sobel.png",Sobel)

第4关:Laplacian 算子

任务描述
本关任务:理解和掌握 Laplacian 算子的基本原理并用它提取物体边缘。

相关知识
为了完成本关任务,你需要掌握:

Laplacian 算子的基本原理;
使用 Laplacian 算子提取边缘。
Laplacian 算子的基本原理
拉普拉斯(Laplacian)算子是 n 维欧几里德空间中的一个二阶微分算子,常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素,基本流程是:判断图像中心像素灰度值与它周围其他像素的灰度值,如果中心像素的灰度更高,则提升中心像素的灰度;反之降低中心像素的灰度,从而实现图像锐化操作。在算法实现过程中,Laplacian 算子通过对邻域中心像素的四方向或八方向求梯度,再将梯度相加起来判断中心像素灰度与邻域内其他像素灰度的关系,最后通过梯度运算的结果对像素灰度进行调整。

# -*- coding: utf-8 -*-
import cv2def lap():filepath = '/data/workspace/myshixun/task4/'# 读取图像img = cv2.imread(filepath + 'shanfeng.png')########## Begin ########### 1. 灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2. 高斯滤波(使用5x5的卷积核,X、Y偏差均为0)grayImage = cv2.GaussianBlur(grayImage, (5, 5), 0)# 3. 拉普拉斯算子进行图像处理dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)# 4. 数据格式转换Laplacian = cv2.convertScaleAbs(dst)########## End ########### 保存图像cv2.imwrite(filepath + "out/laplacian.png", Laplacian)

第5关:LoG 边缘算子

任务描述
本关任务:理解和掌握 LoG 算子的基本原理并用它提取物体边缘。

相关知识
为了完成本关任务,你需要掌握:

几种边缘检测算子的比较;
LoG 算子的基本原理;
使用 LoG 算子提取图像边缘。
几种边缘算子的比较
Laplacian 算子对噪声比较敏感,由于其算法可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测;Roberts 算子对陡峭的低噪声图像效果较好,尤其是边缘正负45度较多的图像,但定位准确率较差;Prewitt 算子对灰度渐变的图像边缘提取效果较好,而没有考虑相邻点的距离远近对当前像素点的影响;Sobel 算子考虑了综合因素,对噪声较多的图像处理效果更好。

在数字图像处理中,Lena 是一张被广泛使用的标准图片。图1显示了使用四种边缘检测算子处理后的图像,可以看到 Roberts 算子表现最差,其它的三个方法提取的边缘比较好。

import numpy as np
import cv2def _log():filepath = '/data/workspace/myshixun/task5/'# 读取图像img = cv2.imread(filepath + 'shanfeng.png')########## Begin ########### 1. 灰度转换img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 2. 边缘扩充处理图像并使用高斯滤波处理该图像image = cv2.copyMakeBorder(img, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)image = cv2.GaussianBlur(image, (3, 3), 0, 0)# 3. 使用Numpy定义LoG算子m1 = np.array([[0, 0, -1, 0, 0], [0, -1, -2, -1, 0], [-1, -2, 16, -2, -1], [0, -1, -2, -1, 0], [0, 0, -1, 0, 0]]) # 4. 卷积运算r = image.shape[0]c = image.shape[1]image1 = np.zeros(image.shape)# 为了使卷积对每个像素都进行运算,原图像的边缘像素要对准模板的中心。# 由于图像边缘扩大了2像素,因此要从位置2到行(列)-2for k in range(0, 2): for i in range(2, r - 2):for j in range(2, c - 2):image1[i, j] = np.sum((m1 * image[i - 2:i + 3, j - 2:j + 3, k]))# 5. 数据格式转换image1 = cv2.convertScaleAbs(image1)########## End ##########cv2.imwrite(filepath + "out/log.png", image1)

第6关:Canny 边缘检测

任务描述
本关任务:理解和掌握 Canny 算子的基本原理并用它提取物体边缘。

相关知识
为了完成本关任务,你需要掌握:

Canny 算子的基本原理;
使用 Canny 算子提取边缘。
Canny 算子的基本原理
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。微分运算是求信号的变化率,具有加强高频分量的作用。对于数字图像的离散信号,微分运算就变成计算差分或梯度。图像处理中有多种边缘检测(梯度)算子,常用的包括普通一阶差分,Roberts 算子(交叉差分),Sobel 算子等等,是基于寻找梯度强度。拉普拉斯算子(二阶差分)是基于过零点检测。通过计算梯度,设置阈值,得到边缘图像。

Canny 边缘检测算子是一种多级检测算法。1986年由 John F. Canny 提出,同时提出了边缘检测的三大准则:

低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检;
最优定位:检测的边缘点应该精确地定位于边缘的中心;
图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘。
Canny 算法出现以后一直是作为一种标准的边缘检测算法,此后也出现了各种基于 Canny 算法的改进算法。时至今日,Canny 算法及其各种改进依旧是一种优秀的边缘检测算法。而且除非前提条件很适合,你很难找到一种边缘检测算子能显著地比 Canny 算子做的更好。

Canny 算法有如下特点:
(1) 具有既能滤去噪声又保持边缘特性的边缘检测最优滤波器,其采用一阶微分滤波器。采用二维高斯函数的任意方向上的一阶方向导数为噪声滤波器,通过与图像卷积进行滤波;然后对滤波后的图像寻找图像梯度的局部最大值,以此来确定图像边缘。根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是 Canny 边缘检测算子;
(2) 类似与 LoG 边缘检测方法,也属于先平滑后求导数的方法。

import cv2
import numpy as npdef cny():filepath = '/data/workspace/myshixun/task6/'# 读取图像src = cv2.imread(filepath + 'road.png')########## Begin ########### 1. 高斯滤波,使用3x3卷积核对图像进行高斯滤波blurred = cv2.GaussianBlur(src, (3, 3), 0)# 2. 灰度转换,将图像从彩色转换为灰度图gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)# 3. 求x,y方向的Sobel算子grad_x = cv2.Sobel(gray, cv2.CV_16SC1, 1, 0)  # 水平方向梯度grad_y = cv2.Sobel(gray, cv2.CV_16SC1, 0, 1)  # 垂直方向梯度# 4. 使用Canny函数处理图像,x, y分别是求出来的梯度,低阈值50,高阈值150edge_output = cv2.Canny(grad_x, grad_y, 50, 150)########## End ########### 保存处理后的图像cv2.imwrite(filepath + "out/canny.png", edge_output)

以上内容仅供本人学习参考


http://www.ppmy.cn/server/154031.html

相关文章

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

引言 在嵌入式开发中&#xff0c;构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而&#xff0c;OpenEmbedded 构建系统的传统设计是从头开始构建所有内容&#xff08;Build from Scratch&#xff09;&#xff0c;这…

Linux 安装rpm

在Linux银河麒麟系统上安装RPM软件包&#xff0c;可以通过系统自带的RPM包管理工具来完成。以下是一个详细的安装步骤&#xff1a; 一、准备工作 下载RPM软件包&#xff1a; 从可靠的软件源或官方网站下载需要安装的RPM软件包。 打开终端&#xff1a; 需要通过终端&#x…

ChatGPT详解

ChatGPT是一款由OpenAI研发和维护的先进的自然语言处理模型&#xff08;NLP&#xff09;&#xff0c;全名为Chat Generative Pre-trained Transformer&#xff0c;于2022年11月30日发布。以下是对ChatGPT的详细介绍&#xff1a; ### 一、技术架构与原理 1. **技术架构**&…

JDK高频面试题(包重点)

一、什么是JDK JDK&#xff08;Java Development Kit&#xff09;即 Java 开发工具包&#xff0c;是 Java 编程的基础与核心&#xff0c;由 Sun Microsystems&#xff08;现归属于 Oracle 公司 &#xff09;开发&#xff0c;主要作用如下&#xff1a; 1、提供编译环境 它包含了…

京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分&#xff1a; 1. 平台产品能力介绍 2. 业务赋能案例分享 3. 平台建设挑战与展望 作者&#xff1a;梁臣 京东 数据产品架构师 01平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用…

python 渗透开发工具之SQLMapApi Server不同IP服务启动方式处理 解决方案SqlMapApiServer外网不能访问的情况

目录 说在前面 什么是 SQLMapAPI 说明 sqlmapApi能干什么 sqlmapApi 服务安装相关 kali-sqlmap存放位置 正常启动sqlmap-api server SqlMapApi-Server 解决外网不能访问情况 说在前面 什么是sqlmap 这个在前面已经说过了&#xff0c;如果这个不知道&#xff0c;就可以…

python简单图像识别自动化工具

import pyautogui import cv2 import numpy as np import time""" 小型自动化工具 图片识别 自动化简单工具 """# -*- coding:utf-8 -*- # #cv读取中文有点问题 需要修改库里使用编码为utf-8 # 获取图像数据匹配全屏寻找 class Mouse():def __in…

快速了解开源日志框架log4net:灵活记录应用程序日志信息的利器

前言 log4net 是一个广泛应用的、开源的日志框架&#xff0c;它提供了一种灵活的机制来记录应用程序的日志信息。log4net 使用 Apache Software Foundation 的 Apache License 2.0 开源协议&#xff0c;可以免费使用和修改。 使用 log4net&#xff0c;可以将应用程序中的不同…