日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python,OpenCV中的图像修复——cv2.inpaint()

發布時間:2023/11/27 生活经验 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python,OpenCV中的图像修复——cv2.inpaint() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python,OpenCV中的圖像修復——cv2.inpaint

    • 1. 效果圖
    • 2. 原理
    • 3. 源碼
    • 參考

image inpainting 圖像修改

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

大多數人家里都會有一些舊的老化照片,上面有一些黑點、筆劃等。如何復原呢?


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

  • cv2.INPAINT_TELEA(Fast Marching Method 快速行進算法)

  • cv2.INPAINT_NS(Fluid Dynamics Method 流體力學算法)

  • OpenCV未實現的:Content-Aware Fill 內容感知填充算法,這是Adobe Photoshop中使用的一種高級修復技術。

cv2.inpaint() 優點:修復效果更加自然;
缺點:修復時需要提供原圖以及mask圖(與原圖一致只有被污染的像素區域有值);

1. 效果圖

官方原始圖 VS mask圖 VS 快速行進算法修復效果 VS 流體力學修復效果 如下:

接下來用可交互的例子實現自己的圖片修復;

原始圖 VS Mask圖 VS 快速行進算法修復效果圖如下:
原始圖隨意用鼠標左鍵移動繪制點、線,右鍵移動繪制矩形來隨機增加一些被污染的區域;
并根據原始圖生成mask圖,mask圖是與原始圖具有相同大小,并且只有被污染的區域是白色像素的圖。可以看到修復效果還是挺好的~
原始圖 VS Mask圖 VS 流體力學算法修復效果圖如下:
原始圖隨意用鼠標左鍵移動繪制點、線,右鍵移動繪制矩形來隨機增加一些被污染的區域;
mask圖是與原始圖具有相同大小,并且只有被污染的區域是白色像素的圖。可以看到修復效果還是挺好的~

快速行進算法與流體力學算法修復的效果圖差別不太大;

2. 原理

  • cv2.INPAINT_TELEA (Fast Marching Method 快速行進算法),對位于點附近、邊界法線附近和邊界輪廓上的像素賦予更多權重。一旦一個像素被修復,它將使用快速行進的方法移動到下一個最近的像素。

  • cv2.INPAINT_NS(Fluid Dynamics Method 流體力學算法),使用了流體力學的一些方法,基本原則是啟發式的。首先沿著邊從已知區域移動到未知區域(因為邊是連續的)。它在匹配修復區域邊界處的漸變向量的同時,繼續等高線(連接具有相同強度的點的線,就像等高線連接具有相同高程的點一樣)。

  • OpenCV未實現的:Content-Aware Fill 內容感知填充算法,這是Adobe Photoshop中使用的一種高級修復技術。

3. 源碼

# 圖像修復交互式案例——通過水流填充算法來修復被破壞的圖像區域;
# 使用倆種方法進行修復
# cv2.INPAINT_TELEA (Fast Marching Method 快速行進算法),對位于點附近、邊界法線附近和邊界輪廓上的像素賦予更多權重。一旦一個像素被修復,它將使用快速行進的方法移動到下一個最近的像素。
# cv2.INPAINT_NS 流體力學算法,使用了流體力學的一些方法,基本原則是啟發式的,首先沿著邊從已知區域移動到未知區域(因為邊是連續的)。它在匹配修復區域邊界處的漸變向量的同時,繼續等高線(連接具有相同強度的點的線,就像等高線連接具有相同高程的點一樣)。# USAGE 
# python inpaint.py D:/deepLearning/py-demo/20210808/images/ml.jpg# 按下鼠標左鍵,添加點、線,按下鼠標右鍵,添加矩形框,以制作被污染的需要修復圖像
# 按下空格鍵:執行修復功能
# 按下r鍵:重置待修復的mask
# 按下esc鍵,退出
import cv2
import numpy as npclass Sketcher:def __init__(self, windowname, dests, colors_func):self.prev_pt = None  # 線起始點self.drag_start = None  # 矩形起點self.drag_rect = None  # 矩形(左上角,右下角)坐標self.windowname = windownameself.dests = destsself.colors_func = colors_funcself.dirty = Falseself.drawing = Falseself.mode = Falseself.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 = ptself.drawing = Trueelif event == cv2.EVENT_RBUTTONDOWN:# 第一次初始化時設定pt,往后保留上一個點作為矩形起點if self.drag_start == None:self.drag_start = ptif 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 = Trueself.prev_pt = ptself.show()if self.drag_start and flags & cv2.EVENT_FLAG_RBUTTON:xo, yo = self.drag_startx0, y0 = np.minimum([xo, yo], [x, y])x1, y1 = np.maximum([xo, yo], [x, y])self.drag_rect = Noneif 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 = Trueself.drag_start = Noneself.drag_rect = Noneself.show()else:self.drag_start = pt@propertydef dragging(self):return self.drag_rect is not Nonedef main():import systry: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:breakif 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[:] = imgmark[:] = 0sketch.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

總結

以上是生活随笔為你收集整理的Python,OpenCV中的图像修复——cv2.inpaint()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。