이미지를 이진화 처리한다. 또한 두 영역 사이의 최단 거리를 계산할 수 있습니다 (Ver1.1).

소개



이번은, 전회 기사 2영역간의 최단 거리를 요구하는 프로그램에 대해서, 수정을 실시한 내용입니다.
이전에는, 화상 사이즈를 그대로 처리하고 있었던 것과, 반드시 2 영역간의 최단 거리를 구할 수 없었던 과제가 있었습니다.

이미지를 이진화 처리한다. 또한 두 영역 사이의 최단 거리를 계산할 수 있습니다.
htps : // 코 m / 후미오 에이 씨 / ms / 05, 6506, 8c88d89 49

요점은 아래와 같습니다.
  • 이미지를 줄이고 처리하기 쉽습니다
  • 모든 영역을 이진화
  • 영역 사이의 거리를 결정하고 거기에서 최단 거리를 찾습니다

  • 이미지를 줄이고 처리하기 쉽습니다.



    이번은 이쪽의 불고기 화상을 이용해 두 개의 고기의 최단 거리를 요구하고 싶습니다.



    이전의 기사에서는 그대로의 화상 사이즈로 처리를 실시하고 있었습니다. 이 경우, 화상 사이즈가 커지면 영역을 둘러싸는 처리가 무거워져 버립니다. 따라서 이미지 크기를 줄이고 처리하기 쉽습니다.

    이번에는 폭을 300픽셀로 고정하여 같은 종횡비(폭:높이비)로 축소시킵니다.

    img.ipynb
    
    def scale_to_width(img, width):
        scale = width / img.shape[1]
        return cv2.resize(img, dsize=None, fx=scale, fy=scale)
    
    img = scale_to_width(img, 300)#300ピクセルに固定
    

    이미지를 이진화



    다음으로, 이진화에 의해 고기 부분만을 색을 추출하고 싶습니다. cv2.inRange 메소드에 의해 특정의 색을 흰색, 특정의 색을 검정으로 합니다.

    img.ipynb
    import numpy as np
    bgrLower = np.array([0, 0, 130])    # 抽出する色の下限(BGR)
    bgrUpper = np.array([120,120, 255])    # 抽出する色の上限(BGR)
    img_mask = cv2.inRange(img, bgrLower, bgrUpper) 
    fig = plt.figure(figsize=(8,8))
    ax = fig.add_subplot(1,1,1)
    ax.imshow(img_mask)
    ax.axis("off")
    



    굉장히 고기만 하얗게 표시시킬 수 있었습니다. 다만, 이것은 원래 이미지의 그늘에 의해 수동으로 추출하는 색을 조정할 필요가 있기 때문에 번거롭게 됩니다. 이 표시시키고 싶은 색만을 추출해 이진화시키는 수법은, 별도 정리하고 싶습니다.

    영역 사이의 거리를 구하고 거기에서 최단 거리를 찾습니다.



      다음에, 영역간의 거리를 구합니다. 전회는, 각 영역의 x좌표 최대치/최소치를 취하는 좌표를 취득시키고 나서 거리를 구했습니다. 그러나, 그 구하는 방법은 반드시 최단 거리를 취할 수 있는 것은 아닙니다(하우 그림의 예).



    대책으로서는, 각 영역을 둘러싸는 점통의 조합에 의한 거리를 모두 구해, 그것이 최소치를 취하는 좌표를 취득하는 것입니다.
    이 때, 화상 사이즈를 조정하지 않으면 상당히 계산수가 커지기 때문에, 이전에 나타낸 화상 사이즈를 축소화시키는 것이 효과적입니다.

    img.ipynb
    import numpy as np
    dd=np.array([300])#空白の配列だとif min(dd)> dでエラーが出るため
    for i in range(len(contours[0])):
        x3 = contours[0][i][0][0]
        y3 = contours[0][i][0][1]
        for ii in range (len(contours[1])):
            x4 = contours[1][ii][0][0]
            y4 = contours[1][ii][0][1]
            d = get_distance(x3, y3, x4, y4)
    
            if min(dd) > d:
                x3min  =x3
                y3min  =y3
                x4min  =x4
                y4min  =y4
            dd = np.append(dd,d)
    
    
    26.248809496813376
    



    무사히 최단 거리를 구할 수 있었습니다.

    결론



    이미지 파일을 줄이는 것만으로 처리가 꽤 빨라졌습니다. 한편, 색의 추출은 수동으로 실시하기 때문에, 여기는 개선의 여지가 있습니다. 2치화하고 싶은 곳만 자유자재로 나눌 수 있는 개조를 검토하고 싶습니다.

    간단하지만 개선했으므로, 아래에 격납하고 있습니다 (날짜가 새로운 것이 버전 업 한 것입니다).

    좋은 웹페이지 즐겨찾기