数字图像处理:形态学HMT 目标检测

先回顾一下膨胀腐蚀的定义

dilate 膨胀

在这里插入图片描述
膨胀过程:B首先做关于原点的映射B^,然后平移x。A被B的膨胀是被所有x平移后与A至少有一个非零公共元素。
在这里插入图片描述

erode 腐蚀

在这里插入图片描述
也就是说A被B的腐蚀的结果为所有使B被x平移后包含于A的点x的集合。
在这里插入图片描述
注意:图中中心点也有个点,其实由此可以推出HMT:
当把三角形看做A时把上图A则为AcA^c,上图结构元B则是B1的补集B2,则上图可以表示为
在这里插入图片描述,而
在这里插入图片描述
的结果中A的中心点保留,则两个交集为B在A中的匹配,记为:
在这里插入图片描述

HMT

这幅图更为清楚:
在这里插入图片描述
让每个图形的原点位于它的重心。如果用一个小窗口W包含X,X关于W的本地背景是图(b)中的集合差(W-X)。图©为集合A的补。图(d)示出A被X腐蚀的结果。A被X的腐蚀在X中只有X的原点,这样X才能完全包含于A。图(e)表示集合A的补被本地背景集合(W-X)的腐蚀;外围阴影区域也是腐蚀结果的一部分。

实现

#!/usr/bin/env python 
# -*- coding: utf-8 -*-
# @Time    : 2019/11/23 12:39
# @Author  : ZhigangJiang
# @File    : mian.py
# @Software: PyCharm
# @Description:hit and miss translate

import cv2
import matplotlib.pyplot as plt
import numpy as np


def plt_show_opcv(title, image):
    if image.shape.__len__() == 3:
        plt.imshow(image[:, :, ::-1])
    else:
        plt.imshow(image, cmap='gray')
    plt.title(title)
    plt.show()


def pme(titles, images, rc=None):
    row = None
    col = None
    if rc is None:
        length = titles.__len__()
        row = int(np.sqrt(length))
        col = int(length / row)
        if length - row - col > 0:
            row += 1
    else:
        row = rc[0]
        col = rc[1]

    for i in range(titles.__len__()):
        plt.subplot(row, col, i + 1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([i])
    plt.show()


def hmt(a, b):
    b1 = ~b
    b2 = b
    a1 = ~a
    a2 = a
    pme(["b1", "b2", "x1", "x2"],
        [b1, b2, a1, a2])
    x1_erode_b1 = cv2.erode(a1, b1)
    x2_erode_b2 = cv2.erode(a2, b2)
    plt_show_opcv("a1_erode_b1", x1_erode_b1)
    plt_show_opcv("a1_erode_b1_", cv2.dilate(x1_erode_b1, np.ones((10, 10), np.uint8)))
    plt_show_opcv("a2_erode_b2", x2_erode_b2)
    plt_show_opcv("a2_erode_b2_", cv2.dilate(x2_erode_b2, np.ones((10, 10), np.uint8)))
    r = cv2.bitwise_and(x1_erode_b1, x2_erode_b2)
    return r


image_X = cv2.imread("images/X.png", 0)
image_B = cv2.imread("images/B_triangle.png", 0)

ret1, image_X = cv2.threshold(image_X, 127, 255, cv2.THRESH_BINARY)
ret2, image_B = cv2.threshold(image_B, 127, 255, cv2.THRESH_BINARY)

plt_show_opcv("X", image_X)
plt_show_opcv("B", image_B)
re = hmt(image_X, image_B)

targets = []
for i in range(re.shape[0]):
    for j in range(re.shape[1]):
        if re[i][j]:
            targets.append((j, i))
            print(i, j)

for target in targets:
    image_X = cv2.drawMarker(image_X, target, 125, markerType=cv2.MARKER_CROSS, markerSize=20, thickness=3)
plt_show_opcv("re", image_X)

结果

在这里插入图片描述
三角形只击中两个,说明左下角的被影响到了,说明这种方法识别击中的是与结构元完全相同的图像
在这里插入图片描述
复杂图形
在这里插入图片描述
中文
在这里插入图片描述
字母识别
在这里插入图片描述
单词识别,左下角learning没有被识别到,因为在截图产生了噪声,虽然进行了阈值处理,但是还是有误差。
所以,用这种识别单词只是在理想情况下可行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章