opencvで透過pngが変な画像になる

opencvで処理したpng画像を再度imwriteで保存するとおかしな模様が出ている場合があった 例えば単純に以下のようにした場合

image = cv2.imread(image_path)
imwrite('/tmp/image.png', image)

調べてみると原因はalphaチャネルが0のpixelでもRGBの値は入っていたため。
(上記のコードでimreadするとalphaチャネルは無視されてRGBの値のみがロードされるため)

alphaチャネル付きの状態で画像を処理したい場合は単にimreadでオプションを渡せばOK

image = cv2.imread(image_path, -1)
imwrite('/tmp/image.png', image)

これでalpha付きでロードして保存されるので元の画像と同じ状態となる

透過している部分は黒く塗りつぶしてRGBで保存したい場合はこんな感じで

image = cv2.imread(image_path, -1)
if image.shape[2] == 4:
    image[image[:,:,3] == 0] = 0
imwrite('/tmp/image.png', image)