크래시 오브 크라운 및 이미지 분석(2)

4484 단어 Python3OpenCV

하고 싶은 일



전회의 화상 해석의 계속입니다.
마지막: 크래시 오브 크라운 및 이미지 분석 (1)

지난번에는 스크린 샷 한 이미지의 배치를 정사각형으로 변형하여 필요한 배치 부분만의 정보를 추출했습니다. 이번은 그 화상으로부터 시설(시설의 종류의 분별은 묻지 않는다)이 위치하고 있는 매스눈의 정보를 꺼내려고 생각합니다.

1. 입력 이미지



마지막으로 다음과 같은 이미지를 얻을 수있었습니다.

이 이미지에서 어디의 매스에 시설이 있는지 판단하는 것은 어려울 것 같습니다 ...
어떻게 할까 생각했습니다만, 쿠라쿠라에는 벽만 표시시킬 수 있는 기능이 있습니다.
사진으로 말하면 이런 느낌

이 사진을 잘 보면 시설의 위치 부분이 진한 녹색으로되어 있음을 알 수 있습니다.
이 부분을 인식할 수 있으면 좋을 것이라고 생각했으므로, 이번에는 아래와 같은 화상을 입력 화상으로 합니다.


2. 시설 부분의 검출



진한 녹색 부분을 감지합니다.
코드는 다음과 같습니다.
import numpy as np
import matplotlib.pyplot as plt
import cv2


def main():
    # 入力画像の読み込み
    pictrue = 'reformat_pic/GAKU2020_wall_cut.png'
    img = cv2.imread(pictrue, cv2.IMREAD_COLOR)

    # 高さ,幅の取得
    height, width = img.shape[:2]
    img_resize = cv2.resize(img, 
                            dsize=(440, 440),
                            interpolation=cv2.INTER_LINEAR)

    # 濃い緑の抽出
    green_mask, green_masked_img = detect_darkgreen_color(img_resize)
    cv2.imwrite("./locate_facility_pic/GAKU2020_facilitylocate_original.png", green_mask)    


def detect_darkgreen_color(img):
    # HSV色空間に変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 緑色のHSVの値域1
    hsv_min = np.array([28, 64, 110])
    hsv_max = np.array([70,150,180])

    # 緑色領域のマスク(255:赤色、0:赤色以外)    
    mask = cv2.inRange(hsv, hsv_min, hsv_max)

    # マスキング処理
    masked_img = cv2.bitwise_and(img, img, mask=mask)

    return mask, masked_img


이렇게하면 다음 이미지가 얻어졌습니다.
흰색으로 표시된 부분이 시설의 위치를 ​​나타냅니다.
약간 노이즈가 신경이 쓰입니다만, 뭐 괜찮은 느낌으로 검출할 수 있습니다.


3. 시설의 위치 검출



이전의 처리로 시설의 대략적인 위치를 파악할 수 있었습니다.
여기에서는 매스 눈의 어디에 배치하고 있는지 검출할 수 있도록 합니다.
배치의 매스눈은 $44\times 44$로 알고 있으므로, 우선 이미지 사이즈를 $440\times 440$로 변경해, $1$매스가 $10\times10$픽셀이 되도록(듯이) 합니다. 그런 다음 $ 1 $ 매스마다 흰색 또는 검은 색인지 여부를 계산하고 흰색이 많으면 $ 1 $, 검은 색이 많으면 $ 0 $를 반환합니다. 이 때 노이즈의 영향을 억제하기 위해 조사 영역은 매스 눈의 내부에서만 실시합니다. 이렇게 함으로써 시설이 있다고 판단된 부분과 그렇지 않은 부분을 나눕니다. 코드는 다음과 같습니다.
def main():
    # 入力画像の読み込み
    pictrue = 'reformat_pic/GAKU2020_wall_cut.png'
    img = cv2.imread(pictrue, cv2.IMREAD_COLOR)

    # 高さ,幅の取得
    height, width = img.shape[:2]
    img_resize = cv2.resize(img, 
                            dsize=(440, 440),
                            interpolation=cv2.INTER_LINEAR)

    # 濃い緑の抽出
    green_mask, green_masked_img = detect_darkgreen_color(img_resize)
    cv2.imwrite("./locate_facility_pic/GAKU2020_facilitylocate_original.png", green_mask)    

    # 施設の検出
    mask = facility_mask(green_mask)

    # 図の表示
    draw_map(mask)


def facility_mask(img):
    # 1マスのサイズ
    h_size, w_size = 10, 10

    # 全てのマスの情報を記憶
    mask = []
    for h in range(44):
        for w in range(44):
            w2 = w * w_size
            h2 = h * h_size
            c = img[h2 : h2+h_size, w2 : w2+w_size]

       # 画像のズレ,ノイズの影響の低減

            c = c[2:-3, 2:-3]

            if np.mean(c) > 127:
                mask.append(1)
            else:
                mask.append(0)

    mask = np.array(mask)
    mask = mask.reshape([44, 44])
    return mask

얻은 이미지는 여기입니다. 색이 반전하고 있습니다만, 흑색의 부분이 시설의 위치를 ​​나타내고 있습니다. 입력 이미지와 비교하면 원하는 부분의 색이 확실히 검게되어 있음을 알 수 있습니다.


4. 마지막으로



벽만의 이미지로부터 시설의 위치를 ​​인식할 수 있었습니다. 드디어 어느 시설이 어디에 있는지 인식할 수 있도록 해 가고 싶습니다만, 다음번은 그를 위한 정의에 대해 생각해 가고 싶습니다.

이번에는 여기까지

좋은 웹페이지 즐겨찾기