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

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

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

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

Python

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

Q&A

解決済

1回答

6746閲覧

[OpenCV] error: (-215:Assertion failed) cv2.merge()

amber_snob

総合スコア30

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/07/18 00:09

編集2020/07/18 03:18

Opencvで画像をmergeする時にエラーがでます。

python

1def createImageFromYCrCb(new_y,cr,cb): 2 print(new_y.shape, cr.shape, cb.shape) 3 rgb = cv2.merge((red, green, blue)) # <= not error 4 ycrcb = cv2.merge((new_y,cr,cb)) # <= eroor 5 #rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR) 6 #cv2.imwrite("result.jpg", rgb)

error: OpenCV(3.4.2) C:(...): error: (-215:Assertion failed) mv[i].size == mv[0].size && mv[i].depth() == depth in function 'cv::merge'

rgbをmergeする時は問題ないのですが、ycrcbをmergeする時にエラーが出ます。
また、以下はred, green, blue, y, cr,cbのサイズ、クラスです。

red: (340, 510) <class 'numpy.ndarray'>

green: (340, 510) <class 'numpy.ndarray'>
blue: (340, 510) <class 'numpy.ndarray'>
y: (340, 510) <class 'numpy.ndarray'>
cr: (340, 510) <class 'numpy.ndarray'>
cb: (340, 510) <class 'numpy.ndarray'>

配列のサイズもクラスあっていて3チャンネルでmergeしてるので、問題ないと思うのですが、なぜエラーが出るのでしょうか?教えていただきたいです。

[追記] 以下は全コードです。

python

1import cv2 2import numpy as np 3from matplotlib import pyplot as plt 4 5# カラー画像の対応 (輝度だけヒストグラム平坦化) 6# 輝度と色味を分ける色空間 YCbCr (Y:輝度、Cb:青の色差、Cr:赤の色差) を利用するとよいです。 7# 色味の問題は、RGB を一旦この YCbCr に変換して Y だけヒストグラム平坦化すれば解決します。 8 9# Image画像をRGBL値に分解するメソッド 10def getRGBLFromImage(img): 11 rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 12 red, green, blue = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2] 13 ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) 14 y,cr,cb = cv2.split(ycrcb) 15 return red, green, blue, y, cb, cr 16 17# RGBL値のヒストグラムを個別にとるメソッド 18def createHistogram(src,ax,col): 19 X = np.arange(256) 20 hist, bins = np.histogram(src.ravel(),bins=256,range=(0,255)) 21 ax.bar(X,hist,color=col) 22 ax.set_xlim(0,255) 23 ax.set_xlabel("Pixel value", fontsize=10) 24 ax.set_ylabel("Number of pixcels", fontsize=10) 25 ax.set_title("Image(" + col + ") Histogram") 26 ax.grid() 27 return hist 28 29#Y、Cr、Cb成分からImage画像を生成するメソッド 30def createImageFromYCrCb(new_y,cr,cb): 31 print(new_y.shape, cr.shape, cb.shape) 32 a = cv2.merge((red, green, blue)) 33 ycrcb = cv2.merge((new_y,cr,cb)) 34 rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR) 35 cv2.imwrite("result.jpg", rgb) 36 37# ヒストグラムを平坦化するメソッド 38def equalizeHistogram(src_hist, src): 39 cdf = src_hist.cumsum() # np.cumsum():要素を足し合わせて配列として出力。 40 cdf = np.array(cdf*255/(w*h)) 41 print('cdf.shape',cdf.shape) 42 new_y = np.zeros((h,w)) 43 for i in range(h): 44 for j in range(w): 45 new_y[i][j] = int(cdf[y[i][j]]) 46 return new_y 47 48# 画像ファイルを読み込む 49#img = cv2.imread("image/apples.jpg") 50#img = cv2.imread("image/castle.jpg") 51#img = cv2.imread("image/forest.jpg") 52 53h,w,_ = img.shape 54 55# Image画像をR,G,B,Lに分解する 56red, green, blue, y, cr, cb = getRGBLFromImage(img); 57print('red.shape:',red.shape) 58print('green.shape:',green.shape) 59print('blue.shape:',blue.shape) 60print('y.shape:',y.shape) 61print('cr.shape:',cr.shape) 62print('cb.shape:',cb.shape) 63 64# R,G,B,Lそれぞれのヒストグラムを求め表示する 65fig = plt.figure(figsize=(10,15),dpi=100) 66ax1 = fig.add_subplot(2,2,1) 67ax2 = fig.add_subplot(2,2,2) 68ax3 = fig.add_subplot(2,2,3) 69ax4 = fig.add_subplot(2,2,4) 70createHistogram(red, ax1, 'red') 71createHistogram(green, ax2, 'green') 72createHistogram(blue, ax3, 'blue') 73y_hist = createHistogram(y, ax4, 'y') 74 75#ヒストグラム平坦化を行う 76print('red.type:',type(red)) 77print('green.type:',type(green)) 78print('blue.type:',type(blue)) 79print('y.type:',type(y)) 80print('cr.type:',type(cr)) 81print('cb.type:',type(cb)) 82new_y = equalizeHistogram(y_hist, y) 83 84# Y,Cr,Cb成分からImage画像を生成する 85dst=createImageFromYCrCb(new_y,cr,cb); 86cv2.imshow('result',dst) 87cv2.waitKey(0) 88 89# R,G,B,Lそれぞれのヒストグラムを求め表示する 90createHistogram(red, ax1, 'red') 91createHistogram(green, ax2, 'green') 92createHistogram(blue, ax3, 'blue') 93createHistogram(y, ax4, 'yellow')

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

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

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

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

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

can110

2020/07/18 00:47 編集

単純データで実行してみましたが、エラー再現しませんでした。 サンプルデータおよび単体で実行、エラー再現できるコードを提示いただけますか?
amber_snob

2020/07/18 03:19

ご返信ありがとうございます。 追記で全コードを貼り付けました。
can110

2020/07/18 04:07

こちらのテスト画像でもエラー再現しました。 変数の型に問題があるようです。
amber_snob

2020/07/18 10:52

ありがとうございます。解決しました。
guest

回答1

0

ベストアンサー

まず、エラーの原因はnew_yfloat値のためのようです。cr,cbと同じnp.uint8にするとエラーは消えました。
次に関数にreturn文がないため、呼出元で別のエラーが発生しています。これはrgbを返すことで解消できます。

最後にYCrCbからRGBへの変換結果ですが、結果画像の色味が変です。
~GBRではなく~RGBとすることで元の画像と同じ色味で保存、表示できるようになりましたが、この点、元コードであえてそうしているのか、コードに問題あるのかがが理解できなかったので参考程度に捉えてください。

Python

1#Y、Cr、Cb成分からImage画像を生成するメソッド 2def createImageFromYCrCb(new_y,cr,cb): 3 print(new_y.shape, cr.shape, cb.shape) 4 new_y = new_y.astype(np.uint8) # 追加 5 a = cv2.merge((red, green, blue)) 6 ycrcb = cv2.merge((new_y,cr,cb)) 7 #rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR) 8 rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2RGB) # こちらだと元の画像と同じ色味で保存できた 9 cv2.imwrite("result.jpg", rgb) 10 return rgb # 追加

投稿2020/07/18 04:12

can110

総合スコア38341

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

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

amber_snob

2020/07/18 10:51

ご返信ありがとうございます。 貼っていただいたコードで実行したところ、思い通りに処理できました。 最後はRGBに変換するとよいのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問