机器视觉初步6-1:基于梯度的图像分割

把基于梯度的图像分割单独拿出来。

文章目录

  • 一、图像梯度相关算子的原理
    • 1. Sobel算子
    • 2. Prewitt算子
    • 3. Roberts算子
  • 二、python和halcon算子实现
    • 1.python实现
    • 2.halcon实现

基于梯度的图像分割方法利用像素之间的梯度信息来进行图像分割。
梯度 1是图像中像素灰度值变化最快的方向,基于梯度的图像分割方法就是通过分析图像中像素的梯度信息来提取图像中的不同物体,实现图像分割的目的。
在这里插入图片描述

基于梯度的图像分割方法的基本思想是:
首先对输入的图像进行滤波、增强等预处理操作,以增强图像中物体的边缘信息;
然后计算每个像素的梯度值,通常包括水平梯度、垂直梯度和斜梯度三个分量;
最后根据梯度信息进行图像分割。具体来说,基于梯度的图像分割方法通常包括以下几个步骤:
1. 图像预处理:对输入的图像进行滤波、增强等预处理操作,以增强图像中物体的边缘信息。
2. 计算梯度:对每个像素计算其水平、垂直和斜梯度三个分量。
3. 阈值化:通过计算每个像素的梯度值,将梯度值小于某一阈值的像素设置为背景像素,将梯度值大于阈值的像素设置为前景像素。
4. 分割结果:根据阈值化后的结果,将每个像素分配到相应的物体类别中,实现图像分割。

基于梯度的图像分割方法的优点是速度快、计算量小,适用于处理大规模的图像数据。但是,该方法的缺点是对噪声敏感,需要进行适当的滤波和去噪处理。同时,该方法仅适用于物体边缘明显的图像,对于物体形状复杂的图像分割效果并不理想。

一、图像梯度相关算子的原理

在这里插入图片描述

1. Sobel算子

Sobel算子是一种用于检测图像中灰度级别变化的算子,尤其是在较小灰度变化时效果比较明显。它通过计算图像中每一点与周围八个点灰度值的差,并进行差分运算,从而得到图像梯度值。

2. Prewitt算子

Prewitt算子和Sobel算子的原理相似,它们都是通过计算图像中每一点与周围八个点灰度值的差,并进行差分运算2,从而得到图像梯度值。不同的是,Prewitt算子不仅计算了差分,而且进行了平方操作,从而使得梯度值在x和y方向上的结果是一致的。

3. Roberts算子

Roberts算子是一种二阶微分算子,它通过计算图像中每一点与周围九个点灰度值的差,并进行差分运算,从而得到图像梯度值。Roberts算子主要用于边缘检测,尤其是在图像的边缘处有较强的导数3

二、python和halcon算子实现

1.python实现

import cv2
import numpy as np

def sobel_gradient(img):
    # Sobel 算子
    gray_img = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
    edge_img = cv2.convertScaleAbs(gray_img)
    return edge_img

def prewitt_gradient(img):
    # Prewitt 算子
    gray_img = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
    edge_img = cv2.convertScaleAbs(gray_img)
    return edge_img

def roberts_gradient(img):
    # Roberts 算子
    gray_img = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
    edge_img = cv2.convertScaleAbs(gray_img)
    return edge_img

img = np.zeros((500, 500, 3), np.uint8)
img[50:150, 50:150] = 255
cv2.imshow('image', img)

sobel_gradient_img = sobel_gradient(img)
cv2.imshow('sobel_gradient_img', sobel_gradient_img)

prewitt_gradient_img = prewitt_gradient(img)
cv2.imshow('prewitt_gradient_img', prewitt_gradient_img)

