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')
まだ回答がついていません
会員登録して回答してみよう