대진2치화 넘치는 문제와 대책

개시하다


대진의 이치화는 이미지의 이치화 시 한도값을 자동으로 결정하는 알고리즘이다.OpenCV 등의 프로그램 라이브러리에서 구현됐지만, 파이썬 설치를 찾았기 때문에 만져봤어요.제목에 문제가 있지만, 아마도 나의 운행 환경이 좋지 않아서 일어난 것 같다.

코드


코드 자체는 내가 쓴 것이 아니라 다른 사람이 쓴 블로그다.인용
ots.py
#大津の二値化(引数のgrayはグレースケール画像)
def threshold_otsu(gray, min_value=0, max_value=255):

    # ヒストグラムの算出
    hist = [np.sum(gray == i) for i in range(256)]

    s_max = (0,-10)

    for th in range(256):

        # クラス1とクラス2の画素数を計算
        n1 = sum(hist[:th])
        n2 = sum(hist[th:])

        # クラス1とクラス2の画素値の平均を計算
        if n1 == 0 : mu1 = 0
        else : mu1 = sum([i * hist[i] for i in range(0,th)]) / n1   
        if n2 == 0 : mu2 = 0
        else : mu2 = sum([i * hist[i] for i in range(th, 256)]) / n2

        # クラス間分散の分子を計算
        s = n1 * n2 * (mu1 - mu2) ** 2

        # クラス間分散の分子が最大のとき、クラス間分散の分子と閾値を記録
        if s > s_max[1]:
            s_max = (th, s)

    # クラス間分散が最大のときの閾値を取得
    t = s_max[0]

    # 算出した閾値で二値化処理
    gray[gray < t] = min_value
    gray[gray >= t] = max_value

    return gray

문제.


아래 사진을 양극화할 때 넘치는 경고가 나온다.
[1]
RuntimeWarning: overflow encountered in long_scalars
  s = n1 * n2 * ((mu1 - mu2) ** 2)
이때 임계값은 137로 OpenCV와 대진2치화할 때 얻은 78분리이다.

발생 원인


n1과 n2에 type(n1), type(n2)을 실행할 때.int32'의 결과.따라서 계산 결과가 int32형의 범위(-247483648~214748483647)를 넘어섰다고 볼 수 있다.

대책


나는 두 가지 대책을 고려했다.첫째, n1과 n2의 유형은flat형이다.아래와 같이 1행을 추가하면hist의 유형이 변하고 그 결과 n1과 n2의 유형도 변한다.
# ヒストグラムの算出
hist = [np.sum(gray == i) for i in range(256)]
hist = np.array(hist, dtype=np.float64)
둘째, 로그를 사용합니다.s의 상대적인 크기 비례값 자체가 더 중요하기 때문에 s의 양쪽에서 로그를 취하고 오른쪽을 분해한다(로그를 취한 결과는flat형).내용 1과 감의 경우를 제외하고 로그를 뽑는 순서도 바뀌지 않는다.
import math
...

# クラス間分散の分子を計算
#s = float(n1 * n2 * ((mu1 - mu2) ** 2))

if n1 == 0 or n2 == 0:
    continue
if mu2 >= mu1:
    s = math.log(n1)+math.log(n2)+2*math.log(mu2-mu1)
elif mu1 < mu2:
    s = math.log(n1)+math.log(n2)+2*math.log(mu1-mu2)
...
잘 해결됐습니다.다음 사진은 프로그램이 실행된 결과입니다.

또한 한도값의 값도 79(OpenCV는 한도값 이하, 이 프로그램은 한도값 이하에서 이치화)에 달해 프로그래밍이 정상적으로 작동하는지 확인할 수 있다.
마지막으로 첫 번째와 두 번째는 전자가 압도적으로 간단하다. 재미있어 보이기 때문에 뒤에도 실렸다.

끝말


변형은 문제 발생의 주요 원인으로 여겨진다.파이톤에서 화상 처리를 할 때 금형에 시달리기 때문에 많은 것을 배웠다.
끝까지 봐주셔서 감사합니다.소감과 지적 등이 있으면 잘 부탁드립니다.

참조 링크


[1] [2]
[2]

좋은 웹페이지 즐겨찾기