python图像处理初探——基于hough变换的直线道路识别_Style_Wei_的博客-程序员宝宝

技术标签: python  opencv  

暑期实习的工作是基于遥感地图的道路识别工作,在前期的论文调研过程中,基于自己的水平选择了复现 hough变换的方法,也算是直线处理的经典算法。重要的是,复习了数字图像处理的各种流程
1.引库
opencv库进行图像的处理
numpy库进行多维数组的处理

import cv2
import numpy as np

2.基本图像处理
(以下的过程不一定都要用到,我只是顺便都复习了一下)

image = cv2.imread('road1.png')

图像锐化

kernel2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv2.filter2D(image, -1, kernel=kernel2)

全局阈值(二值化)

gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)

重点是形态学中结构元素的选取,我直接复现论文中的4个结构元素
分别按照不同的方向进行腐蚀筛选

卷积核

F=np.array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [1, 1, 0, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])
F1=np.array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 1],
           [0, 0, 1, 1, 1, 0, 0],
           [1, 1, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])
F2=np.array([[0, 0, 0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 1, 0, 0, 0, 0, 0]])
F3=np.array([[0, 1, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 0]])

data=np.array(F, dtype='uint8')
data1=np.array(F1, dtype='uint8')
data2=np.array(F2, dtype='uint8')
data3=np.array(F3, dtype='uint8')

还有一些是opencv自带的结构元素函数 可以直接构建 也放在下面
根据需要自己选择是矩形还是椭圆形的核进行形态学优化

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
kernel1 = np.ones((2, 2), np.uint8)
kernel3 = cv2.getStructuringElement(cv2.MORPH_RECT,(2,2))

形态学运算

腐蚀,膨胀,开和闭 (腐蚀和膨胀放到后面的Hough函数里了)

closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)

图像反转

cv2.bitwise_not(binary, binary)

霍夫直线检测

def houghtest(binarys, datas):
    res = cv2.dilate(binarys, datas, iterations=1)
    res = cv2.erode(res, datas, iterations=1)
    edges = cv2.Canny(res, 50, 150, apertureSize=3)
    lines = cv2.HoughLinesP(edges, 1, np.pi/360, 100, minLineLength=10, maxLineGap=100)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
        k = -(y2 - y1) / (x2 - x1)
    cv2.imshow('houghlines', image)
    cv2.waitKey(0)

霍夫直线检测中,先进行了形态学的调整,接着通过canny算子拿到图形的边缘信息,最后通过累计概率霍夫检测函数cv2.HoughLinesP进行运算,这个函数的参数如下

  • 第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。

  • 第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1,
    x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。

  • 第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。

  • 第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。

  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。

  • 第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。

  • 第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

通过不同参数的设定,对于图像最后的筛选就有不同的结果。
结果如下图
第一个F结构元素
在这里插入图片描述第二个 F1结构元素
在这里插入图片描述
第三个 F2结构元素
在这里插入图片描述
第四个F3结构元素
在这里插入图片描述

反思

上图的问题,同时也是我的反思,在hough变换处理道路的时候其实是有很大的弊端的,重点是如下两点
1.hough变换一个大问题就是那些小的道路 累加器值小,检测不出来,但是要将检测的阈值降低,误差就大了 还有其他的干扰
2.还有就是曲率较大 弯大的 应该要设置很多个角度的卷积核去腐蚀,比较复杂,得根据特定道路进行设置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Style_Wei_/article/details/107779087

智能推荐

i.MX6ULL系统移植 使用 NXP MfgTool 烧写系统到eMMC_普通网友的博客-程序员宝宝_imx6ull烧录emmc

一、MfgToolMfgTool工具是NXP提供的专门用于给i.MX系列CPU烧写系统的软件。官方下载地址为:https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-6-processors/i-mx-6ull-single-core-processor-with-arm-cortex-a7-core:i.MX6ULL?tab=Design_

Banana PI 香蕉派 A20开发板介绍_weixin_33686714的博客-程序员宝宝

