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')
回答1件
あなたの回答
tips
プレビュー