用Skimage学习数字图像处理(021):图像特征提取之线检测(下)

本节是特征提取之线检测的下篇,讨论基于Hough变换的线检测方法。首先简要介绍Hough变换的基本原理,然后重点介绍Skimage中含有的基于Hough变换的直线和圆形检测到实现。

目录

10.4 Hough变换

10.4.1 原理

10.4.2 实现

10.4 Hough变换

Hough变换(霍夫变换)是一种在图像处理和计算机视觉中广泛使用的技术,是由Paul Hough在1962年提出。

Hough变换的一个主要优点是它对噪声和曲线间断的鲁棒性。它不仅限于检测直线,还可以用于检测圆、椭圆、三角形等多种形状。此外,Hough变换也广泛应用于计算机视觉的多个领域,如边缘检测、特征提取、模式识别等多个领域。

10.4.1 原理

Hough变换的基本原理是通过在参数空间中进行累加统计来检测图像中的基本形状,其核心思想是将图像空间中的曲线或直线变换到参数空间中,通过检测参数空间中的极值点来确定图像中曲线的描述参数,从而提取出规则的曲线。

有关原理的详细介绍,可参考相关的文献,再次不再赘述。我们重点介绍基于Skimage的Hough变换的实现。

10.4.2 实现

在Skimage中,提供了5个与Hough变换有关的函数,分别是:

  • skimage.transform.hough_line:进行直线Hough变换.
  • skimage.transform.hough_line_peaks:返回直线Hough变换的峰值.
  • skimage.transform.hough_circle:进行圆Hough变换
  • skimage.transform.hough_circle_peaks:返回圆形Hough变换的峰值.
  • skimage.transform.hough_ellipse:进行椭圆Hough变换.

(1)直线检测

使用skimage.transform.hough_line()和skimage.transform.hough_line_peaks()实现直线检测:

skimage.transform.hough_line(image, theta).
skimage.transform.hough_line_peaks(hspace, angles, dists, min_distance, min_angle, threshold, num_peaks)

部分参数说明

  • image:输入图像。
  • theta:Angles at which to compute the transform, in radians. Defaults to a vector of 180 angles evenly spaced in the range [-pi/2, pi/2).。
  • hspace:Hough transform accumulator。Angles at which the transform is computed, in radians.
  • angles:Angles at which the transform is computed, in radians。
  • dists:输入图像。
  • min_distance:输入图像。
  • min_angle:输入图像。
  • num_peaks:输入图像。
  • hspace:输入图像。

返回值

  • hspace:ndarray of uint64, shape (P, Q),Hough transform accumulator.
  • angles:Angles at which the transform is computed, in radians。

以下是官方提供的一个直线检测的实例:

import numpy as npfrom skimage.transform import hough_line, hough_line_peaks
from skimage.feature import canny
from skimage.draw import line as draw_line
from skimage import dataimport matplotlib.pyplot as plt
from matplotlib import cm# Constructing test image
image = np.zeros((200, 200))
idx = np.arange(25, 175)
image[idx, idx] = 255
image[draw_line(45, 25, 25, 175)] = 255
image[draw_line(25, 135, 175, 155)] = 255# Classic straight-line Hough transform
# Set a precision of 0.5 degree.
tested_angles = np.linspace(-np.pi / 2, np.pi / 2, 360, endpoint=False)
h, theta, d = hough_line(image, theta=tested_angles)# Generating figure 1
fig, axes = plt.subplots(1, 3, figsize=(15, 6))
ax = axes.ravel()ax[0].imshow(image, cmap=cm.gray)
ax[0].set_title('Input image')
ax[0].set_axis_off()angle_step = 0.5 * np.diff(theta).mean()
d_step = 0.5 * np.diff(d).mean()
bounds = [np.rad2deg(theta[0] - angle_step),np.rad2deg(theta[-1] + angle_step),d[-1] + d_step,d[0] - d_step,
]
ax[1].imshow(np.log(1 + h), extent=bounds, cmap=cm.gray, aspect=1 / 1.5)
ax[1].set_title('Hough transform')
ax[1].set_xlabel('Angles (degrees)')
ax[1].set_ylabel('Distance (pixels)')
ax[1].axis('image')ax[2].imshow(image, cmap=cm.gray)
ax[2].set_ylim((image.shape[0], 0))
ax[2].set_axis_off()
ax[2].set_title('Detected lines')for _, angle, dist in zip(*hough_line_peaks(h, theta, d)):(x0, y0) = dist * np.array([np.cos(angle), np.sin(angle)])ax[2].axline((x0, y0), slope=np.tan(angle + np.pi / 2))plt.tight_layout()
plt.show()

以下是处理结果示例:

(2)圆形检测

