基于传统几何方法的十字路口检测

复现导师发我的一篇毕业论文的后半部分。其实是挺过时的东西了,不过貌似做的人很少,复现出来结果也不错,挺有想法的一篇文章。
论文题目:《基于航拍图像的目标检测系统设计与实现》
Github:传送门

系统总流程

在这里插入图片描述
大致流程是将红外图像预处理,包括灰度化、直方图均衡化、开闭运算、边缘提取。然后利用霍夫变换直线检测,根据直线的交点和相交角度来初步定位十字路口,其中用到了交点的聚类和mean-shift开窗迭代找重心。最后一步是十字路口的二次判定,也是文章的精华,利用改进的CCDC方法,统计矩形簇上的像素点,根据这些点的统计特征来判定。
实际复现时,对此程序做了些简化修改,效果更好。

图像预处理

读入图片、灰度化、直方图均衡化、二值化

原图:
在这里插入图片描述

import cv2
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
from matplotlib import pyplot as plt
img = cv2.imread("1.jpg", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.equalizeHist(gray)
ret, img_thresh = cv2.threshold(dst, 203, 255, cv2.THRESH_BINARY )
#cv2.imwrite("img_thresh.jpg",img_thresh)

二值化图:
在这里插入图片描述

开操作-先腐蚀后膨胀

这里是为了去除航拍图像中间的光标,并使道路边缘更平滑。

Matrix = np.ones((3, 3), np.uint8)    
img_edge1 = cv2.erode(img_thresh, Matrix)
#cv2.imshow('erode.jpg',img_edge1 )
Matrix2 = np.ones((7, 7), np.uint8)    
img_edge2 = cv2.dilate(img_edge1, Matrix2)
#cv2.imwrite('dilate.jpg',img_edge2)

在这里插入图片描述

Hough变换

Canny边缘检测

edges = cv2.Canny(img_edge2,100,200,apertureSize = 7)
#cv2.imwrite('edges.jpg',edges)

在这里插入图片描述

Hough直线检测

这里做了一些修改,原文中所做的检测是检测直线上的点,最后记录线段,然后再根据线段扩充成直线求交点。个人觉得这样是无意义的,故直接采用直线检测。

"""
#作者的方法
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength=70,maxLineGap=80)
lines1 = lines[:,0,:]#提取为二维
print(len(lines1))
for x1,y1,x2,y2 in lines1[:]: 
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
    #cv2.line(edges,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('line1.jpg
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值