人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

OpenCV圖像修復(fù)cv2.inpaint()的使用

發(fā)布日期:2022-02-14 13:46 | 文章來源:源碼中國

這篇博客將介紹如何通過OpenCV中圖像修復(fù)的技術(shù)——cv2.inpaint() 去除舊照片中的小噪音、筆劃等。并提供一個(gè)可交互式的程序,利用OpenCV的快速行進(jìn)和流體力學(xué)倆種修復(fù)算法對自己的圖片進(jìn)行修復(fù)。

大多數(shù)人家里都會(huì)有一些舊的老化照片,上面有一些黑點(diǎn)、筆劃等。如何復(fù)原呢?


在繪制工具中擦除:將簡單地用無用的白色結(jié)構(gòu)替換黑色結(jié)構(gòu),效果并不理想。OpenCV中圖像修復(fù)的技術(shù)——基本思想很簡單:用相鄰像素替換這些壞標(biāo)記,使其看起來像鄰居。

  • cv2.INPAINT_TELEA(Fast Marching Method 快速行進(jìn)算法)
  • cv2.INPAINT_NS(Fluid Dynamics Method 流體力學(xué)算法)
  • OpenCV未實(shí)現(xiàn)的:Content-Aware Fill 內(nèi)容感知填充算法,這是Adobe Photoshop中使用的一種高級修復(fù)技術(shù)。

cv2.inpaint() 優(yōu)點(diǎn):修復(fù)效果更加自然;
缺點(diǎn):修復(fù)時(shí)需要提供原圖以及mask圖(與原圖一致只有被污染的像素區(qū)域有值);

1. 效果圖

官方原始圖 VS mask圖 VS 快速行進(jìn)算法修復(fù)效果 VS 流體力學(xué)修復(fù)效果 如下:


接下來用可交互的例子實(shí)現(xiàn)自己的圖片修復(fù);

原始圖 VS Mask圖 VS 快速行進(jìn)算法修復(fù)效果圖如下:
原始圖隨意用鼠標(biāo)左鍵移動(dòng)繪制點(diǎn)、線,右鍵移動(dòng)繪制矩形來隨機(jī)增加一些被污染的區(qū)域;
并根據(jù)原始圖生成mask圖,mask圖是與原始圖具有相同大小,并且只有被污染的區(qū)域是白色像素的圖??梢钥吹叫迯?fù)效果還是挺好的~

原始圖 VS Mask圖 VS 流體力學(xué)算法修復(fù)效果圖如下:
原始圖隨意用鼠標(biāo)左鍵移動(dòng)繪制點(diǎn)、線,右鍵移動(dòng)繪制矩形來隨機(jī)增加一些被污染的區(qū)域;
mask圖是與原始圖具有相同大小,并且只有被污染的區(qū)域是白色像素的圖。可以看到修復(fù)效果還是挺好的~

快速行進(jìn)算法與流體力學(xué)算法修復(fù)的效果圖差別不太大;

2. 原理

  • cv2.INPAINT_TELEA (Fast Marching Method 快速行進(jìn)算法),對位于點(diǎn)附近、邊界法線附近和邊界輪廓上的像素賦予更多權(quán)重。一旦一個(gè)像素被修復(fù),它將使用快速行進(jìn)的方法移動(dòng)到下一個(gè)最近的像素。
  • cv2.INPAINT_NS(Fluid Dynamics Method 流體力學(xué)算法),使用了流體力學(xué)的一些方法,基本原則是啟發(fā)式的。首先沿著邊從已知區(qū)域移動(dòng)到未知區(qū)域(因?yàn)檫吺沁B續(xù)的)。它在匹配修復(fù)區(qū)域邊界處的漸變向量的同時(shí),繼續(xù)等高線(連接具有相同強(qiáng)度的點(diǎn)的線,就像等高線連接具有相同高程的點(diǎn)一樣)。
  • OpenCV未實(shí)現(xiàn)的:Content-Aware Fill 內(nèi)容感知填充算法,這是Adobe Photoshop中使用的一種高級修復(fù)技術(shù)。

3. 源碼

