计算机视觉 | 基于二值图像数字矩阵的距离变换算法

这篇具有很好参考价值的文章主要介绍了计算机视觉 | 基于二值图像数字矩阵的距离变换算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hi,大家好,我是半亩花海。本实验基于 OpenCV 实现了二值图像数字矩阵的距离变换算法。首先生成一个 480x480 的黑色背景图像(定义黑色为0,白色为1),在其中随机选择了三个白色像素点作为距离变换的原点,利用 OpenCV 中 distanceTransform 等相关函数计算并输出这些原点到其他像素点的欧氏距离、D4 距离和 D8 距离及其相应的距离矩阵,并将距离变换结果可视化

一、导入必要库

导入必要的库(cv2、numpy、matplotlib.pyplot),为后续的图像处理任务做准备。

#!/usr/bin/env python
# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 用来设置字体样式(黑体)以正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

二、初始化输入图像和变换结果图像

自定义 480x480 二值图,随机生成图案,初始值都是 0(黑色),并显示原始图像。

  • 图像数字化:
    通过传感器获得的图像是平面坐标 ( x , y ) (x,y) (x,y) 的连续函数 f ( x , y ) f(x,y) f(x,y),它的值图像对应位置的亮度。为了能够让计算机来处理,需要对图像进行采样,并且对亮度值进行量化。

    • 采样: 对连续函数 f ( x , y ) f(x,y) f(x,y) 进行采样,就是分别对 x x x 轴和 y y y 轴,按照固定间隔取值,得到平面坐标上的 M × N M×N M×N 个点,将其函数值作为元素生成 M M M N N N 列的矩阵。

    • 量化亮度值。 f ( x , y ) f(x,y) f(x,y) 的值转化为等价的整数值的过程称为量化,量化的级别越高,图像越细致。通常将亮度值表示为 0~255 之间的整数。

# 创建一个大小为 480x480 的全黑图像(确保数据类型为 8 位无符号整数)
mat = np.zeros((480, 480), dtype=np.uint8)
# 给输入图像指定三个像素点设置为白色像素,作为距离变换原点(区域块)
mat[100, 200] = 1
mat[200, 100] = 1
mat[300, 300] = 1

# 显示原始图像和距离变换结果
plt.figure(figsize=(15, 5))
plt.scatter([100, 200, 300], [200, 100, 300], color='white', marker='o')  # 添加三个白点表示出三个像素点的坐标
plt.imshow(mat, cmap='gray')
plt.title('原始图像', fontsize=16)
计算机视觉 | 基于二值图像数字矩阵的距离变换算法,计算机视觉,矩阵,距离变换算法,计算机视觉,opencv
# 将输入图像中 1(白色)和 0(黑色)调换,使得原点距离为 0
mat = 1 - mat

三、根据二值图计算并输出距离矩阵

  • 距离: 距离是描述图像两点像素之间的远近关系的度量,常见的度量距离有欧式距离(Euchildean distance)、城市街区距离(City block distance)、棋盘距离(Chessboard distance)。以下以两坐标点 a = ( i , j ) a = (i, j) a=(i,j) b = ( k , l ) b = (k, l) b=(k,l) 的距离为例,来说明各种距离的定义方式。

(1)欧式距离 D e D_e De 欧式距离的定义源于经典的几何学,与我们数学中所学的简单几何的两点之间的距离一致,为两个像素点坐标值的平方根。欧式距离的优点在于其定义非常地直观,是显而易见的,但缺点在于平方根的计算是非常耗时的。

D e ( a , b ) = ( ( i − k ) 2 ) + ( j − l ) 2 D_e(a, b)=\sqrt{\left((i-k)^2\right)+(j-l)^2} De(a,b)=((ik)2)+(jl)2

(2)城市街区距离 D 4 D_4 D4 距离描述的是只允许像素坐标系平面中横向和纵向的移动距离,4表示在这种定义下,像素点是 4 邻接的,即每个点只与它的上、下、左、右相邻的 4 个点之间的距离为 1。

D 4 ( a , b ) = ∣ i − k ∣ + ∣ j − l ∣ D_4(a, b)=|i-k|+|j-l| D4(a,b)=ik+jl

(3)棋盘距离 D 8 D_8 D8 如果允许在图像坐标系中像素点的对角线方向的移动,就可以得到棋盘距离,8 表示在这种定义下,像素点是 8 邻接的,即每个点只与它的上、下、左、右、四个对角线方向相邻的 8 个点之间的距离为 1。

