博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
霍夫变换概述和标准霍夫变换
阅读量:6303 次
发布时间:2019-06-22

本文共 2165 字,大约阅读时间需要 7 分钟。

在图像处理和计算机视觉领域中,如何冲当前的退选哪个中提取出所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速的检测出直线或者是圆。其中一种非常有效的的解决方法是霍夫变换,其为图像处理中从图像中识别几何图形的基本方法。

霍夫变换的概述

霍夫变换在opencv中分为霍夫线变换和霍夫圆变换

opencv中的霍夫线变换

霍夫线变换是一种用来寻找直线的方法,在使用霍夫线变换之前,首先对图像进行边缘检测,即霍夫线变换的直接输入只能是边缘二值图像。

opencv中霍夫线变换有三种

(1)标准霍夫变换(SHT),由HoughLines调用

(2)多尺度霍夫变换(MSHT),由HoughLines调用,

(3)累计概率霍夫变换(PPHT),由HoughLinesP调用,可以在一定范围内进行霍夫变换

霍夫变换的原理

标准霍夫变换函数:HoughLines()

void HoughLines( InputArray image,// 源图像,需为8位的单通道二进制图像,可以将任意的源图像载进来,并由函数修改成此格式再放进来

                              OutputArray lines,

                              double rho,

                               double theta, 

                               int threshold,

                               double srn = 0, 

                               double stn = 0,

                               double min_theta = 0,

                               double max_theta = CV_PI );

参数详解

代码实现

NSString *image = @"lou.png";    

UIImage *image1 = [UIImage imageNamed:image];    

Mat im;    UIImageToMat(image1, im);       

 if (im.empty()) {          

      return;  

  }  

  // 创建零时变量    

Mat midImage,dstImage;    

// 进行边缘检测和转换为灰度图    

Canny(im, midImage, 50, 200);    

cvtColor(midImage, dstImage, COLOR_GRAY2BGR);        

// 进行霍夫变换    

std::vector<Vec2f>lines;// 定义一个矢量lines,存放得到的线段矢量集合

HoughLines(midImage, lines, CV_PI/180, 150, 0);

for (size_t i = 0; i < lines.size(); i++) {

float rho = lines[i][0],theta = lines[i][1];

cv::Point pt1,pt2;

double a = cos(theta),b = sin(theta);

double x0 = a*rho,y0 = b*rho;

pt1.x = cvRound(x0 + 1000*(-b));

pt1.y = cvRound(y0 + 1000*(a));

pt2.x = cvRound(x0 - 1000*(-b));

pt2.y = cvRound(y0 - 1000*(a));

line(dstImage, pt1, pt2, Scalar(100,100,195));

}

self.secondImageView.image = MatToUIImage(dstImage);

效果

累计概率霍夫变换函数:HoughLinesP() 函数

void HoughLinesP( InputArray image,

                                OutputArray lines,

                                 double rho,

                                 double theta, 

                                 int threshold,

                                 double minLineLength = 0, 

                                 double maxLineGap = 0

 );

参数详解

代码实现

NSString *image = @"xixi.jpg";    

UIImage *image1 = [UIImage imageNamed:image];   

 Mat im;    

UIImageToMat(image1, im);       

 if (im.empty()) {                return;    }    

// 创建零时变量   

 Mat midImage,dstImage;    

// 进行边缘检测和转换为灰度图   

 Canny(im, midImage, 50, 200,3);    

cvtColor(midImage, dstImage, CV_GRAY2BGR);   

std::vector<Vec4i>lines;// 定义一个矢量lines,存放得到的线段矢量集合

HoughLinesP(midImage,lines, 1,CV_PI/180, 80, 50, 10);

for (size_t i = 0; i < lines.size(); i++) {

Vec4i l = lines[i];

line(dstImage, cv::Point(l[0],l[1]),cv::Point(l[2],l[3]) , Scalar(186,88,255),1,LINE_AA);

}

self.secondImageView.image = MatToUIImage(dstImage);

效果

转载地址:http://amfxa.baihongyu.com/

你可能感兴趣的文章
Unity3D Input按键系统
查看>>
简单的一条SQL,不简单的做事思维 NOT IN 、NOT EXISTS、LEFT JOIN用法差别 ...
查看>>
DataWorks:任务未运行自助排查
查看>>
ionic/cordova热部署
查看>>
「镁客早报」特斯拉裁员,马斯克解释没有办法;微软推出Azure DevOps赏金计划...
查看>>
Flink入坑指南第五章 - 语法糖 view
查看>>
centos 7.4 使用 pgxc_ctl 安装与使用
查看>>
Redis 单key值过大 优化方式
查看>>
【数据库】表分区
查看>>
nutz-sqltpl 1.3.4.RELEASE 发布,在 Nutz 项目中“解决 Java 拼接 SQL”问题
查看>>
城市 | 800个地铁站数据透析的京沪白领图鉴:隐形土豪、无产中产阶级和猪猪女孩...
查看>>
前端脚本!网站图片素材中文转英文
查看>>
linux的常用易忘命令
查看>>
PHP 分割字符串
查看>>
java 基于QRCode、zxing 的二维码生成与解析
查看>>
关于职业规划的一些思考
查看>>
img垂直水平居中与div
查看>>
Fabrik – 在浏览器中协作构建,可视化,设计神经网络
查看>>
防恶意注册的思考
查看>>
http2-head compression
查看>>