python-opencv license plate detection

Load the image and convert it to grayscale

import cv2

#加载图片
img=cv2.imread('./1.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

cv2.imshow('img',gray_img)
cv2.waitKey()

Gaussian filtering (smoothing)

import cv2
import numpy as np
#加载图片
img=cv2.imread('./1.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)

cv2.imshow('img',np.hstack([gray_img,blur_img]))
cv2.waitKey()

Boundary extraction

import cv2
import numpy as np
#加载图片
img=cv2.imread('./1.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)
# 边界提取
#sobel边界提取
sobel_img=cv2.Sobel(blur_img,-1,1,0,ksize=3)
#canny边界提取
canny=cv2.Canny(blur_img,135,225)


cv2.imshow('img',np.hstack([gray_img,blur_img,sobel_img,canny]))
cv2.waitKey()

 Binarization

import cv2
import numpy as np
#加载图片
img=cv2.imread('./1.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)
# 边界提取
#sobel边界提取
# sobel_img=cv2.Sobel(blur_img,-1,1,0,ksize=3)
#canny边界提取
canny=cv2.Canny(blur_img,135,225)

#二值化处理
ret,binary_img=cv2.threshold(canny,127,255,cv2.THRESH_BINARY)

cv2.imshow('img',np.hstack([gray_img,blur_img,canny,binary_img]))
cv2.waitKey()

 Morphological operation

import cv2
import numpy as np
#加载图片
img=cv2.imread('./1.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)
# 边界提取
#sobel边界提取
# sobel_img=cv2.Sobel(blur_img,-1,1,0,ksize=3)
#canny边界提取
canny=cv2.Canny(blur_img,135,225)

#二值化处理
ret,binary_img=cv2.threshold(canny,127,255,cv2.THRESH_BINARY)

#形态学操作
"""
首先进行闭运算将车牌数字部分连接,然后再进行开运算将不是块状的或是较小的部分去掉
"""
#闭运算
kernel=np.ones((5,10),np.uint8)
close_img=cv2.morphologyEx(binary_img,cv2.MORPH_CLOSE,kernel)
open_img=cv2.morphologyEx(close_img,cv2.MORPH_OPEN,kernel)
# 由于部分图像得到的轮廓边缘不整齐,因此再进行一次膨胀操作
dilation_img = cv2.dilate(open_img, np.ones(shape=[5,5],dtype=np.uint8), iterations=3)

cv2.imshow('img',np.hstack([close_img,open_img,dilation_img]))
cv2.waitKey()

get profile

import cv2
import numpy as np
#加载图片
img=cv2.imread('./2.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)
# 边界提取
#sobel边界提取
# sobel_img=cv2.Sobel(blur_img,-1,1,0,ksize=3)
#canny边界提取
canny=cv2.Canny(blur_img,135,225)

#二值化处理
ret,binary_img=cv2.threshold(canny,127,255,cv2.THRESH_BINARY)

#形态学操作
"""
首先进行闭运算将车牌数字部分连接,然后再进行开运算将不是块状的或是较小的部分去掉
"""
#闭运算
kernel=np.ones((5,10),np.uint8)
close_img=cv2.morphologyEx(binary_img,cv2.MORPH_CLOSE,kernel)
open_img=cv2.morphologyEx(close_img,cv2.MORPH_OPEN,kernel)
# 由于部分图像得到的轮廓边缘不整齐,因此再进行一次膨胀操作
dilation_img = cv2.dilate(open_img, np.ones(shape=[5,5],dtype=np.uint8), iterations=3)

#获取轮廓
contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rectangles = []
for c in contours:
    x = []
    y = []
    for point in c:
        y.append(point[0][1])
        x.append(point[0][0])
    r = [min(x), min(y), max(x), max(y)]
    rectangles.append(r)
areas=[]
for hh in rectangles:
    area=(hh[2]-hh[0])*(hh[3]-hh[1])
    areas.append(area)
    # print(area)

max=np.array(areas).argsort()[-1] ##argsort返回的是从小到大的索引值
#绘制最大的轮廓
cv2.rectangle(img,(rectangles[max][0],rectangles[max][1]),(rectangles[max][2],rectangles[max][3]),(0,255,2),2)
cv2.imshow('img', img)
cv2.waitKey()

 

 

full code

import cv2
import numpy as np
#加载图片
img=cv2.imread('./2.jpg')
#图片预处理
"""
图片预处理:包括灰度处理,高斯滤波,canny提取边界,图像二值化
"""
#灰度处理
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#高斯平滑
blur_img=cv2.GaussianBlur(gray_img,ksize=(3,3),sigmaX=0,sigmaY=0)
# 边界提取
#sobel边界提取
# sobel_img=cv2.Sobel(blur_img,-1,1,0,ksize=3)
#canny边界提取
canny=cv2.Canny(blur_img,135,225)

#二值化处理
ret,binary_img=cv2.threshold(canny,127,255,cv2.THRESH_BINARY)

#形态学操作
"""
首先进行闭运算将车牌数字部分连接,然后再进行开运算将不是块状的或是较小的部分去掉
"""
#闭运算
kernel=np.ones((5,10),np.uint8)
close_img=cv2.morphologyEx(binary_img,cv2.MORPH_CLOSE,kernel)
open_img=cv2.morphologyEx(close_img,cv2.MORPH_OPEN,kernel)
# 由于部分图像得到的轮廓边缘不整齐,因此再进行一次膨胀操作
dilation_img = cv2.dilate(open_img, np.ones(shape=[5,5],dtype=np.uint8), iterations=3)

#获取轮廓
contours, hierarchy = cv2.findContours(dilation_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rectangles = []
for c in contours:
    x = []
    y = []
    for point in c:
        y.append(point[0][1])
        x.append(point[0][0])
    r = [min(x), min(y), max(x), max(y)]
    rectangles.append(r)
areas=[]
for hh in rectangles:
    area=(hh[2]-hh[0])*(hh[3]-hh[1])
    areas.append(area)
    # print(area)
    # cv2.rectangle(img, (hh[0],hh[1]), (hh[2], hh[3]), (0, 255, 2),
    #               2)
    # cv2.imshow('img', img)
    # cv2.waitKey()

max=np.array(areas).argsort()[-1] ##argsort返回的是从小到大的索引值
#绘制最大的轮廓
cv2.rectangle(img,(rectangles[max][0],rectangles[max][1]),(rectangles[max][2],rectangles[max][3]),(0,255,2),2)
cv2.imshow('img', img)
cv2.waitKey()
dist_r = []
max_mean = 0

block = img[rectangles[max][1]:rectangles[max][3], rectangles[max][0]:rectangles[max][2]]
cv2.imshow('img',block)
cv2.waitKey()

""""
进一步调整车牌的位置,不想弄了。
"""

Guess you like

Origin blog.csdn.net/qq_40107571/article/details/128666407#comments_27014241