OpenCV、matplotlib、numpyでほとんどの画像処理ができます。
OpenCVは、インテルが開発・公開したオープンソースライブラリで現在はITseezが保守しています。
matplotlibは、Python及びその科学計算用ライブラリNumPyのためのグラフ描画ライブラリです。
conda install -c conda-forge opencv
、conda install numpy
、でインストールできます。
matplotlibは、anacondaでpythonをインストールすると自動的にインストールされるようです。
# inpainting
import numpy as np
import cv2
import matplotlib.pyplot as plt
修復すべき画像と傷の部分のマスク画像を用意します。今回は、レナさんの画像(PLAYBOY社も公共の利用のためなら許可したそうです)として用いました。
事前にインターネットからダウンロードしてください。もしくは、お好きな画像で試してください。 傷の部分のマスク画像は傷に合わせて用意してください。マスク画像のうち、非ゼロの部分が修復する画素です。入力画像とマスク画像は同じサイズにしてください。私の作った傷の画像とマスク画像はできが悪く仕上がりがよくありません。
img = cv2.imread('lenna_scrawl.jpg') # before inpaint
mask = cv2.imread('lenna_scrawl_mask.jpg', 0) # mask shoud be 1 channel 8bit
修復方法は二通りあります。最初がTeleaさんのFast Marching Method、二番目がNavier-Stokesさん等の流体力学を用いた手法です。
dst = cv2.inpaint(img, mask, 5, cv2.INPAINT_TELEA) #inpaint method TELEA
dst2 = cv2.inpaint(img, mask, 5, cv2.INPAINT_NS) # inpaint method NS
# plt.subplot(mni) m row n column i
plt.subplot(141), plt.imshow(img)
plt.title('Scrawled'), plt.xticks([]), plt.yticks([])
plt.subplot(142), plt.imshow(mask)
plt.title('mask'), plt.xticks([]), plt.yticks([])
plt.subplot(143), plt.imshow(dst)
plt.title('Repaired_TELEA'), plt.xticks([]), plt.yticks([])
plt.subplot(144), plt.imshow(dst2)
plt.title('Repaired_NS'), plt.xticks([]), plt.yticks([])
plt.show()
plt.imshow(dst)
plt.title('Repaired'), plt.xticks([]), plt.yticks([])
plt.show()