iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

數位影像處理系列 第 15

[Day 15]影像補繪

  • 分享至 

  • xImage
  •  

今天主要介紹影像還原的最後一個章節-影像補繪技術。


1.影像補繪

影像補繪(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()

影像還原的章節就到這告一段落,我們之後將進入色彩影像處理章節。


上一篇
[Day 14]影像還原
下一篇
[Day 16]色彩理論基礎
系列文
數位影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言