首页 > 其他分享 >opencv距离变换函数distanceTransform

opencv距离变换函数distanceTransform

时间:2024-04-30 17:22:21浏览次数:20  
标签:plt 变换 cv2 距离 opencv distanceTransform 图像 像素点

当图像内的各个子图没有连接时,可以直接使用形态学的腐蚀操作确定前景对象,但是如果图像内的子图连接在一起时,就很难确定前景对象了。此时,借助于距离变换函数
cv2.distanceTransform()可以方便地将前景对象提取出来。

距离变换函数 cv2.distanceTransform()计算二值图像内任意点到最近背景点的距离。一般情况下,该函数计算的是图像内非零值像素点到最近的零值像素点的距离,即计算二值图像中所有像素点距离其最近的值为 0 的像素点的距离。当然,如果像素点本身的值为 0,则这个距离也为 0。

距离变换函数 cv2.distanceTransform()的计算结果反映了各个像素与背景(值为0的像素点)
的距离关系。通常情况下:

如果前景对象的中心(质心)距离值为 0 的像素点距离较远,会得到一个较大的值。
如果前景对象的边缘距离值为 0 的像素点较近,会得到一个较小的值。
如果对上述计算结果进行阈值化,就可以得到图像内子图的中心、骨架等信息。距离变换函数 cv2.distanceTransform()可以用于计算对象的中心,还能细化轮廓、获取图像前景等,有多种功能。
距离变换函数 cv2.distanceTransform()的语法格式为:
dst=cv2.distanceTransform(src, distanceType, maskSize[, dstType]])
src 是 8 位单通道的二值图像。
distanceType 为距离类型参数,其具体值和含义如表 17-1 所示。


maskSize 为掩模的尺寸,其可能的值如表 17-2 所示。需要注意,当 distanceType =cv2.DIST_L1 或 cv2.DIST_C 时,maskSize 强制为 3(因为设置为 3 和设置为 5 及更大值没有什么区别)。

dstType 为目标图像的类型,默认值为 CV_32F。
dst 表示计算得到的目标图像,可以是 8 位或 32 位浮点数,尺寸和 src 相同。
示例:使用距离变换函数 cv2.distanceTransform(),计算一幅图像的确定前景,并观察效果。

点击查看代码
img = cv2.imread('D:\pic\coin.png',cv2.IMREAD_UNCHANGED)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
#对图像阈值化处理,得到二值图像,黑色背景,白色前景,前景为我们要提取的目标,背景为0,前景为1
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#定义一个3*3的卷积核,卷积核的作用是将前景与背景分离
kernel = np.ones((3,3),np.uint8)
#对二值图像进行开运算,去除噪声,开运算是先腐蚀再膨胀的过程,它可以去除小的干扰块,平滑较大的对象边界,同时并不明显改变其面积
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
#距离变换,得到每一个前景像素点到最近的背景像素点的距离,然后对其进行阈值化处理,得到的结果就是前景
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
#对膨胀后的图像进行阈值化处理,得到前景,前景为我们要提取的目标,背景为0,前景为1,这样就得到了我们要提取的目标,但是目标并不连续
ret, fore = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

plt.subplot(131)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(132)
plt.imshow(dist_transform)
plt.axis('off')
plt.subplot(133)
plt.imshow(fore)
plt.axis('off')
plt.show()

结果如下:

标签:plt,变换,cv2,距离,opencv,distanceTransform,图像,像素点
From: https://www.cnblogs.com/SunshineWeather/p/18168423

相关文章

  • 浅析OpenCV分水岭变换watershed函数的markers参数[C++]
    0.前言本文是笔者在学习C++OpenCV库时学习心得,在学习分水岭变换函数时,由于缺少相关学习资料,导致笔者理解吃力,故写此文章阐述一下对该函数的理解,希望对其他学习人士提供帮助。本文主要介绍了watershed函数参数以及参数实际表示。请您按文章次序阅读。您需要提前了解的相关知......
  • openEuler操作系统安装OpenCV 3.4.10
    安装依赖JDK要求需求java17系统要求centos8centos7需要自行升级glibc到某个版本,哪一个忘记了,风险很大,不要尝试!基础依赖#缺什么就下什么,其中cmake是最重要的yum-yinstallepel-releaseyuminstallgccgcc-c++yuminstallcmakeyuminstallepel-releaseyum......
  • openCV 图像清晰度检测
    图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差;在频域中,主要思路是考察图像的频率分量,对焦清晰的图像高频分量较多,对焦模糊的图像低频分量较多。这里实现3种清晰度评价方法,分别是Tenengrad梯度方法、Laplacian梯度方法和方差......
  • Centos7 下安装OpenCV 3.4.6 (本人参考这个步骤,在openEuler操作系统安装了OpenCV 3.4.1
    Centos7下安装OpenCV3.4.6 转自 https://blog.csdn.net/MaXiaoTiancsdn/article/details/115336499(本人参考这个步骤,在openEuler操作系统安装了OpenCV3.4.10的版本)  1.参考资料本文主要参考自以下文章,按照这篇文章的安装过程十分顺利,网上的贴子很多但是很......
  • Hessian矩阵以及在血管增强中的应用—OpenCV实现【2024年更新】
    有别于广为人知的Sobel、Canny等一阶算法,基于Hessian矩阵能够得到图像二阶结果,这将帮助我们深入分析图像本质。Hessian矩阵在图像处理中有着广泛的应用:其中在图像分割领域,包括边缘检测、纹理分析等;在图像增强领域,包括边缘增强、边缘消除等。本文从Hessian矩阵定义出发,通过清晰简......
  • 计算机图形:三维观察之投影变换
    目录投影变换正投影轴测、等轴测正投影正投影坐标系裁剪窗口、正投影观察体正投影的规范化变换斜投影斜*行投影斜等测、斜二测*行投影斜*行投影变换透视投影投影参考点与观察原点坐标变换特殊透视投影灭点灭点与投影参考点透视投影观察体透视投影变换矩阵对称透视投影椎体斜透视投......
  • Python基于opencv实现的人脸识别--入门项目
    先去opencv官网下载人脸识别的训练集https://opencv.org/releases/解压目录要记录主要使用haarcascade_frontalface_default.xml摄像头录入人脸(可选)可以弄一个文件夹,里面放一堆图片importcv2face_name='xxxx'#该人脸的名字#加载OpenCV人脸检测分类器face_cas......
  • 编译用于Qt的opencv问题解决
    CMakewasunabletofindabuildprogramcorrespondingto"MinGWMakefiles"解释:这个错误表明CMake无法找到用于生成Makefiles的构建程序。在使用CMake生成项目文件时,如果指定了"MinGWMakefiles",CMake需要一个Make工具来构建项目,而这个工具通常是由MinGW提供的。如......
  • 无源RLC电路和阻抗匹配 part2:串并联网络变换+L型匹配
    串并联变换(以RL串联→并联为例)若使上述变换成立,串联支路(Ls、Rs)总阻抗应等于并联支路(Lp、Rp)总阻抗因为可得RC串联→并联:上述变换为窄带阻抗变换,仅在以w0为中心的窄带内成立L型匹配L型匹配所用元件较少,仅用两个无源器件即可构成(电容or电感),根据Rs和Rl的大小关系可分......
  • 姿态解算中的坐标变换
    ......