質問編集履歴

1 追記として画像の重心のコードを書いてみましたのでレビューお願いします。

Kanikama_h

Kanikama_h score 19

2019/11/08 16:23  投稿

初めてのOpenCV
### やりたいこと
以下の輪郭抽出して背景を透過した画像の
①RGB値(比率)?の取得
②画像の大きさpx値として表示
③輪郭抽出した中身の画像の重心を取得したい
![イメージ説明](65c3d676eebf55370b53fdede6ece7dc.png)
### 書いたコード
```python
import cv2
import numpy as np
# 画像を読み込む。
img = cv2.imread(r"C:\Users\hirayama\Desktop\python_test\Python.png")
# グレースケールに変換する。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2値化する。
thresh, binary = cv2.threshold(gray, 230, 255, cv2.THRESH_BINARY_INV)
# 輪郭を抽出する。
contours, hierarchy = cv2.findContours(
   binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
# マスクを作成する
mask = np.zeros_like(binary)
# 輪郭内部(透明化しない画素)を255で塗りつぶす。
for cnt in contours:
   cv2.drawContours(mask, contours, -1, color=255, thickness=-1)
# RGBAに変換する
rgba = cv2.cvtColor(img, cv2.COLOR_RGB2RGBA)
# マスクをアルファチャンネルに設定する。
rgba[..., 3] = mask
# すべての輪郭を描画
#cv2.drawContours(img, contours, -1, color=(0, 255, 0), thickness=2)
# 保存する。
cv2.imwrite(r"C:\Users\hirayama\Desktop\python_test\rgba_Python.png", rgba)
# BGR値の取得
BGR = rgba[100, 100]
print(BGR)
# 画像の大きさ(px)
print(rgba.size)
# 表示
cv2.imshow("img", rgba)
cv2.waitKey(0)
```
### 実行結果
BGR値の取得
BGR = rgba[100, 100]
print(BGR)
画像の大きさ(px)
print(rgba.size)
[255 255 255  0]
7060548
のような値で全部255っておかしいかですよね。たぶん。重心の求め方に関してはmoments関数を使うことしかわからなくて実装できません。
### 解決してほしいこと
コードをレビューしていただきたいです。また、実行結果からRGB値の値が正しいのか、他のやりかたがあるのか教えてほしいです。
最後に、全然分からないので、contoursした画像の重心を求めるコードを教えていただけるとうれしいです。
超初心者ですので、失礼がありましたら、申し訳ありません。
超初心者ですので、失礼がありましたら、申し訳ありません。
### 追記
重心のコードを書いてみましたが、はたして、輪郭内部の重心であっているのでしょうか?
```python
# 重心を求める
cnt = contours[0]
M = cv2.moments(cnt)
print(M)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
print((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)
輪郭内部の画像の重心を取得できたのかわかりません
別の書き方を教えてほしいです。
  • NumPy

    904 questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

  • OpenCV

    1961 questions

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

  • Python 3.x

    12759 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • PyCharm

    297 questions

    エディター・開発ツール

  • Windows 10

    1686 questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る