2019独角兽企业重金招聘Python工程师标准>>> ...

推荐引擎算法学习导论:协同过滤、聚类、分类(2011年旧文)_v_JULY_v的博客-程序员宝宝_推荐引擎的算法

推荐引擎算法学习导论:协同过滤、聚类、分类作者:July出处:结构之法算法之道引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了。于是昨天下午开始到今天凌晨3点,便研究了一下推荐引擎,做了初步了解。日后,自会慢慢深入仔细研究(日后的工作亦与此相关)。当然,此文也会慢慢补充完善。 本文作为对推荐引擎的初步...

第 5 章 函数_YaLi_GG的博客-程序员宝宝_打招呼函数

所谓函数,就是把具有独立功能的代码块,组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤:1、定义函数–封装独立的功能2、调用函数–享受封装的成果函数的作用,在开发程序时,使用函数可以提高编写的效率以及代码的重用。演练步骤:1、新建函数项目2、复制之前完成的乘法表3、修改文件,增加函数定义multiple_table():4、新建另外一个文件,使用import导入并且调用函数定义函数def multiple_table(): # 在控制台连续输出一次递增的五行.

随便推点

Unity3D中Public和[SerializeField]的使用_conjee.的博客-程序员宝宝_serializefield和public

在Unity3d中Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系。也就是说凡是显示在Inspector 中的属性都同时具有Serialize功能(序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来)。public 变量在没有加入任何Attribute的前提下,pu...

Win常见文件后缀名_太知的博客-程序员宝宝_win后缀是什么文件

Win常见文件后缀.py python文件.html html网页文件.css 样式文件.js javascript文件.png/jpg/jbeg 图形文件.ppt ppt文件.ppa 带有宏的ppt文件.doc word文件.ps1 powershell脚本文件.exe 可执行文件.xml 可扩展性语言编写的文件.xls excel文件.xlam 带有宏的excel文件.bat 批处理文件.iso 镜像文件.zip/rar 压缩文件.txt 文本文件.fon 字体文件

腾讯祭出大招VasSonic,让你的H5页面首屏秒开_tencent__open的博客-程序员宝宝

VasSonic成长历程前言2017.8.8 14时,SNG增值产品部Vas团队研发的轻量级高性能Hybrid框架VasSonic通过了公司最终审核,作为腾讯开源组件分享给大家。从当初立项优化页面加载速度,到不断摸索、优化,再到整理代码、文档,最终在Github上开源,并且在24小时内获取star数超过1600。我们非常高兴看到我们的成果收到这么多的关注,趁此机会,正好回顾一下VasSonic的成长

论文阅读 KGAT: Knowledge Graph Attention Network for Recommendation_mishidemudong的博客-程序员宝宝

在这里插入图片描述1. Motivation如何将side information和用户-物品二部图考虑在一起给用户提供准确、多样和可解释的推荐是非常有必要的。目前基于CF的方法并不能很好的对用户和物品的side information进行建模,这样就不可避免的面临数据稀疏性的问题。工业界的解决办法是使用监督学习模型,比如FM,NFM,wide&deep等方法去将用户物品的所有sid...

2020工商银行信息技术岗校招笔试经历_乱码IT的博客-程序员宝宝

工商银行-广东_笔试经验帖总体感受内容分两个单元(总时长:2.5小时)1.通用能力测试(限时:70分钟)2.综合知识(限时:80分钟)总结:若有情况,请告知,立删!总体感受笔试内容跟岗位关联性不大,大家不同岗考的可能完全就是一套卷子~速度很致命英语可能比较跟六级一个水准我自己学偏了,涉及内容很多,计算机只是非常少一部分基本单选,一点点多选,就这两种题型在线笔试、AI监考内容分两...

iOS 跳转APP:Web跳转APP,APP之间的跳转_abaodc2308的博客-程序员宝宝

iOS --- 通过openURL实现APP之间跳转并传递数据Web网页启动app及传参的方式转载于:https://www.cnblogs.com/xujiahui/p/6892683.html