대진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]
Reference
이 문제에 관하여(대진2치화 넘치는 문제와 대책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/isso_w/items/65048c190823647ae0b4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드 자체는 내가 쓴 것이 아니라 다른 사람이 쓴 블로그다.인용
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]
Reference
이 문제에 관하여(대진2치화 넘치는 문제와 대책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/isso_w/items/65048c190823647ae0b4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
RuntimeWarning: overflow encountered in long_scalars
s = n1 * n2 * ((mu1 - mu2) ** 2)
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]
Reference
이 문제에 관하여(대진2치화 넘치는 문제와 대책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/isso_w/items/65048c190823647ae0b4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# ヒストグラムの算出
hist = [np.sum(gray == i) for i in range(256)]
hist = np.array(hist, dtype=np.float64)
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)
...
변형은 문제 발생의 주요 원인으로 여겨진다.파이톤에서 화상 처리를 할 때 금형에 시달리기 때문에 많은 것을 배웠다.
끝까지 봐주셔서 감사합니다.소감과 지적 등이 있으면 잘 부탁드립니다.
참조 링크
[1] [2]
[2]
Reference
이 문제에 관하여(대진2치화 넘치는 문제와 대책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/isso_w/items/65048c190823647ae0b4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(대진2치화 넘치는 문제와 대책), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/isso_w/items/65048c190823647ae0b4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)