opencv python 实现Canny检测后不连续不封闭轮廓的闭合

这篇具有很好参考价值的文章主要介绍了opencv python 实现Canny检测后不连续不封闭轮廓的闭合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Canny检测后轮廓的闭合在网上看了一些相关文章后总结出有以下方法:

1、使用闭运算等形态学操作来对轮廓进行处理,但作为像素点级别 的形态学操作往往不能满足要求,如:两条轮廓线相距仅为一个像素,在进行闭运算操作时会使这两条轮廓粘连在一起。

2、对于规则的图像可通过对不连续的点或线段进行拟合,通过对称的修剪和补缺来处理,但适用的对象非常有限,所以只能特例分析。

3、找到图像中不连续轮廓中的端点,通过最近端点间画直线来处理,但这仅仅适用于简单的图像处理,对于一些复杂或者断续太大的轮廓反而效果比较差。

本章主要讲第三种方法,代码如下:

import cv2
import math
import numpy as np
import timeit


start_time = timeit.default_timer()


def point(img, h, w):
    p = []
    for i in range(h):
        for j in range(w):
            if img[i, j] == 255:
                r = []
                for y in range(i-1, i+2):
                    for x in range(j-1, j+2):
                        if y == i and x == j:
                            continue
                        if img[y, x] == 255:
                            r.append((y, x))
                if len(r) > 0:
                    if len(r) == 1:
                        p.append((i, j))
                    elif len(r) == 2:
                        dy = r[0][0] - r[1][0]
                        dx = r[0][1] - r[1][1]
                        if abs(dy) + abs(dx) == 1:
                            p.append((i, j))
    return p


max_range = 30  # 设置最大的端点连线

img = cv2.imread('dian.jpg')
h, w, c = img.shape[:]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = cv2.bilateralFilter(gray, 5, 150, 150)

ven = cv2.Canny(img2, 77, 220)
points = point(ven, h, w)
tu = np.zeros((h, w, c), np.uint8)
tu[ven != 0] = 255
tu1 = tu.copy()
for i, j in points:
    tu[i, j, 0] = 0  #b
    tu[i, j, 1] = 0  #G
    tu[i, j, 2] = 255  # r
cv2.imshow('tu', tu)  # 查看端点

for n, i in enumerate(points):
    points.pop(n)
    distances = [np.linalg.norm(np.array(p) - np.array(i)) for p in points]  # 计算欧几里得距离
    min_index = np.argmin(distances)  # 得到列表中最短距离的索引
    if i != points[min_index] and distances[min_index] <= max_range:
        cv2.line(tu1, tuple((i[1], i[0])), tuple((points[min_index][1], points[min_index][0])), (0, 0, 255), 1)
cv2.imshow('dabo', tu1)

end_time = timeit.default_timer()
print("程序运行时间: ", end_time - start_time, "秒")

cv2.waitKey(0)

一、程序分析

        在关于图像中端点的定义上,可分为如下情况:

opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉

opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉 opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉

 上两份对应着程序中len(r)==1的部分,下两份对应着程序中len(r)==2的部分

该部分程序实现了图像中不连续轮廓端点的寻找

def point(img, h, w):
    p = []
    for i in range(h):
        for j in range(w):
            if img[i, j] == 255:
                r = []
                for y in range(i-1, i+2):
                    for x in range(j-1, j+2):
                        if y == i and x == j:
                            continue
                        if img[y, x] == 255:
                            r.append((y, x))
                if len(r) > 0:
                    if len(r) == 1:
                        p.append((i, j))
                    elif len(r) == 2:
                        dy = r[0][0] - r[1][0]
                        dx = r[0][1] - r[1][1]
                        if abs(dy) + abs(dx) == 1:
                            p.append((i, j))
    return p

 二、程序展示

        本人通过手动调整了Canny算子的阈值参数,对得到的图像进行端点的寻找后,用红色进行了标出,如下图:

opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉

下图即为最终的闭合图像,可通过调整最大画线距离max_range来控制画线

 opencv怎么让未闭合的轮廓闭合,opencv,计算机视觉

for n, i in enumerate(points):
    points.pop(n)
    distances = [np.linalg.norm(np.array(p) - np.array(i)) for p in points]  # 计算欧几里得距离
    min_index = np.argmin(distances)  # 得到列表中最短距离的索引
    if i != points[min_index] and distances[min_index] <= max_range:
        cv2.line(tu1, tuple((i[1], i[0])), tuple((points[min_index][1], points[min_index][0])), (0, 0, 255), 1)