# 圖像修復(fù)交互式案例——通過水流填充算法來修復(fù)被破壞的圖像區(qū)域;
# 使用倆種方法進(jìn)行修復(fù)
# cv2.INPAINT_TELEA (Fast Marching Method 快速行進(jìn)算法),對位于點(diǎn)附近、邊界法線附近和邊界輪廓上的像素賦予更多權(quán)重。一旦一個(gè)像素被修復(fù),它將使用快速行進(jìn)的方法移動(dòng)到下一個(gè)最近的像素。
# cv2.INPAINT_NS 流體力學(xué)算法,使用了流體力學(xué)的一些方法,基本原則是啟發(fā)式的,首先沿著邊從已知區(qū)域移動(dòng)到未知區(qū)域(因?yàn)檫吺沁B續(xù)的)。它在匹配修復(fù)區(qū)域邊界處的漸變向量的同時(shí),繼續(xù)等高線(連接具有相同強(qiáng)度的點(diǎn)的線,就像等高線連接具有相同高程的點(diǎn)一樣)。
# USAGE 
# python inpaint.py D:/deepLearning/py-demo/20210808/images/ml.jpg
# 按下鼠標(biāo)左鍵,添加點(diǎn)、線,按下鼠標(biāo)右鍵,添加矩形框,以制作被污染的需要修復(fù)圖像
# 按下空格鍵:執(zhí)行修復(fù)功能
# 按下r鍵:重置待修復(fù)的mask
# 按下esc鍵,退出
import cv2
import numpy as np

class Sketcher:
 def __init__(self, windowname, dests, colors_func):
  self.prev_pt = None  # 線起始點(diǎn)
  self.drag_start = None  # 矩形起點(diǎn)
  self.drag_rect = None  # 矩形(左上角,右下角)坐標(biāo)
  self.windowname = windowname
  self.dests = dests
  self.colors_func = colors_func
  self.dirty = False
  self.drawing = False
  self.mode = False
  self.show()
  cv2.setMouseCallback(self.windowname, self.on_mouse)
 def show(self):
  cv2.imshow(self.windowname, self.dests[0])
 def on_mouse(self, event, x, y, flags, param):
  pt = (x, y)
  if event == cv2.EVENT_LBUTTONDOWN:
self.prev_pt = pt
self.drawing = True
  elif event == cv2.EVENT_RBUTTONDOWN:
# 第一次初始化時(shí)設(shè)定pt,往后保留上一個(gè)點(diǎn)作為矩形起點(diǎn)
if self.drag_start == None:
 self.drag_start = pt
  if self.prev_pt and flags & cv2.EVENT_FLAG_LBUTTON:
for dst, color in zip(self.dests, self.colors_func()):
 cv2.line(dst, self.prev_pt, pt, color, 5)
self.dirty = True
self.prev_pt = pt
self.show()
  if self.drag_start and flags & cv2.EVENT_FLAG_RBUTTON:
xo, yo = self.drag_start
x0, y0 = np.minimum([xo, yo], [x, y])
x1, y1 = np.maximum([xo, yo], [x, y])
self.drag_rect = None
if x1 - x0 > 0 and y1 - y0 > 0:
 self.drag_rect = (x0, y0, x1, y1)
 for dst, color in zip(self.dests, self.colors_func()):
  cv2.rectangle(dst, (x0, y0), (x1, y1), color, -1)
 self.dirty = True
 self.drag_start = None
 self.drag_rect = None
 self.show()
else:
 self.drag_start = pt
 @property
 def dragging(self):
  return self.drag_rect is not None

def main():
 import sys
 try:
  fn = sys.argv[1]
 except:
  fn = 'images/ml_.jpg'
 img = cv2.imread(fn)
 if img is None:
  print('Failed to load image file:', fn)
  sys.exit(1)
 img_mark = img.copy()
 mark = np.zeros(img.shape[:2], np.uint8)
 sketch = Sketcher('img', [img_mark, mark], lambda: ((255, 255, 255), 255))
 while True:
  ch = cv2.waitKey()
  if ch == 27:
break
  if ch == ord(' '):
cv2.imshow('mask', mark)
fmmres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_TELEA)
nsres = cv2.inpaint(img_mark, mark, 3, cv2.INPAINT_NS)
cv2.imshow('inpaint fmm res', fmmres)
cv2.imshow('inpaint ns res', nsres)
  if ch == ord('r'):
img_mark[:] = img
mark[:] = 0
sketch.show()
 print('Done')

if __name__ == '__main__':
 main()
 cv2.destroyAllWindows()

參考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_photo/py_inpainting/py_inpainting.html#inpainting

到此這篇關(guān)于OpenCV圖像修復(fù)cv2.inpaint()的使用的文章就介紹到這了,更多相關(guān)OpenCV圖像修復(fù)cv2.inpaint()內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

美國快速服務(wù)器

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部