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

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

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

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

Python

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

解決済

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

amber_snob
amber_snob

総合スコア30

OpenCV

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

Python

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

1回答

0評価

0クリップ

3336閲覧

投稿2020/07/18 00:09

編集2020/07/18 03:18

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

python

def createImageFromYCrCb(new_y,cr,cb): print(new_y.shape, cr.shape, cb.shape) rgb = cv2.merge((red, green, blue)) # <= not error ycrcb = cv2.merge((new_y,cr,cb)) # <= eroor #rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR) #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

import cv2 import numpy as np from matplotlib import pyplot as plt # カラー画像の対応 (輝度だけヒストグラム平坦化) # 輝度と色味を分ける色空間 YCbCr (Y:輝度、Cb:青の色差、Cr:赤の色差) を利用するとよいです。 # 色味の問題は、RGB を一旦この YCbCr に変換して Y だけヒストグラム平坦化すれば解決します。 # Image画像をRGBL値に分解するメソッド def getRGBLFromImage(img): rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) red, green, blue = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2] ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) y,cr,cb = cv2.split(ycrcb) return red, green, blue, y, cb, cr # RGBL値のヒストグラムを個別にとるメソッド def createHistogram(src,ax,col): X = np.arange(256) hist, bins = np.histogram(src.ravel(),bins=256,range=(0,255)) ax.bar(X,hist,color=col) ax.set_xlim(0,255) ax.set_xlabel("Pixel value", fontsize=10) ax.set_ylabel("Number of pixcels", fontsize=10) ax.set_title("Image(" + col + ") Histogram") ax.grid() return hist #Y、Cr、Cb成分からImage画像を生成するメソッド def createImageFromYCrCb(new_y,cr,cb): print(new_y.shape, cr.shape, cb.shape) a = cv2.merge((red, green, blue)) ycrcb = cv2.merge((new_y,cr,cb)) rgb = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR) cv2.imwrite("result.jpg", rgb) # ヒストグラムを平坦化するメソッド def equalizeHistogram(src_hist, src): cdf = src_hist.cumsum() # np.cumsum():要素を足し合わせて配列として出力。 cdf = np.array(cdf*255/(w*h)) print('cdf.shape',cdf.shape) new_y = np.zeros((h,w)) for i in range(h): for j in range(w): new_y[i][j] = int(cdf[y[i][j]]) return new_y # 画像ファイルを読み込む #img = cv2.imread("image/apples.jpg") #img = cv2.imread("image/castle.jpg") #img = cv2.imread("image/forest.jpg") h,w,_ = img.shape # Image画像をR,G,B,Lに分解する red, green, blue, y, cr, cb = getRGBLFromImage(img); print('red.shape:',red.shape) print('green.shape:',green.shape) print('blue.shape:',blue.shape) print('y.shape:',y.shape) print('cr.shape:',cr.shape) print('cb.shape:',cb.shape) # R,G,B,Lそれぞれのヒストグラムを求め表示する fig = plt.figure(figsize=(10,15),dpi=100) ax1 = fig.add_subplot(2,2,1) ax2 = fig.add_subplot(2,2,2) ax3 = fig.add_subplot(2,2,3) ax4 = fig.add_subplot(2,2,4) createHistogram(red, ax1, 'red') createHistogram(green, ax2, 'green') createHistogram(blue, ax3, 'blue') y_hist = createHistogram(y, ax4, 'y') #ヒストグラム平坦化を行う print('red.type:',type(red)) print('green.type:',type(green)) print('blue.type:',type(blue)) print('y.type:',type(y)) print('cr.type:',type(cr)) print('cb.type:',type(cb)) new_y = equalizeHistogram(y_hist, y) # Y,Cr,Cb成分からImage画像を生成する dst=createImageFromYCrCb(new_y,cr,cb); cv2.imshow('result',dst) cv2.waitKey(0) # R,G,B,Lそれぞれのヒストグラムを求め表示する createHistogram(red, ax1, 'red') createHistogram(green, ax2, 'green') createHistogram(blue, ax3, 'blue') createHistogram(y, ax4, 'yellow')

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python

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