D 8 ( a , b ) = max ⁡ { ∣ i − k ∣ , ∣ j − l ∣ } D_8(a, b)=\max \{|i-k|,|j-l|\} D8(a,b)=max{ik,jl}

  • 距离变换

距离变换也叫作距离函数或者斜切算法。它是距离概念的一个应用,图像处理的一些算法以距离变换为基础。距离变换描述的是图像中像素点与某个区域块的距离,区域块中的像素点值为 0,临近区域块的像素点有较小的值,离它越远值越大。

以二值图像为例,其中区域块内部的像素值为 1,其他像素值为 0。距离变换给出每个像素点到最近的区域块边界的距离,区域块内部的距离变换结果为0。输入图像如图 1 所示, D 4 D_4 D4 距离的距离变换结果如图 2 所示。

计算机视觉 | 基于二值图像数字矩阵的距离变换算法,计算机视觉,矩阵,距离变换算法,计算机视觉,opencv

下面来讨论距离变换算法,其核心是利用两个小的局部掩膜遍历图像。第一遍利用掩模1,左上角开始,从左往右,从上往下。第二遍利用第二个掩模,右下角开始,从右往左,从下往上。掩模形状如下图所示:

计算机视觉 | 基于二值图像数字矩阵的距离变换算法,计算机视觉,矩阵,距离变换算法,计算机视觉,opencv

按照某种距离(如: D 4 D_4 D4 距离或 D 8 D_8 D8 距离)对大小为 M × N M×N M×N 的图像中的区域块作距离变换,算法过程如下:

(1) 建立一个大小为 M × N M×N M×N 的数组 F F F,作如下的初始化:将区域块中的元素设置为 0,其余元素设置为无穷;

(2) 利用掩模1(mask1),左上角开始,从左往右,从上往下遍历数组,将掩模中P点对应的元素的值作如下更新:

F ( P ) = min ⁡ q ∈ mask1 ⁡ { F ( P ) , D ( P , q ) + F ( q ) } F(P)=\min _{q \in \operatorname{mask1}}\{F(P), D(P, q)+F(q)\} F(P)=qmask1min{F(P),D(P,q)+F(q)}

(3) 利用掩模2(mask2),右下角开始,从右往左,从下往上遍历数组,将掩模中P点对应的元素的值作如下更新:

F ( P ) = min ⁡ q ∈ mask2 ⁡ { F ( P ) , D ( P , q ) + F ( q ) } F(P)=\min _{q \in \operatorname{mask2}}\{F(P), D(P, q)+F(q)\} F(P)=qmask2min{F(P),D(P,q)+F(q)}

最终得到的更新后的数组即为距离变换的结果。

这个算法过程在图像的边界处需要做出调整,因为在边界处,掩模不能全部覆盖图像,这时可以将掩模中没有对应元素的位置的值当作 0 来处理,即maskSize=0

在 OpenCV 中,distanceTransform 函数是用于计算二进制图像中每个非零像素到最近零像素的距离的函数。这个函数通常用于图像处理中的形态学操作和特征提取。下面是 distanceTransform 函数的一般形式:

dist_transform = cv2.distanceTransform(src, distanceType, maskSize)

  • src: 是输入的二进制图像(该图像应该是一个 8 位单通道图像)。

  • distanceType: 是指定距离度量的类型。

  • maskSize: 是指定计算距离时使用的卷积核的大小。

# 分别利用欧式距离、D4 距离和 D8 距离作距离变换
transMatE = cv2.distanceTransform(mat, distanceType=cv2.DIST_L2, maskSize=0)  # 计算欧氏距离变换
transMatD4 = cv2.distanceTransform(mat, distanceType=cv2.DIST_L1, maskSize=0)  # 计算 D4 距离变换
transMatD8 = cv2.distanceTransform(mat, distanceType=cv2.DIST_C, maskSize=0)  # 计算 D8 距离变换
# 输出欧式、D4 和 D8 的距离矩阵
print("欧氏距离的变换矩阵:\n", transMatE)
print("城区距离-D4的变换矩阵:\n", transMatD4)
print("棋盘距离-D8的变换矩阵:\n", transMatD8)
计算机视觉 | 基于二值图像数字矩阵的距离变换算法,计算机视觉,矩阵,距离变换算法,计算机视觉,opencv

四、将距离矩阵转换为可视化图片