使用skimage.transform.hough_circle()和skimage.transform.hough_circle_peaks()检测圆形:

skimage.transform.hough_circle(image, radius, normalize, full_output)
skimage.transform.hough_circle_peaks(hspaces, radii, min_xdistance, min_ydistance, threshold, num_peaks, total_num_peaks, normalize)

以下是官方提供的一个圆形检测的实例:

import numpy as np
import matplotlib.pyplot as pltfrom skimage import data, color
from skimage.transform import hough_circle, hough_circle_peaks
from skimage.feature import canny
from skimage.draw import circle_perimeter
from skimage.util import img_as_ubyte# Load picture and detect edges
image = img_as_ubyte(data.coins()[160:230, 70:270])
edges = canny(image, sigma=3, low_threshold=10, high_threshold=50)# Detect two radii
hough_radii = np.arange(20, 35, 2)
hough_res = hough_circle(edges, hough_radii)# Select the most prominent 3 circles
accums, cx, cy, radii = hough_circle_peaks(hough_res, hough_radii, total_num_peaks=3)# Draw them
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(10, 4))
image = color.gray2rgb(image)
for center_y, center_x, radius in zip(cy, cx, radii):circy, circx = circle_perimeter(center_y, center_x, radius, shape=image.shape)image[circy, circx] = (220, 20, 20)ax.imshow(image, cmap=plt.cm.gray)
plt.show()

以下是处理结果示例:

(3)椭圆检测

使用skimage.transform.hough_ellipse()检测椭圆形:

skimage.transform.hough_ellipse(image, threshold, accuracy, min_size, max_size)

以下是官方提供的一个椭圆检测的实例:

import matplotlib.pyplot as pltfrom skimage import data, color, img_as_ubyte
from skimage.feature import canny
from skimage.transform import hough_ellipse
from skimage.draw import ellipse_perimeter# Load picture, convert to grayscale and detect edges
image_rgb = data.coffee()[0:220, 160:420]
image_gray = color.rgb2gray(image_rgb)
edges = canny(image_gray, sigma=2.0, low_threshold=0.55, high_threshold=0.8)# Perform a Hough Transform
result = hough_ellipse(edges, accuracy=20, threshold=250, min_size=100, max_size=120)
result.sort(order='accumulator')# Estimated parameters for the ellipse
best = list(result[-1])
yc, xc, a, b = (int(round(x)) for x in best[1:5])
orientation = best[5]# Draw the ellipse on the original image
cy, cx = ellipse_perimeter(yc, xc, a, b, orientation)
image_rgb[cy, cx] = (0, 0, 255)
# Draw the edge (white) and the resulting ellipse (red)
edges = color.gray2rgb(img_as_ubyte(edges))
edges[cy, cx] = (250, 0, 0)fig2, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, figsize=(8, 4), sharex=True, sharey=True
)ax1.set_title('Original picture')
ax1.imshow(image_rgb)ax2.set_title('Edge (white) and result (red)')
ax2.imshow(edges)plt.show()

以下是处理结果示例:

参考文献:

  1. Duda, R. O. and P. E. Hart, “Use of the Hough Transformation to Detect Lines and Curves in Pictures,” Comm. ACM, Vol. 15, pp. 11-15 (January, 1972)
  2. C. Galamhos, J. Matas and J. Kittler,”Progressive probabilistic Hough transform for line detection”, in IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 1999.

(未完待续)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebGL 2.0相较于1.0有什么不同?

作者:STANCH 1.概述 WebGL 1.0自推出以来,已成为广泛支持的Web标准,既能跨平台,还免版税。它通过插件为Web浏览器带来高质量的3D图形,这是迄今为止市场上使用最广泛的Web图形,并得到Apple,Goog…

使用SpringBoot将中国地震台网数据保存PostGIS数据库实践

目录 前言 一、数据转换 1、Json转JavaBean 2、JavaBean与数据库字段映射 二、空间数据表设计 1、表结构设计 三、PostGIS数据保存 1、Mapper接口定义 2、Service逻辑层实现 3、数据入库 4、运行实例及结果 总结 前言 在上一篇博客中基于Java的XxlCrawler网络信息爬…

Resilience中的RateLimiter

