1. 程式人生 > 程式設計 >python 用opencv實現影象修復和影象金字塔

python 用opencv實現影象修復和影象金字塔

我們將學習如何通過一種稱為修復的方法去除舊照片中的小噪音,筆畫等。基本思路很簡單:用相鄰畫素替換那些壞標記,使其看起來像鄰域。

cv2.inpaint()

  • cv2.INPAINT_TELEA
  • cv2.INPAINT_NS
import numpy as np
import cv2 as cv

img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png',0)

dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)

cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

第一張圖顯示降級輸入,第二個影象是面具,第三個影象是第一個演算法的結果,最後一個影象是第二個演算法的結果。

python 用opencv實現影象修復和影象金字塔

影象金字塔

通常,我們曾經使用恆定大小的影象.但在某些情況下,我們需要使用不同解析度的(相同)影象.例如,在搜尋影象中的某些內容時,如臉部,我們不確定該物件在所述影象中的大小.

具有不同解析度的影象被稱為影象金字塔(因為當它們保持在堆疊中,底部具有最高解析度影象而頂部具有最低解析度影象時,它看起來像金字塔).

影象金字塔有兩種:

  1. 高斯金字塔和
  2. 拉普拉斯金字塔

高斯金字塔的頂部是通過將底部影象中的連續的行和列去除得到的.頂部影象中的每個畫素值等於下一層影象中 5 個畫素的高斯加權平均值.這樣操作一次一個 MxN 的影象就變成了一個 M/2xN/2 的影象。所以這幅影象的面積就變為原來影象面積的四分之一.這被稱為an Octave(一個八度)。連續進行這樣的操作就會得到一個解析度不斷下降的影象金字塔.

函式cv2.pyrDown()從一個高解析度大尺寸的影象向上構建一個金子塔 (尺寸變小,解析度降低).
程式碼:

import cv2

img = cv2.imread('img.jpg')

lower_reso = cv2.pyrDown(img)

cv2.imshow('src',img)
cv2.imshow('HigherReso',lower_reso)

cv2.waitKey()

python 用opencv實現影象修復和影象金字塔

繼續使用函式cv2.pyrUp()從一個低解析度小尺寸的影象向下構建一個金子塔(尺寸變大,但解析度不會增加)
程式碼:

import cv2

img = cv2.imread('img.jpg')

lower_reso = cv2.pyrDown(img)
higher_reso2 = cv2.pyrUp(lower_reso)

cv2.imshow('show',higher_reso2)

cv2.waitKey()

python 用opencv實現影象修復和影象金字塔

NOTE:

當用 cv2.pyrDown(),影象的解析度就會降低,資訊就會被丟失.如果先cv2.pyrDown()產生的中間影象再使用函式cv2.pyrUp()得到影象,與原影象相比解析度差了很多.
可以修改程式碼:

import cv2

img = cv2.imread('img.jpg')

higher_reso2 = cv2.pyrUp(img)
lower_reso = cv2.pyrDown(higher_reso2)


cv2.imshow('show',lower_reso)

cv2.waitKey()

拉普拉斯金字塔由高斯金字塔形成,大部分元素都是零,用於影象壓縮.
程式碼:

import cv2

img = cv2.imread('img.jpg')
img = cv2.Canny(img,100,200)

higher_reso2 = cv2.pyrUp(img)
lower_reso = cv2.pyrDown(higher_reso2)

cv2.imshow('src',img)
cv2.imshow('higher_reso2',higher_reso2)
cv2.imshow('lower_reso',lower_reso)

cv2.waitKey()

python 用opencv實現影象修復和影象金字塔

以上就是python 用opencv實現影象修復和影象金字塔的詳細內容,更多關於python 影象修復和影象金字塔的資料請關注我們其它相關文章!