やりたいこと
以下の輪郭抽出して背景を透過した画像の
①RGB値(比率)?の取得
②画像の大きさpx値として表示
③輪郭抽出した中身の画像の重心を取得したい
書いたコード
python
1import cv2 2import numpy as np 3 4# 画像を読み込む。 5img = cv2.imread(r"C:\Users\hirayama\Desktop\python_test\Python.png") 6 7# グレースケールに変換する。 8gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 9 10# 2値化する。 11thresh, binary = cv2.threshold(gray, 230, 255, cv2.THRESH_BINARY_INV) 12 13# 輪郭を抽出する。 14contours, hierarchy = cv2.findContours( 15 binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE 16) 17 18# マスクを作成する 19mask = np.zeros_like(binary) 20 21# 輪郭内部(透明化しない画素)を255で塗りつぶす。 22for cnt in contours: 23 cv2.drawContours(mask, contours, -1, color=255, thickness=-1) 24 25# RGBAに変換する 26rgba = cv2.cvtColor(img, cv2.COLOR_RGB2RGBA) 27 28# マスクをアルファチャンネルに設定する。 29rgba[..., 3] = mask 30 31 32# すべての輪郭を描画 33#cv2.drawContours(img, contours, -1, color=(0, 255, 0), thickness=2) 34 35# 保存する。 36cv2.imwrite(r"C:\Users\hirayama\Desktop\python_test\rgba_Python.png", rgba) 37 38# BGR値の取得 39BGR = rgba[100, 100] 40print(BGR) 41 42# 画像の大きさ(px) 43print(rgba.size) 44 45# 表示 46cv2.imshow("img", rgba) 47cv2.waitKey(0) 48 49
実行結果
BGR値の取得
BGR = rgba[100, 100]
print(BGR)
画像の大きさ(px)
print(rgba.size)
↓
[255 255 255 0]
7060548
のような値で全部255っておかしいかですよね。たぶん。重心の求め方に関してはmoments関数を使うことしかわからなくて実装できません。
解決してほしいこと
コードをレビューしていただきたいです。また、実行結果からRGB値の値が正しいのか、他のやりかたがあるのか教えてほしいです。
最後に、全然分からないので、contoursした画像の重心を求めるコードを教えていただけるとうれしいです。
超初心者ですので、失礼がありましたら、申し訳ありません。
追記
重心のコードを書いてみましたが、はたして、輪郭内部の重心であっているのでしょうか?
python
1# 重心を求める 2cnt = contours[0] 3M = cv2.moments(cnt) 4print(M) 5cx = int(M['m10']/M['m00']) 6cy = int(M['m01']/M['m00']) 7print((cx, cy))
実行結果
{'m00': 3630.0, 'm10': 2613283.6666666665, 'm01': 3195271.1666666665, 'm20': 1883025588.0, 'm11': 2299330490.583333, 'm02': 2818133066.5, 'm30': 1358054429772.7002, 'm21': 1656066366000.6167, 'm12': 2027034542877.3167, 'm03': 2490427057352.85, 'mu20': 1689080.433394909, 'mu11': -986300.1662378311, 'mu02': 5527604.094666958, 'mu30': 8119675.634277344, 'mu21': -27959950.409425497, 'mu12': -39319440.03291702, 'mu03': 62396420.001464844, 'nu20': 0.1281849625780653, 'nu11': -0.07485069828547161, 'nu02': 0.41949199695428796, 'nu30': 0.01022756192602152, 'nu21': -0.03521841723007951, 'nu12': -0.049526856237396895, 'nu03': 0.07859467277646077}
(719, 880)
輪郭内部の画像の重心を取得できたのかわかりません
別の書き方を教えてほしいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/08 07:41
2019/11/08 07:54
2019/11/08 15:14