roberts_gradient_img = roberts_gradient(img)
cv2.imshow('roberts_gradient_img', roberts_gradient_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.halcon实现

* Sobel 算子
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (Image)

* Sobel 算子
[SobelX, SobelY] = sobel_x (Image, 'sobel', 1, 8)
dev_display (SobelX)

* Prewitt 算子
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (Image)

* Prewitt 算子
[PrewittX, PrewittY] = prewitt_x (Image, 'prewitt', 1, 8)
dev_display (PrewittX)

* Roberts 算子
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (Image)

* Roberts 算子
[RobertsX, RobertsY] = roberts_x (Image, 'roberts', 1, 8)
dev_display (RobertsX)

注释:


  1. 图像的梯度(Gradient)是一个矢量,用于描述图像中像素点值的变化速度。在图像处理中,梯度通常用于计算图像中的边缘,这是一种提取图像特征的方法。
    简单来说,梯度表示图像中像素值的变化,从一个特定的方向或方向组来看,像素值增加或减少的程度。例如,如果我们沿着图像中的水平方向(从左到右)移动,那么在这个方向上的像素值将会增加,因此在水平方向上的梯度值就会增加。相反,如果我们沿着垂直方向(从上到下)移动,那么在这个方向上的像素值将会减少,因此在垂直方向上的梯度值就会减少。
    在计算机视觉和图像处理中,梯度用于寻找图像中的边缘和纹理等特征。通过计算图像中每个像素点的梯度值,我们可以找到图像中的边缘或其他有用的信息,这些信息可以用于目标检测、图像分割和其他计算机视觉任务。 ↩︎

  2. 差分运算的基本原理:
    1 差分定义:对于给定的两个数组 A 和 B,A 的差分数组 D(A) 是将 A 中的元素分别与它们的前一个元素进行比较,并得出的新的数组。例如,考虑数组 A={3, 1, 5, 8},其差分数组为 D(A) = {2, 0, 3, 2}。
    差分运算可以通过以下两个基本步骤实现:
    a. 构造差分数组 D(A);
    b. 应用差分运算。
    2 差分运算的应用
    a. 时间序列分析:通过差分运算,可以分析和比较不同时间段内的数据变化。
    b. 数据结构:差分数组可以用于保持数据结构的稳定性,例如堆(heap)数据结构。
    c. 排序算法:快速排序(QuickSort)等算法可以利用差分数组实现。
    3 性质
    a. 差分数组的伪逆(pseudoinverse)是原始数组的逆矩阵。
    b. 在某些情况下,可以通过差分数组快速地计算原数组的值。
    总之,差分运算是一种在数学和计算机科学中处理数组的方法,通过对原数组的局部元素进行操作,得到相应的差分数组。
    差分运算可以应用于时间序列分析、保持数据结构稳定性、实现快速排序等任务。 ↩︎

  3. 图像边缘是指图像中灰度值突然变化的地方。导数是函数在某一点的切线斜率,它在图像处理中常用来描述图像边缘。
    计算图像边缘导数的方法如下:
    1.对于二值图像,边缘区域的像素值是最大值或最小值,可以使用固定阈值或自适应阈值将图像转换为二值图像。
    2.对于灰度图像,可以使用高斯滤波器来平滑图像并去除噪声。
    3.然后,可以使用梯度算子,如Sobel算子、Scharr算子或Prewitt算子来计算图像的边缘。
    4.梯度算子包括一个水平梯度和一个垂直梯度。水平梯度计算公式为:
    gradientH = 0.5 * abs(x - x_center)^2 + 0.5 * abs(y - y_center)^2
    其中,x 和 y 是图像中的像素坐标,x_center 和 y_center 是图像的中心。
    5.垂直梯度计算公式为:
    gradientV = 0.5* abs(x - x_center)^2 + 0.5 * abs(y + y_center)^2
    6.梯度算子可以用于边缘检测,并且可以通过设置不同的阈值来检测不同宽度和方向的边缘。
    7.对于多通道图像,可以使用类似的方法来计算每个通道的边缘,并将它们组合在一起以形成边缘图像。
    8.最后,可以将边缘图像转换为彩色图像,并通过卷积或阈值操作来提取图像中的边缘。 ↩︎

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

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

相关文章

Unity Android打包成Apk之后 紫屏 无内容

打包成Apk之后 打开游戏 过完logo是紫色的屏幕什么都没有 解决方法: 打开项目的目录: 删除除了 .vscode assets package 之外的所有文件夹 然后重新打开就可以了

kettle架构图

2、架构说明 1)最底层的是kettle的核心引擎层,相关的jar在lib目录下。 2)中间是开发层,在开发阶段我们接触最多的就是通过spoon进行开发,通过Spoon.bat或者spoon.sh即可启动客户端,开发文件调试之前要先保…

一篇文章带你从入门都入土 Kafka 消息中间件(原理+代码)

目录 一、Kafka定义 二、消息队列 三、Kafka基础架构图 四、安装Kafka 4.1 为每台服务器下载Kafka并解压 4.2 查看目录结构 4.3 为每台服务器修改配置文件server.properties 4.4 为每台服务器配置Kafka环境变量 4.5 启动zookeeper集群 4.6 启动Kafka集群 4.7 关闭Ka…

河道垃圾自动识别监测算法 opencv

河道垃圾自动识别监测系统通过pythonopencv网络模型技术,河道垃圾自动识别监测算法对水面上的垃圾进行自动识别,一旦发现垃圾污染将自动发出警报。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python…

SpringBoot03:yaml配置注入

目录 一、yaml语法学习 1、配置文件 2、yaml概述 3、yaml基础语法 3.1、字面量:普通的值【数字、布尔值、字符串】 3.2、对象、Map(键值对) 3.3、行内写法: 3.4、数组(list、set) 二、注入配置文件 1、yaml注入配置文件…

