목표 화 처리 마스터! 화상 처리 100개 노크 했던 Part2:오쓰의 2치화

이것을하고 있습니다.
htps : // 이 m / 요요 요 / ms / 2에 f53f47f87dcf5d1에 14

공부하면서 노크의 속도가 느립니다.

Q4:오쓰의 2치화



오쓰의 2 치화는 뭐야



우선, 2치화에도 여러가지? ? ? 에서 시작입니다.
우선 여러 사람이 정리해 주시는 것을 읽었습니다.
  • 개요가 가장 이해하기 쉬운 기사
  • 그레스케와의 비교 이미지가 좋았습니다.
  • 해설·실장 모두 알기 쉬웠다
  • 다양한 구현이 비교 될 수 있습니다.

  • 여기에서 이해한 오쓰의 2치화란

    이미지에 밝은 이미지 사이트와 어두운 사이트의 두 클래스가 있다고 가정하여 가장 높은 클래스의 분리도를 갖도록 임계 값을 자동으로 결정하는 이진 필터
    그레이 스케일 이미지를 입력으로 사용하고 히스토그램에서 이진화 임계 값을 자동으로 결정합니다.

    절차로서는 다음과 같이 될 것이라고 이해했습니다.
  • 먼저 그레스케 이미지 준비
  • 임계 값을 결정하십시오
  • 각 클래스의 픽셀 수를 구합니다
  • 임계 값 아래의 클래스의 평균 및 분산 (의 분자)을 찾습니다
  • 임계 값 위의 클래스의 평균 및 분산 (의 분자)을 찾습니다
  • 클래스 간의 분산을 요구한다
  • 클래스 간의 분산의 최대를 알 때까지 2-6 루프

  • 결국 무엇이 좋을까



    밝은 부분과 어두운 부분이 뚜렷하고 히스토그램에 계곡이 있는 것 같은 이미지에 사용하면 좋은 방법인 것 같네요. 비교해 보겠습니다.

    일단 이모리 씨에서 과제를 해본다.
    import cv2
    import numpy as np 
    
    # 大津の2値化
    def otsu_binarization(img):
        max_sigma = 0
        max_t = 0
        H, W = img.shape
        # tきめるループ
        for t in range(1, 256):
            v0 = Y[np.where(Y < t)]
            m0 = np.mean(v0) if len(v0) > 0 else 0.
            w0 = len(v0) / (H * W)
            v1 = Y[np.where(Y >= t)]
            m1 = np.mean(v1) if len(v1) > 0 else 0.
            w1 = len(v1) / (H * W)
            sigma = w0 * w1 * ((m0 - m1) ** 2)
            if sigma > max_sigma:
                max_sigma = sigma
                max_t = t
    
        print("threshold >>", max_t)
        th = max_t
        Y[Y < th] = 0
        Y[Y >= th] = 255
        return Y
    
    img = cv2.imread("imori.jpg")
    #グレスケ
    # 値だけ渡したい
    r = img[:,:,2].copy()
    g = img[:,:,1].copy()
    b = img[:,:,0].copy()
    
    #Y = 0.2126 R + 0.7152 G + 0.0722 Bより
    Y = 0.2126*r + 0.7152*g + 0.0722*b
    #整数に型変換---画像は整数値しか取らない
    Y = Y.astype(np.uint8)
    
    out = otsu_binarization(Y)
    
    cv2.imwrite("anspic_q4.jpg", out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    실행 결과
    python q4.py 
    threshold >> 127
    



    다음에 비교 검토해 가고 싶습니다.
    내 프로필 사진 사용합니다. (크기로 인해 압축되어 트리밍)


    히스토그램을 찾아보십시오. 참고로 써 주시고 있는 프로그램대로이므로 할애합니다.

    그레이 스케일 화상, Q3의 2치화, 오쓰의 2치화로 비교해 본다

    그레스케


    Q3의 2치화


    오쓰의 2치화

    threshold >> 125
    

    ... 이미지가 좋지 않았다!

    덤:출,출~! ! matplotlib의 NO BACKEND ERROR



    뭔가 전에도 직면한 적이 있었는데, 처음 히스토그램을 그리려고 하면 backend error라는 에러가 나와 그려주지 못했습니다.
    이것은 말 그대로 백엔드가 맞지 않기 때문에 안되는 것 같은 에러로, matplotlibrc내에 쓰여져 있는 백엔드를 바꾸어 주면 움직입니다.
    하지만 이번 도커 환경이므로 일단 참고까지 써 둡니다.

    어쩌면 여기에 있습니다. 없으면 find에서 찾아주세요.
    /usr/local/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
    

    에디터에서 열어보면 비교적 초반에 백엔드에 대해 쓰여지는 부분이 있습니다.
    (前略)
    ## ***************************************************************************
    ## * BACKENDS                                                                *
    ## ***************************************************************************
    ## The default backend.  If you omit this parameter, the first working
    ## backend from the following list is used:
    ##     MacOSX Qt5Agg Qt4Agg Gtk3Agg TkAgg WxAgg Agg
    ## Other choices include:
    ##     Qt5Cairo Qt4Cairo GTK3Cairo TkCairo WxCairo Cairo Wx
    ##     PS PDF SVG Template
    ## You can also deploy your own backend outside of matplotlib by referring to
    ## the module name (which must be in the PYTHONPATH) as 'module://my_backend'.
    #backend : Agg
    (後略)
    

    참고와 상기 코멘트가 되어 변경합니다
    전 변경했을 때 TkAgg로 한 기억이 있으므로 코멘트 아웃 지워 다음과 같이 변경
    backend : TkAgg
    

    실행하려고하면 오류가 발생합니다.
    Traceback (most recent call last):
      File "hist.py", line 2, in <module>
        import matplotlib.pyplot as plt
      File "/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2282, in <module>
        switch_backend(rcParams["backend"])
      File "/usr/local/lib/python3.7/site-packages/matplotlib/pyplot.py", line 221, in switch_backend
        backend_mod = importlib.import_module(backend_name)
      File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "/usr/local/lib/python3.7/site-packages/matplotlib/backends/backend_tkagg.py", line 1, in <module>
        from . import _backend_tk
      File "/usr/local/lib/python3.7/site-packages/matplotlib/backends/_backend_tk.py", line 6, in <module>
        import tkinter as tk
      File "/usr/local/lib/python3.7/tkinter/__init__.py", line 36, in <module>
        import _tkinter # If this fails your Python may not be configured for Tk
    ImportError: libtk8.6.so: cannot open shared object file: No such file or directory
    
    

    tk가 없어서 화가 나서 넣어
    apt install python3-tk
    

    그리고 프로그램 실행


    제대로 그릴 수있었습니다!

    다른 백엔드 사용해도 아무것도 없어! 라고 화가 난다고 생각하므로, 매번 패키지 넣으면 좋다고 생각합니다. 이럴 때 로컬 환경 더러움 없는 docker 엄청 편리

    결론



    내 맥은 열심히 오쓰의 2치화를 「대각에 피인가」로 변환합니다. 멋지다
    이 페이스로 하고 있으면 평생 끝나는 생각이 든다!

    좋은 웹페이지 즐겨찾기