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

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

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

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

Python

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

Q&A

解決済

1回答

3095閲覧

HSVからHSとSVだけを取り出す

yuki1123

総合スコア13

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/01/26 15:06

前提・実現したいこと

一枚の画像をRGBからHSVに変換し、HS成分とSV成分だけを取り出した二枚の別々の画像を作成中ですが、
HS成分だけを取り出した画像はできましたが、SV成分だけの画像作成ができなくて困ってます。

発生している問題・エラーメッセージ


TypeError Traceback (most recent call last)
<ipython-input-14-7f26c00cf06d> in <module>
12 plt.subplot(1,2,1), plt.imshow(img)
13 plt.xticks([]),plt.yticks([]),plt.title('Image')
---> 14 plt.subplot(1,2,2), plt.imshow(hist,interpolation = 'nearest')
15 plt.xticks([]),plt.yticks([]),plt.title('Histogram')
16

~/miniconda3/lib/python3.7/site-packages/matplotlib/pyplot.py in imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, data, **kwargs)
2699 filternorm=filternorm, filterrad=filterrad, imlim=imlim,
2700 resample=resample, url=url, **({"data": data} if data is not
-> 2701 None else {}), **kwargs)
2702 sci(__ret)
2703 return __ret

~/miniconda3/lib/python3.7/site-packages/matplotlib/init.py in inner(ax, data, *args, **kwargs)
1808 "the Matplotlib list!)" % (label_namer, func.name),
1809 RuntimeWarning, stacklevel=2)
-> 1810 return func(ax, *args, **kwargs)
1811
1812 inner.doc = _add_data_doc(inner.doc,

~/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_axes.py in imshow(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
5492 resample=resample, **kwargs)
5493
-> 5494 im.set_data(X)
5495 im.set_alpha(alpha)
5496 if im.get_clip_path() is None:

~/miniconda3/lib/python3.7/site-packages/matplotlib/image.py in set_data(self, A)
640 if (self._A.dtype != np.uint8 and
641 not np.can_cast(self._A.dtype, float, "same_kind")):
--> 642 raise TypeError("Image data cannot be converted to float")
643
644 if not (self._A.ndim == 2

TypeError: Image data cannot be converted to float

エラーメッセージ

### 該当のソースコード opencv-python import cv2 import numpy as np from matplotlib import pyplot as plt %matplotlib inline img = cv2.imread('hsv.jpg') hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR) hist = cv2.calcHist([hsv], [1,2], None, [0,256], [0,256,0, 256]) plt.subplot(1,2,1), plt.imshow(img) plt.xticks([]),plt.yticks([]),plt.title('Image') plt.subplot(1,2,2), plt.imshow(hist,interpolation = 'nearest') plt.xticks([]),plt.yticks([]),plt.title('Histogram') cv2.imwrite("homehsv-sv.jpg",img) ### 試したこと hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])で HS成分だけの画像が作成できたので、以下のようにベクトルを[1,2] 色の範囲を[0,256],[1,2]のベクトルの色の範囲を[0,256,0,256]にしました ここで0はH成分、1はs成分、2はv成分を表す。 変更したらエラーが発生しました。 hist = cv2.calcHist([hsv], [1,2], None, [0,256], [0,256,0, 256]) ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2019/01/26 15:21 編集

> HS成分とSV成分だけを取り出した二枚の別々の画像を作成 cv2.calcHist() はヒストグラムを作成する関数だと思いますが、画像を作るとはどういう意味でしょうか?
yuki1123

2019/01/26 15:36

物体追跡のために色尤度を作成をしています。 cv2.calcHist()を使用しています。 次のステップに進むためにHS とSVの二枚の画像を使用して共起ヒストグラムを作成するために 必要なのです。
yuki1123

2019/01/26 15:36

物体追跡のために色尤度を作成をしています。 cv2.calcHist()を使用しています。 次のステップに進むためにHS とSVの二枚の画像を使用して共起ヒストグラムを作成するために 必要なのです。
yuki1123

2019/01/26 15:40

print(type(hist)) で確認したところ下のように表示されます <class 'NoneType'>
tiitoi

2019/01/26 17:10 編集

画像というのは2次元ヒストグラムのことだったのですね。 回答に記載しました。
guest

回答1

0

ベストアンサー

calcHist() のリファレンスを確認してください。引数 histSize の指定方法が間違っています。

histSize はビンの数なので、channels=[0, 1] の場合、[32, 32] など各チャンネルのビンの数を指定してください。範囲が [0, 256] でビンの数が32の場合、この区間を32等分してビンが作成されます。

関数の説明

python

1hist = cv.calcHist( 2 images, channels, mask, histSize, ranges[, hist[, accumulate]])
  • images: 画像の一覧。
  • channels: ヒストグラムを計算するチャンネルの一覧。
  • mask: マスクの一覧。
  • histSize: 各チャンネルのビン数
  • ranges: 各チャンネルのヒストグラムの範囲。
  • hist: 引数経由で結果を受け取る場合、指定する。

サンプルコード

python

1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5# 画像を読み込む。 6img = cv2.imread('sample.jpg') 7hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 8 9channel_names = {0: 'Hue', 1: 'Saturation', 2: 'Brightness'} 10# 2次元ヒストグラムを作成する。 11hists = [] 12channels = [[0, 1], [0, 2], [1, 2]] 13for ch in channels: 14 hist = cv2.calcHist( 15 [hsv], ch, None, histSize=[32] * 2, ranges=[0, 256] * 2) 16 hists.append(hist)

結果を描画する。

python

1# 描画する。 2fig, axes = plt.subplots(1, 3, figsize=(12, 8)) 3for hist, [x_ch, y_ch], ax in zip(hists, channels, axes): 4 # 2Dヒストグラムを描画する。 5 im = ax.imshow(hist, interpolation='nearest') 6 # タイトル、x 軸、y 軸のラベルを設定する。 7 ax.set_title('2D Histogram for {} and {}'.format( 8 channel_names[x_ch], channel_names[y_ch])) 9 ax.set_xlabel(channel_names[x_ch]) 10 ax.set_ylabel(channel_names[y_ch]) 11 12plt.show()

イメージ説明

投稿2019/01/26 17:09

編集2019/01/26 17:15
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問