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