Resilience中的RateLimiter 一、RateLimiter(限流)1.常见的限流算法漏桶算法(Leaky Bucket)令牌桶算法(Token Bucket)——Spring cloud 默认使用该算法滚动时间窗口(tumbling time window&#…

GmSSL-3.1.1编译

1.源码下载: 下载地址:https://github.com/guanzhi/GmSSL/releases选择对应版本下载。 ​ 2.选择要下载的源码包: ​ 2.编译: 2.1 windows编译:打开vs命令行,选择想要编译的版本,x86或x64…

守望先锋2账号注册教程 战网国际服注册守望先锋2账号步骤

守望先锋2账号注册教程 战网国际服注册守望先锋2账号步骤 守望先锋2是一款由暴雪娱乐公司开发的多人第一人称射击游戏,是守望先锋的续作,故事发生在未来,各种英雄为保卫地球而战。守望先锋2是款不断进化的游戏,带来极致的射击体…

【网络】Burpsuite学习笔记

文章目录 1.介绍1.1 正常客户端与服务端通信&BurpSuite代理后1.2 下载激活参考地址1.3 代理设置1.4 Proxy SwitchyOmega 使用1.4.1 新建情景模式1.4.2 设置代理1.4.2 应用选项 1.5 FoxyProxy 使用1.6 安装证书1.6.1 方式一1.6.2 方式二1.6.3 浏览器安装证书1.6.4 或者直接双…

面试突击---MySQL索引

面试突击---MYSQL索引 面试表达技巧:1、谈一下你对于mysql索引的理解?(为什么mysql要选择B树来存储索引)2、索引有哪些分类?3、聚簇索引与非聚簇索引4、回表、索引覆盖、最左匹配原则、索引下推(1&#xff…

MATLAB 点云体素滤波 (58)

MATLAB 体素滤波 (58) 一、基本原理二、算法实现1.代码数据的海量性始终是点云处理时需要面临的一个大问题,严重的时间消耗和内存占用影响了点云处理的发展,当然了,点云数量主要应该看项目的实际需求,若是对细节要求较高,那么点云数量不可过少,但是要求过低时,我们就可…

【NUCLEO-G071RB】003——GPIO-按键控制LED灯

NUCLEO-G071RB:003——GPIO-按键控制LED灯 设计目标电路原理图芯片配置程序修改 设计目标 用输入控制输出,即以蓝色按键B1的输入控制LED4灯的输出 细节: 若判定为按键按下中,则LED灭灯,否则亮灯按键按下和抬起的检查…

怎样将excel的科学计数法设置为指数形式?

对了,这个问题中所谓的“指数形式”是指数学上书写的右上标的指数格式,能不能通过单元格设置来做这个格式的转换呢? 一、几个尝试 以下,以数字123000为例来说明。 情况1.转换成数学上的书写方式,如下图的样子&#x…

Windows 任务计划程序 【不管用户是否登录都要运行】执行时不显示CMD或程序窗口

任务计划程序右侧可以导出xml 「只在用户登录时运行」LogonType:InteractiveToken。 「不管用户是否登录都要运行」LogonType:Password。 用管理员运行CMD :schtasks /change /it /tn "test" 「不管用户是否登录都要运行」Logon…

20240329-1-SVM面试题

SVM面试题 1. SVM直观解释 SVM,Support Vector Machine,它是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;其还包括核技巧,这使它成为实质上的非线性分类…

vue+element作用域插槽

作用域插槽的样式由父组件决定&#xff0c;内容却由子组件控制。 在el-table使用作用域插槽 <el-table><el-table-column slot-scope" { row, column, $index }"></el-table-column> </el-table>在el-tree使用作用域插槽 <el-tree>…

redis-plus-plus的安装与使用

文章目录 一、安装第一步&#xff1a;安装hiredis第二步&#xff1a;安装redis-plus-plus第三步&#xff1a;将编译后的可执行文件移动到/usr/local对应目录第四步&#xff1a;更新动态库 二、使用第一步&#xff1a;编写示例代码第二步&#xff1a;编译运行 本文参考自 redis-…

JVM垃圾回收与算法

1. 如何确定垃圾 1.1 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单 的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关 联的引用&#xff0c;即…

ENSP防火墙配置策略路由及ip-link探测

拓扑 配置目标 1.A区域走ISP1&#xff0c;B区域走ISP2 2. isp线路故障时及时切换到另一条线路 配置接口及安全区域 配置安全策略 配置nat 配置默认路由 配置ip-link 配置策略路由 cl-1 cl-2 验证配置成功 策略路由 A走ISP1 B走ISP2 验证线路故障 isp1 in g0/0/0 shoutdow…

基于Python的机器学习的文本分类系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

VIT论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2010.11929.pdf VIT论文阅读 摘要INTRODUCTION结论RELATEDWORKMETHOD1.VISIONTRANSFORMER(VIT)整体流程消融实验HEAD TYPE AND CLASSTOKENpoisitional embedding 整体过程公式Inductive biasHybrid Architecture 2.FINE-TUNINGANDH…

LeetCode236:二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…

03攻防世界-unserialize3

根据题目可以看出&#xff0c;这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码&#xff0c;那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题&#xff0c;根据源码提示我们需要构造code。 序列化的意思是&#xff1a;是将变量转换为可保存或传输…