因为经过距离矩阵变换之后,变换结果的数据类型为 float32(32 位浮点数),而在 OpenCV 中,采用 imshow 函数显示图像时需要使用 uint8 数据类型(8 位无符号整数),使得像素值的范围是从 0~255,可以表示灰度图像中的所有可能像素值。而 Matplotlib 可以直接处理 float32 类型的图像数据,因此并不需要将图像数据类型转换为 uint8 类型。文章来源地址https://www.toymoban.com/news/detail-847610.html

plt.figure(figsize=(15, 5))

plt.subplot(1, 3, 1)
plt.imshow(transMatE, cmap='gray')
plt.title('欧氏距离', fontsize=16)
plt.colorbar(shrink=0.8)

plt.subplot(1, 3, 2)
plt.imshow(transMatD4, cmap='gray')
plt.title('城区距离-D4', fontsize=16)
plt.colorbar(shrink=0.8)

plt.subplot(1, 3, 3)
plt.imshow(transMatD8, cmap='gray')
plt.title('棋盘距离-D8', fontsize=16)
plt.colorbar(shrink=0.8)

plt.tight_layout()
plt.show()
计算机视觉 | 基于二值图像数字矩阵的距离变换算法,计算机视觉,矩阵,距离变换算法,计算机视觉,opencv

到了这里,关于计算机视觉 | 基于二值图像数字矩阵的距离变换算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标

    x = [ x y ] boldsymbol{x} =begin{bmatrix}x\\\\yend{bmatrix} x = [ x y ​ ] 1. 平移变换 [ x ′ y ′ ] = [ x y ] + [ a b ] begin{bmatrix}x\\\'\\\\y\\\'end{bmatrix} = begin{bmatrix}x\\\\yend{bmatrix} + begin{bmatrix}a\\\\bend{bmatrix} [ x ′ y ′ ​ ] = [ x y ​ ] + [ a b ​ ]   将向量 [ a b ] begin{bmatrix}a\\\\bend{bmatrix} [ a b ​ ] 加到 [

    2024年03月17日
    浏览(49)
  • 计算机竞赛 - 基于机器视觉的图像拼接算法

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,你用你的手机对某一场景拍照,但是你没有办法一次将所有你

    2024年02月13日
    浏览(72)
  • 计算机视觉项目实战-基于特征点匹配的图像拼接

    😊😊😊 欢迎来到本博客 😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉 作者简介 : ⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo),python网页爬虫、机器学习、计算机视觉(OpenCV)、

    2024年02月02日
    浏览(50)
  • 【图像分类】基于计算机视觉的坑洼道路检测和识别(2个类别)

    写在前面: 首先感谢兄弟们的支持,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬

    2024年02月04日
    浏览(56)
  • 【计算机视觉】图像分割与特征提取——基于Log、Canny的边缘检测

    个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  ⏰往期文章:SpringBoot项目整合微信支付 🔔博主推荐网站:牛客网 刷题|面试|找工作神器 📣种一棵树最好的时间是十年前,其次是现在! 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 前言:

    2024年02月03日
    浏览(47)
  • 基于 OpenCV 的车辆变道检测,计算机视觉+图像处理技术

    本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用 OpenCV 的 haar 级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢? 01. 数据集 我们将道路上汽车的视频文件用作数据

    2024年01月25日
    浏览(71)
  • 计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的动物识别算法研究与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 目前,由于计算机能力和相关理论的发展获得了重大突破,基于深度学

    2024年02月09日
    浏览(86)
  • 基于计算机视觉,深度学习、机器学习,OpenCV,图像分割,目标检测卷积神经网络计算机毕业设计选题题目大全选题指导

    随着深度学习、机器学习和神经网络技术的快速发展,计算机视觉领域的应用变得越来越广泛和有趣。本毕业设计旨在探索这一领域的前沿技术,将深度学习模型、神经网络架构、OpenCV图像处理工具,以及卷积神经网络(CNN)的强大能力结合起来,以解决实际图像处理问题。

    2024年02月08日
    浏览(79)
  • 【计算机视觉课程设计】基于暗通道先验单幅图像去雾算法的实现(MATLAB)

           随着信息化时代的到来,计算机视觉得以迅速发展,在社会生活中的各个领域发挥了重要作用。然而,近年来大气污染逐渐加重,雾霾天气出现的频率越来越高,导致户外成像设备不能捕捉到高质量的清晰图像,无法正常运用于计算机视觉系统。因此,对雾天图像进

    2024年02月05日
    浏览(46)
  • 【图像分类】基于计算机视觉的坑洼道路检测和识别(ResNet网络,附代码和数据集)

    写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 (专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内,不想订阅专栏的

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包