前提・実現したいこと
1以上の画素値を持つピクセルの最頻値を求めたいです。
発生している問題
最頻値の値が1になるはずですが、私のコードだと22となっています... 補足情報に画像(Brow)とヒストグラムを載せておきます。
該当のソースコード
python
1import cv2 2import numpy as np 3from scipy import stats 4 5Bmode = stats.mode(Brow[Brow>0]) [0][0] 6print("B mode:"+str(Bmode))
補足情報(FW/ツールのバージョンなど)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/22 04:44
回答3件
0
回答ではなく検証結果ですが。
単純画像で試してみましたが、処理には問題ないと思います。
元画像の読み取りからBrow
変数にセットするまでの処理に問題はないでしょうか。
Python
1import cv2 2import numpy as np 3from scipy import stats 4from PIL import Image, ImageDraw 5 6# テスト画像 7img = Image.new('RGB', (500,200), (0,0,0)) 8draw = ImageDraw.Draw(img) 9draw.rectangle((50,50,150,150), fill=(200,200,200)) 10draw.rectangle((200,50,400,150), fill=(100,100,100))# こちらのほうが大きい 11 12img.save('ret.png') 13img = np.array(img, dtype=np.uint8) 14Brow = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 15 16print(stats.mode(Brow[Brow>0])) 17# ModeResult(mode=array([100], dtype=uint8), count=array([20301])) 18 19Bmode = stats.mode(Brow[Brow>0]) [0][0] 20print("B mode:"+str(Bmode)) # B mode:100
投稿2020/11/22 02:26
総合スコア38341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/22 05:01 編集
0
fourteenlengthさんが上げてくれた画像を使ってやってみたら、「B mode:4」と表示されました
python
1import numpy as np 2import cv2 3from scipy import stats 4Brow = cv2.cvtColor(cv2.imread("./img.png"), cv2.COLOR_BGR2GRAY) 5Bmode = stats.mode(Brow[Brow>0])[0][0] 6print("B mode:"+str(Bmode))
確認したら、0を除外したら、やはり4が個数最大でした
python
1histogram, _ = np.histogram(Brow.flatten(), bins=np.arange(np.max(Brow)+2)) 2print(histogram)
投稿2020/11/22 02:25
編集2020/11/23 07:42総合スコア7653
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/22 05:13 編集
0
ベストアンサー
追記)
1. 以下の写真を"img_green_masked.jpeg"と名前を付けて保存してください。
2. 画像と同じフォルダに以下のファイルを(適当な名前).pyと名前を付けて保存して走らせてください。
Python3
1import cv2 2import numpy as np 3 4from scipy import stats 5 6def calc_Bmode(img): 7 if len(img.shape)==3: 8 print(img.shape,"--> ",end="") 9 BGR = cv2.split(img_col) 10 img = BGR[0] 11 print(img.shape) 12 else: 13 print(img.shape) 14 15 16 Brow = np.array(img).flatten() 17 Bmode = stats.mode(Brow[Brow>0])[0][0] 18 print("Bmode", Bmode) 19img_col =cv2.imread("./img_green_masked.jpeg") 20 21BGR = cv2.split(img_col) 22Blue = BGR[0] 23 24print("---一旦保存法---") 25cv2.imwrite("./blue.jpeg",Blue) 26img_blue_loaded = cv2.imread("./blue.jpeg") 27calc_Bmode(img_blue_loaded) 28cv2.imshow("img_blue_loaded",cv2.resize(img_blue_loaded,None,fx=0.25,fy=0.25)) 29cv2.waitKey(0) 30 31print("---色の分解法---") 32calc_Bmode(Blue) 33 34cv2.imshow("Blue",cv2.resize(Blue,None,fx=0.25,fy=0.25)) 35 36cv2.waitKey(0) 37
3. 表示される画像に「識別文字」は見えますね?
** =(別のファイルを間違えて開いている可能性は排除できますね?**
4. どちらの方法でも同じBmodeになっていますか?
元のファイルと少し違うようで値が違いますができました。
1以上の~を修正しました。
22となるのはNumpyだとかScipyのせいではなさそうな気がします。
(イメージの指定違い?)
Python3
1import cv2 2import numpy as np 3 4from scipy import stats 5 6img = cv2.cvtColor(cv2.imread("./img.png"),cv2.COLOR_BGR2GRAY) 7 8print("1以上の条件なし Numpy") 9arr, count = np.unique(img, return_counts=True) 10idx = np.argmax(count) 11print("Maximum index[RAW]:",arr[idx]) 12print("Count: [RAW] ",count[idx]) 13# print(count) 14 15print("1以上の条件あり Numpy") 16arr, count = arr[1:], count[1:] 17idx = np.argmax(count) 18print("Maximum index: ",arr[idx]) 19print("Count: ",count[idx]) 20 21print("1以上の条件あり Scipy") 22Bmode = stats.mode(img[img>0])[0][0] 23print(Bmode) 24
投稿2020/11/22 01:27
編集2020/11/22 08:09退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/23 07:46 編集
退会済みユーザー
2020/11/22 03:09
2020/11/22 04:37
2020/11/22 04:45
退会済みユーザー
2020/11/22 08:10
2020/11/22 08:59
2020/11/22 09:19
2020/11/22 09:38
退会済みユーザー
2020/11/22 10:44
2020/11/22 12:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。