车牌检测预处理方案

 1.sobel 检测

Sobel 检测


def preprocess(gray):
	# # 直方图均衡化
	# equ = cv2.equalizeHist(gray)
	# 高斯平滑
	gaussian = cv2.GaussianBlur(gray, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
	# 中值滤波
	median = cv2.medianBlur(gaussian, 5)
	# Sobel算子,X方向求梯度
	sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0, ksize = 3)
	# 二值化
	#threshold,imgOtsu = cv2.threshold(sobel,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
	ret, binary = cv2.threshold(sobel, 0, 255, cv2.THRESH_BINARY+ cv2.THRESH_OTSU)
	# 膨胀和腐蚀操作的核函数
	element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
	element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
	# 膨胀一次,让轮廓突出
	dilation = cv2.dilate(binary, element2, iterations = 1)
	# 腐蚀一次,去掉细节
	erosion = cv2.erode(dilation, element1, iterations = 1)
	# 再次膨胀,让轮廓明显一些
	dilation2 = cv2.dilate(erosion, element2,iterations = 3)
#	cv2.imshow('dilation2',dilation2)
#	cv2.waitKey(0)
	return dilation2


def findPlateNumberRegion(img):
	region = []
	# 查找轮廓
	img,contours,hierarchy = cv2.findContours(img,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  #  contours,hierarchy = cv2.findContours(img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
	# 筛选面积小的
	for i in range(len(contours)):
		cnt = contours[i]
		# 计算该轮廓的面积
		area = cv2.contourArea(cnt)

		# 面积小的都筛选掉
		if (area < 144):
			continue

		# (x,y)左上角的点  w宽h高
		x,y,w,h=cv2.boundingRect(cnt)

		# 车牌正常情况下长高比在2.7-5之间
		ratio =float(w) / float(h)
		#print (ratio)
		if (ratio > 5 or ratio < 2):
			continue
		region.append([x,y,x+w,y+h])

	return region



def sobelDetect(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dilation = preprocess(gray)
    rectangles =findPlateNumberRegion(dilation)
    return rectangles

2.色彩掩模位运算

#颜色定位
def colorDetect(img):

	hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
	#高斯模糊
	img = cv2.GaussianBlur(img,(5,5),0)
	imgRs = []
	#蓝色
	lower=np.array([100,50,50])
	upper=np.array([140,255,255])
	mask=cv2.inRange(hsv,lower,upper)
	# 对原图像和掩模进行位运算
	res=cv2.bitwise_and(img,img,mask=mask)
	gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
	#二值化
	ret,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
	#闭操作
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))

	eroded = cv2.erode(thresh1,kernel)
	eroded = cv2.erode(eroded,kernel)
	eroded = cv2.erode(eroded,kernel)
	eroded = cv2.erode(eroded,kernel)

	dilated = cv2.dilate(eroded,kernel)
	dilated = cv2.dilate(dilated,kernel)
	dilated = cv2.dilate(dilated,kernel)
	dilated = cv2.dilate(dilated,kernel)

	#closed = cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)
	mat,cnts, _ = cv2.findContours(dilated,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
	for cnt in cnts:
		x,y,w,h = cv2.boundingRect(cnt)
		if(w<12 or h < 12 or w>h < 1.0):
			continue
		if(w/h>5 or w/h<2):
			continue
		imgRs.append([x,y,x+w,y+h])
	#黄色
	lower=np.array([15,50,50])
	upper=np.array([40,255,255])
	# 根据阈值构建掩模
	mask=cv2.inRange(hsv,lower,upper)
	# 对原图像和掩模进行位运算
	res=cv2.bitwise_and(img,img,mask=mask)
	gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
	#二值化
	ret,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
	#闭操作
	kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
	eroded = cv2.erode(thresh1,kernel)
	eroded = cv2.erode(eroded,kernel)
	eroded = cv2.erode(eroded,kernel)
	eroded = cv2.erode(eroded,kernel)

	dilated = cv2.dilate(eroded,kernel)
	dilated = cv2.dilate(dilated,kernel)
	dilated = cv2.dilate(dilated,kernel)
	dilated = cv2.dilate(dilated,kernel)
	mat,cnts, _ = cv2.findContours(dilated.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
	for cnt in cnts:
		rect = cv2.minAreaRect(cnt)
		x,y,w,h = cv2.boundingRect(cnt)
		if(w<12 or h < 12 or w>h < 1.0):
			continue
		if(w/h>5 or w/h<2):
			continue
		imgRs.append([x,y,x+w,y+h])

	return imgRs

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NineDays66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值