App Inventor 2 语音交互机器人Robot,使用讯飞语音识别引擎

应用介绍 App Inventor 2 语音识别及交互App。识别语言指令并控制机器人运动,主要用到语音识别器及文本朗读器组件,语音识别相关开发最佳入门。代码逻辑简单,App交互性及趣味性非常强~ 视频预览 语音Robot教程(难度系数&#xf…

html通过web3JS 获取当前连接的区块链信息和账号信息

前面 我们讲了 MetaMask和ganache的配置安装 并用 MetaMask管理ganache的启动的虚拟区块链 那么 我们现在也完全可以写一个网页来做这个东西的管理 您可以先查看文章web3.js获取导入做一个导入了 web3的html文件 首先我们可以来试着 获取 自己当前是在哪个区块的 getBlockNum…

5.6.1 端口及套接字

5.6.1 端口及套接字 传输层的作用是在通信子网提供服务的基础之上为它的上层也就是应用进程提供端到端的传输服务,通信子网是由用作信息交换的网络节点和通信线路所组成的独立的数据通信系统。它承担着全网的数据传输、转接和加工变换等通信处理工作。如图 通信子网…

stm32f103c8t6移植U8g2

U8g2代码下载: https://github.com/olikraus/u8g2 1,准备一个正常运行的KEIL5 MDK模板 2,下载u8g2的源码和 u8g2的STM32实例模板 源码: https://github.com/olikraus/u8g2 STM32实例模板: https://github.com/nikola-v/u8g2_template_stm32f…

PHP 基础知识

目录 PHP基础 2 PHP代码标记 2 PHP注释 2 PHP语句分隔符 2 PHP变量 3 常量 3 数据类型 4 流程控制 6 文件 7 函数 9 闭包 11 常用系统函数 12 错误处理 13 错误显示设置 15 字符串类型 17 字符串相关函数 19 数组 21 遍历数组 22 数组的相关函数 25 PHP基础 PHP是一种运行在服务…

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

文章目录 一、StatefulSet理论知识1、StatefulSet Pod控制器特性2、什么是有状态服务和无状态服务?3、Deployment和StatefulSet区别 二、案例:StatefulSet资源实战演示1、创建WEB站点并验证StatefulSet特点2、StatefulSet滚动更新 三、总结 一、Stateful…

PSD笔记

在实际应用中,一个信号我们不可能获得无穷长时间段内的点,对于数字信号,只能通过采样的方式获得N个离散的点。上文提到,实际信号基本上是随机信号,由于不可能对所有点进行考察,我们也就不可能获得其精确的功…

Modbus协议学习方法

在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。   下面我将自己借助软件学…

如何用低代码开发平台快速实现单据打印功能?

每家企业在日常工作中,业务流转时,都经常需要在线打印各种纸质文件,如凭证、采购单、出入库单据、销售合同等,不同企业都有个性化的排版要求,每一次需要在固定文档模板的基础上重新填充业务数据,过程中难免…

目前有哪些比较好用的工单系统?如何选择合适的工单管理系统?

目前有哪些比较好用的工单系统??推荐一个性价比高的“工单管理系统”?好用免费的工单管理软件系统有哪些? 作为一个工程项目管理人员,是离不开工单系统的。每当遇到工程量大的时期要去管理很多杂乱无章的工单可太难了…

搭建selenoid环境

1、拉取浏览器镜像 docker pull selenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像 docker pull aerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像 docker pull aerokube/selenoid4、编写配置文件 vi /selenoid/config/browsers.json volumes可以做容器路径映射&…

TP composer 新创建一个vendor2,作为新库下载目录

站点目录新建一个vendor2文件夹: 在里面新建一个 composer.json 文件:(只写一个花括号就行) {} 然后这个vendor2目录里,使用宝塔终端执行: composer require zoujingli/ip2region 这样,vendor2目录里就会再多出 v…

java 设计模式--创建者模式

参考:Java常见设计模式总结 概念 概念理解一:将复杂对象的创建过程分解在不同的方法中,不同的创建过程组装成不同对象。对象的创建与产品本身分离开,使得对象的创建过程更加清晰。例如:旅游套餐售卖场景。 一个套餐大…

flutter Android 自定义输出路径 apk名称

默认 Flutter flutter build apk, 是默认的名字 默认的路径,直接修改输出路径 会造成 打包可以,直接运行 会提示找不到 apk 文件; 这里的解决思路是:打包完成后 拷贝目标路径的 APK 到自定义的路径,这样既可以正常打…

Windows软件架构概念

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来聊聊Windows软件架构的概念。 Shaw和Garlan在他们划时代的著作中以如下方式讨论了软件的体系结构:从第一个程序被划分成模块开始,软件系统就有了体系结构。现在&#xff0c…