ホームページ  >  記事  >  バックエンド開発  >  Python はナンバー プレートの位置決めとセグメンテーションを実装します

Python はナンバー プレートの位置決めとセグメンテーションを実装します

PHPz
PHPzオリジナル
2018-05-24 09:25:047205ブラウズ

具体的な手順

1. 収集したカラーナンバープレート画像をグレースケール画像に変換します
2. グレースケール画像にガウススムージングを使用し、それに対してミディアムストレートフィルタリングを実行します
3. ソーベルオペレーターを使用して画像処理を実行します

4. バイナリ画像に対して侵食、拡張、開閉操作の形態学的組み合わせ変換を実行します
5. 形態学的に変換された画像に対して輪郭検索を実行し、アスペクト比に従ってナンバープレートを抽出します

< ;!-- 詳細 - ->

コード実装

画像グレースケール

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ガウス平滑化、メディアンフィルタリング

gaussian = cv2.GaussianBlur(gray, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
median = cv2.medianBlur(gaussian, 5)
Python はナンバー プレートの位置決めとセグメンテーションを実装します

Python はナンバー プレートの位置決めとセグメンテーションを実装します

ソーベルエッジ検出

sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0,  ksize = 3)
Python はナンバー プレートの位置決めとセグメンテーションを実装します

二値化

ret, binary = cv2.threshold(sobel, 170, 255, cv2.THRESH_BINARY)

Python はナンバー プレートの位置決めとセグメンテーションを実装します

は形態学的を実行します2値化画像に対してエロージョン、エキスパンド、オープニング操作、クロージング操作の組み合わせ変換

# 膨胀和腐蚀操作的核函数
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (8, 6))
# 膨胀一次,让轮廓突出
dilation = cv2.dilate(binary, element2, iterations = 1)
# 腐蚀一次,去掉细节
erosion = cv2.erode(dilation, element1, iterations = 1)
# 再次膨胀,让轮廓明显一些
dilation2 = cv2.dilate(erosion, element2,iterations = 3)

Python はナンバー プレートの位置決めとセグメンテーションを実装します

ナンバープレートのアスペクト比からナンバープレートを抽出

1に従って、形態学的に変換された画像に対して輪郭探索を実行します. ナンバープレートの領域を見つけます

def findPlateNumberRegion(img):
    region = []
    # 查找轮廓
    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 < 2000):
            continue

        # 轮廓近似,作用很小
        epsilon = 0.001 * cv2.arcLength(cnt,True)
        approx = cv2.approxPolyDP(cnt, epsilon, True)

        # 找到最小的矩形,该矩形可能有方向
        rect = cv2.minAreaRect(cnt)
        print "rect is: "
        print rect

        # box是四个点的坐标
        box = cv2.cv.BoxPoints(rect)
        box = np.int0(box)

        # 计算高和宽
        height = abs(box[0][1] - box[2][1])
        width = abs(box[0][0] - box[2][0])

        # 车牌正常情况下长高比在2.7-5之间
        ratio =float(width) / float(height)
        if (ratio > 5 or ratio < 2):
            continue

        region.append(box)

    return region

2. 緑色の線を使用してナンバープレートの領域を描き、ナンバープレートを切り取ります

Python はナンバー プレートの位置決めとセグメンテーションを実装します

Python はナンバー プレートの位置決めとセグメンテーションを実装します

以上がPython はナンバー プレートの位置決めとセグメンテーションを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。