cv2.imshow('dabo', tu1)

三,结果分析 

        可以看到结果是非常不如意的,所以本文章仅提供一个思路,并不能直接的解决一些实际问题,可以通过对端点连线处程序进行改进,使的能够对定性的端点进行连线闭合。

        如果有更好的办法欢迎各位在评论区留言!

参考文章:

Python OpenCV 连接不封闭的轮廓

canny边缘检测不连续问题

opencv 风挡轮廓补全

图像轮廓缺陷修补文章来源地址https://www.toymoban.com/news/detail-851118.html

到了这里,关于opencv python 实现Canny检测后不连续不封闭轮廓的闭合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Python】OpenCV-图像轮廓检测初学

    在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 图像轮廓检测是图像处理中的一项关键技术,可用于检测物体的形状、

    2024年02月21日
    浏览(46)
  • 数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

    本章主要介绍图像处理中一个比较基础的操作:Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难,主要是结合OpenCV 4.5+的API相关操作,为往下 \\\"基于距离变换的分水岭图像分割\\\" 做知识储备。 在讲述轮廓之前,要花点时间学学边缘检测提取的一个著名算法——Canny边缘提取算法

    2024年02月16日
    浏览(38)
  • Canny算子边缘检测原理讲解及其完整C语言实现(不使用opencv)

    作者:队友调车我吹空调 日期:2023/05/17 版权:遵循CC 4.0 BY-SA版权协议 这里是后期的笔者,本文算是笔者的学习笔记,主要是在单片机中使用的,再者就是由于某些原因,笔者不想使用opencv,因此尝试跟着原理手搓了这份代码,笔者也尽力将代码写到最简和效率最优了。然而

    2024年04月27日
    浏览(48)
  • python实现Canny算子边缘检测算法

        边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的:          通过边缘检测算法,我们最终得到

    2024年02月08日
    浏览(40)
  • opencv-python3 | cv2.findContours()检测图像中物体轮廓

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 通常,为了提高物体轮廓检测的准确率,首先要将彩色图

    2024年02月05日
    浏览(46)
  • Canny 边缘检测算法-python实现(附代码)

    摘要 : Canny 边缘检测算法由计算机科学家 John F. Canny 于 1986 年提出的。其不仅提供了算法,还带来了一套边缘检测的理论,分阶段的解释如何实现边缘检测。Canny 检测算法包含下面几个阶段: 图像灰度化 高斯模糊处理 图像梯度、梯度幅值、梯度方向计算 NMS(非极大值抑制)

    2024年02月04日
    浏览(38)
  • opencv(23) Canny边缘检测流程(Canny算子)

    Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法 , 最优边缘检测的三个主要评价标准是: 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。 高定位性: 标识出的边缘要与图像中的实

    2024年04月11日
    浏览(40)
  • python --opencv图像处理Canny算子边缘检测(Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr 算子、 LOG 算子)

    边缘检测是基于灰度突变来分割图像的常用方法,其实质是提取图像中不连续部分的特征。目前常见边缘检测算子有差分算子、 Roberts 算子、 Sobel 算子、 Prewitt 算子、 Log 算子以及 Canny 算子等。 其中, Canny 算子是由计算机科学家 John F. Canny 于 1986 年提出的一种边缘检测算子

    2024年04月12日
    浏览(51)
  • OpenCV——Canny边缘检测算法

    图像分割是将数字图像细分为多个子区域的过程,在计算机视觉/机器视觉领域被广泛应用。它的目的是简化或改变图像的表示形式,以便更容易理解和分析。常见的图像分割方法包括阈值处理、聚类法、边缘检测和区域生长等。解决图像分割问题通常需要结合领域知识,以提

    2024年04月17日
    浏览(43)
  • opencv-Canny 边缘检测

    Canny边缘检测是一种经典的图像边缘检测算法,它在图像中找到强度梯度的变化,从而 识别出图像中的边缘 。 Canny边缘检测的优点包括高灵敏度和低误检率。 在OpenCV中, cv2.Canny() 函数用于执行Canny边缘检测。 基本语法如下: 参数说明: image : 输入图像,通常为灰度图像。

    2024年02月22日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包