2017-11-03 10 views
2

サムネイルはすべて同じサイズのリストになっていて、それらを所定の幅のモザイクとして表示したいと思います。考え方は、形状が(thumb_height, thumb_width*width, 3)の行ごとに1つのイメージを作成してから、1つのイメージを取得してそれらをすべて連結することです。今、幅がサムネイルの数の約数でない場合、最後の行はいくつかの画像を欠場するでしょう。アイデアは、黒のプレースホルダでギャップを埋めることです。ここでは、コードです:OpenCV 3とnumpyでサムネイルのモザイクを作成する

def show_images_mosaic(images, width): 
    rows = [] 
    for i in range(0, len(images), width): 
     rows.append(np.concatenate(images[i: i + width], axis=1)) 

    if len(rows) > 1: 
     last_row = rows[-1] 

     height = images[0].shape[0] 
     last_row_width = last_row.shape[1] 
     expected_width = rows[0].shape[1] 

     if last_row_width < expected_width: 
      filler = np.zeros((height, expected_width - last_row_width, 3)) 
      rows[-1] = np.concatenate((last_row, filler), axis=1) 
     else: 
      filler = None 

    mosaic = np.concatenate(rows, axis=0) 
    cv2.imshow('Mosaic', mosaic) 

    for i, row in enumerate(rows): 
     cv2.imshow('Row' + str(i), row) 

    cv2.imshow('LastRowUnfilled', last_row) 
    if filler is not None: 
     cv2.imshow('Filler', filler) 

    cv2.waitKey(0) 

widthは、サムネイルの数の約数であればこのコードは素晴らしい作品。しかし、私は最後の行を埋める必要があるとき何らかの理由でそれは壊れます。奇妙なことは、最後の行だけが壊れないということですが、イメージ全体が壊れてしまい、なぜそれが理解できないのでしょうか。さらに、最後の行を除く単一の行が正しく表示されますが、最後の行がイメージ全体に影響するかのように、モザイク全体が壊れます。

+1

壊れたモザイクの例を表示できますか? – Sunreef

答えて

2

あなたの問題はサムネイルが8ビットイメージであるという事実に関連していると思います。

デフォルトでは、np.zerosはタイプnp.float64の配列を作成します。したがって、フィラーを最後の行と連結してからモザイク全体を連結すると、255までの値を含むが、dtype=np.float64の配列になります。 OpenCVは浮動小数点画像が範囲[0, 1]にあることを期待しています。

このようなあなたのフィラーを宣言し、それを修正するには:

filler = np.zeros((height, expected_width - last_row_width, 3), dtype=np.uint8) 

N.B:あなたがディスクにモザイクを保存する場合は、問題が表示されないはずです。それが本当に問題である場合は壊れているのはimshowです。

+0

'dtype = np.uint8'を追加すると問題が解決しました!また、 'imshow'も動作します!おかげで@Sunreef – se7entyse7en

関連する問題