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