图像处理————霍夫(HOUGH)变换

2023-12-25 04:18

本文主要是介绍图像处理————霍夫(HOUGH)变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

霍夫(HOUGH)变换

        霍夫变换是图像处理中用来从图像中分离出具有某种相同特征的几何形状(通常,直线,圆等)的常用方法。经典的霍夫变换常用来检测直线,圆,椭圆等。

为什么要进行霍夫变换,当然是为了实现某种目的,比如检测,(废话)。它是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法。在预先知道区域形状的条件下,利用霍夫变换可以方便地得到边界曲线而将不连续的边缘像素点连接起来。

霍夫变换的主要优点是受噪声和曲线间断的影响小。利用霍夫变换还可以直接检测某些已知形状的目标

霍夫变换的基本思想是点 —— 线的对偶性(duality),当然这只不过是所有人都这样说了,所谓线的对偶性就是线与线的某种变换之后的对应或者映射关系,实际上霍夫变换是直角坐标系空间线与变换域空间的线的映射关系,考虑傅里叶变换?当然就是说变换的目的就是便于分析。具体原理如下:

     在图像空间XY里,所有过点(x,y)的直线都满足方程:

                         y = px + q    

它也可写成:q = -px + y可以认为是参数空间PQ中过点(p’, q’)的一条直线。在图像空间中共线的点对应在参数空间里相交的线。



在图像空间中共线的点对应在参数空间里相交的线.反过来,在参数空间中相交于同一个点的所有直线在图像空间里都有共线的点与之对应。这就是点——线的对偶性。当然一般选取变换空间是时用的是极坐标空间(为什么?因为图像空间中垂直的直线p趋近于无穷!),霍夫变换根据这些关系把在图像空间中的检测问题转换到参数空间里,通过在参数空间里进行简单的累加统计完成检测任务在具体计算时,需要在参数空间PQ里建一个2-D的累加数组。设这个累加数组为A(p, q),如图所示,其中[pmin, pmax]和[qmin, qmax] 分别为预期的斜率和截距的取值范围。开始时置数组A为零,然后对每一个图像空间中的给定点,让p取遍P轴上所有可能的值,并根据式q = -px + y算出对应的q。再根据p和q的值(设都已经取整)对A累加:A(p, q)=A(p, q)+1。  累加结束后,根据A(p,q)的值就可知道有多少点是共线的,即A(p, q) 的值就是在(p, q) 处共线点的个数。同时(p, q) 值也给出了直线方程的参数,使我们得到了点所在的线。


具体实现步骤:

1)、构造一个P、Q空间的二维累加数组A(p,q)

2)、从f(x,y)的指定区域中取(xi,yi),按方程q=-pxi+yi在[pmin,pmax]中遍取可能的p值计算得到可能的q值。

3)、在对应的位置计算A(p,q) =A(p,q)+1

4)、重复2)、3)直到将从f(x,y)的指定区域中的所有点取完。此时,A(p,q)数组中最大值所对应的p,q就是方程y=px+q中的p、q值。

5)、根据y=px+q绘出f(x,y)中的直线

区域的选择:来自确认存在直线的区域。

坐标的选择:来自对存在的直线参数的估测。

霍夫变换不仅可用来检测直线和连接处在同一条直线上的点,也可以用来检测满足解析式f(x, c)=0形式的各类曲线,并把曲线上的点连接起来,这里x是一个坐标矢量,在2-D图像中是一个2-D矢量,c是一个系数矢量,它可以根据曲线的不同从2-D到3-D,4-D,…。换句话说,对写得出方程的图形都可利用霍夫变换检测

        例如圆周的检测。圆的一般方程是:

               (x - a)^2 + (y - b) ^2 = r^2

       式中有3个参数a,b, r,所以需要在参数空间里建立一个3-D的累加数组A,其元素可写为A(a, b, r) 。我们可让a和b依次变化而根据上式算出r,并对A累加:A(a, b, r) = A(a, b, r) + 1。所以其原理与检测直线上的点相同,只是复杂性增加了。

       从理论上来说,计算量和累加器尺寸随参数个数的增加是指数增加的,所以实际中霍夫变换最适合于检测较简单(即其解析表达式只含有较少参数)曲线上的点。

       设圆的半径r为已知,问题转化到2-D参数空间,如下图。原来参数的轨迹为整个圆锥部分表面,如果r已知,则参数的轨迹是半径为r的圆周。这里图像空间中的边界和参数空间里的轨迹都是圆周,所以这里是圆周——圆周对偶性。


至于代码,在MATLAB工具箱中本身集成了hough变换的函数,SO。。。。就不贴了

这篇关于图像处理————霍夫(HOUGH)变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534234

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

参会邀请 | 第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)

第二届机器视觉、图像处理与影像技术国际会议(MVIPIT 2024)将于2024年9月13日-15日在中国张家口召开。 MVIPIT 2024聚焦机器视觉、图像处理与影像技术,旨在为专家、学者和研究人员提供一个国际平台,分享研究成果,讨论问题和挑战,探索前沿技术。诚邀高校、科研院所、企业等有关方面的专家学者参加会议。 9月13日(周五):签到日 9月14日(周六):会议日 9月15日(周日

08_Tensorflow2图像处理秘籍:让图片‘听话’,AI也能成艺术家!

1. 图像数据处理 图像处理是指图像在神经网络训练之前的预处理,是人工智能视觉领域的重要组成部分。通过图像处理技术对图像数据集进行处理有两方面的作用:(1)将原始数据集处理成合格的、规范是数据集;(2)通过图像处理技术实现对原始数据集的增广。 # 库引入import matplotlib.pyplot as pltimport tensorflow as tf# 图像读取image_

python图像处理的图像几何变换

一.图像几何变换 图像几何变换不改变图像的像素值,在图像平面上进行像素变换。适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。几何变换常常作为图像处理应用的预处理步骤,是图像归一化的核心工作之一[1]。 一个几何变换需要两部分运算: 空间变换:包括平移、缩放、旋转和正平行投影等,需要用它来表示输出图像与输入图像之间的像素映射关系。灰度插值

从零开始学cv-0:图像处理基础知识

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一,图像分类1.1、模拟图像1.2、数字图像 二、颜色模式(颜色存储)2.1、RGB模式(发光模式)2.2、CMYK模式2.3、HSB模式2.4、Lab模式2.5、位图模式(Bitmap Mode)2.6、灰度模式(Grayscale Mode)2.7、索引颜色模式(Indexed Color Mode)

图像处理基础篇-镜像仿射透视

一.图像镜像 图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。如图7-1所示: 垂直镜像通常是以原图像的水平中轴线为中心,将图像划分为上下两部分进行堆成变换的过程,示意图如图7-2所示。 在Python中主要调用OpenCV的flip()函数实现图像镜像变换,函数原型如下: dst =

在c#下用opencv(emgecv)做图像处理环境配置

①首先要将编程环境配置好。 ⑴首先将vs2010下载安装,然后下载了emgucv-windows-universal-cuda 2.9.0.1922放在了D:\CV的目录下 (注意:emgucv-windows-universal-cuda 2.9.0.1922所放置的目录与后面的path配置有关,所以这里加以说明,也可以放在其他位置,但后面的path也要相应的改变)。 ⑵接着,要配置p

图像处理:基于直方图矫正的图像色彩均衡

from itertools import chainimport cv2import osimport numpy as npimport datetimeclass BrightnessBalance:def __init__(self):passdef arrayToHist(self,gray):'''计算灰度直方图,并归一化:param gray_path::return:'''