質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1781閲覧

Pythonで画像処理をしていて、オーバーフローの警告が出ているのですが、解決策がわかりません。

na_na

総合スコア7

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/01/26 18:34

Pythonで画像処理をしています。二値化処理をしたくて、判別分析法を用いて閾値を決めたのですが、その計算の中でオーバーフローの警告が出ます。
使用しているライブラリはOpencvとnumpyです。

警告が出るのは下の一行です。

python

1s = n1 * n2 * (mu1 - mu2) ** 2
RuntimeWarning: overflow encountered in long_scalars

全体のコード

Python

1#-*- coding:utf-8 -*- 2import cv2 3import numpy as np 4 5img1= cv2.imread('元画像') 6 7 8# 大津の手法 9def threshold_otsu(gray, min_value=0, max_value=255): 10 11 # ヒストグラムの算出 12 hist = [np.sum(gray == i) for i in range(256)] 13 14 s_max = (0,-10) 15 16 for th in range(256): 17 18 # クラス1とクラス2の画素数を計算 19 n1 = sum(hist[:th]) 20 n2 = sum(hist[th:]) 21 22 # クラス1とクラス2の画素値の平均を計算 23 if n1 == 0 : mu1 = 0 24 else : mu1 = sum([i * hist[i] for i in range(0,th)]) / n1 25 if n2 == 0 : mu2 = 0 26 else : mu2 = sum([i * hist[i] for i in range(th, 256)]) / n2 27 28 # クラス間分散の分子を計算 29 s = n1 * n2 * (mu1 - mu2) ** 2 30 31 # クラス間分散の分子が最大のとき、クラス間分散の分子と閾値を記録 32 if s > s_max[1]: 33 s_max = (th, s) 34 35 # クラス間分散が最大のときの閾値を取得 36 t = s_max[0] 37 38 # 算出した閾値で二値化処理 39 gray[gray < t] = min_value 40 gray[gray >= t] = max_value 41 42 return gray 43 44 45 46# グレースケール変換 47gray = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY) 48 49# 方法1(NumPyで実装) 50th = threshold_otsu(gray) 51 52# 結果を出力 53imwrite("変換後画像", th) 54 55 56cv2.namedWindow('window') 57cv2.imshow('window',th) 58cv2.waitKey(0) 59cv2.destroyAllWindows() 60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/26 21:38

> s = n1 * n2 * (mu1 - mu2) ** 2 でエラーが起きる前に、n1,n2,mu1,mu2の値をprint()して、どういう値でoverflowするか見られませんか?(64bit floatで逃げられそうでもあります)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問