今天主要介紹影像還原的最後一個章節-影像補繪技術。
影像補繪(Image Inpainting)是一種影像還原技術,同時也可以用來修圖,去除數位影像中不想要的區域。實驗影像補繪技術時,須先建立一個**遮罩(Mask)**,用來定義不想要的局部區域。
影像補繪的演算法,先從遮罩的邊緣開始,逐漸向遮罩內部進行補繪。欲補繪的向宿,是根據目前像素的位置,參考鄰近點的已知像素資訊,進行加權組合,藉以填補目前的像素值。通常來說,演算法會考慮該像素是否落在影像的細節或邊緣上,若是則權重值較大。
OpenCV提供的影像補繪函式,定義如下:
cv2.inpaint(src, inpaintMask, inpaintRadius, flags[, dst])
參數分別說明如下:
src:原始影像
inpaintMask:補繪用的遮罩
inpaintRadius:補繪半徑
flags:補繪演算法
OpenCV提供兩種影像補繪演算法,第一種稱為Navier-Stokes(NS)法;第二種稱為Telea法。參數分別定義為:
INPAINT_NS
INPAINT_TELEA
以下程式碼為影像補繪的範例框架,請注意!每張圖片以及每個人想要移除的地方不同,請根據需求更改程式碼:
import numpy as np
import cv2
def inpainting(f, method = 1):
nr, nc = f.shape[:2]
mask = np.zeros([nr, nc], dtype = 'uint8')
for x in range(nr):
for y in range(nc):
if f[x, y, 0] == 0 and f[x, y, 1] == 255 and f[x, y, 2] == 255:
mask[x, y] = 255
if method == 1:
g = cv2.inpaint(f, mask, 3, cv2.INPAINT_NS)
else:
g = cv2.inpaint(f, mask, 3, cv2.INPAINT_TELEA)
return g
def main():
img1 = cv2.imread("D:\Desktop\IThome\lena.bmp",-1)
img2 = inpainting(img1, 1)
cv2.imshow("Original", img1)
cv2.imshow("Inpainting", img2)
cv2.waitKey()
cv2.destroyAllWindows()
main()
影像還原的章節就到這告一段落,我們之後將進入色彩影像處理章節。