欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年08月10日 16:21:39   作者:程序媛一枚~  
這篇博客將介紹如何通過(guò)OpenCV中圖像修復(fù)的技術(shù)——cv2.inpaint() 去除舊照片中的小噪音、筆劃等。并提供一個(gè)可交互式的程序,感興趣的可以了解一下

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

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


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

  • 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中使用的一種高級(jí)修復(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ù)效果 如下:

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

2. 原理

  • cv2.INPAINT_TELEA (Fast Marching Method 快速行進(jìn)算法),對(duì)位于點(diǎn)附近、邊界法線(xià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ù)等高線(xiàn)(連接具有相同強(qiáng)度的點(diǎn)的線(xiàn),就像等高線(xiàn)連接具有相同高程的點(diǎn)一樣)。
  • OpenCV未實(shí)現(xiàn)的:Content-Aware Fill 內(nèi)容感知填充算法,這是Adobe Photoshop中使用的一種高級(jí)修復(fù)技術(shù)。

3. 源碼

# 圖像修復(fù)交互式案例——通過(guò)水流填充算法來(lái)修復(fù)被破壞的圖像區(qū)域;
# 使用倆種方法進(jìn)行修復(fù)
# cv2.INPAINT_TELEA (Fast Marching Method 快速行進(jìn)算法),對(duì)位于點(diǎn)附近、邊界法線(xià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ù)等高線(xiàn)(連接具有相同強(qiáng)度的點(diǎn)的線(xiàn),就像等高線(xiàn)連接具有相同高程的點(diǎn)一樣)。

# USAGE 
# python inpaint.py D:/deepLearning/py-demo/20210808/images/ml.jpg

# 按下鼠標(biāo)左鍵,添加點(diǎn)、線(xià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  # 線(xiàn)起始點(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python之?dāng)M合的實(shí)現(xiàn)

    python之?dāng)M合的實(shí)現(xiàn)

    這篇文章主要介紹了python之?dāng)M合的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 中秋快到了利用 python 繪制中秋禮物

    中秋快到了利用 python 繪制中秋禮物

    眼看中秋又快到了,中秋回家,帶什么禮物更讓家人歡心?今天小編就利用python幫你帶個(gè)對(duì)象回家,感興趣的小伙伴趕快來(lái)看,要記得收藏起來(lái)以免迷路
    2021-09-09
  • python學(xué)生管理系統(tǒng)

    python學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python學(xué)生管理系統(tǒng)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • python子線(xiàn)程如何有序執(zhí)行

    python子線(xiàn)程如何有序執(zhí)行

    最近在寫(xiě)一個(gè)項(xiàng)目,需要用到子線(xiàn)程,那么python子線(xiàn)程如何有序執(zhí)行,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python字符串與正則表達(dá)式詳細(xì)介紹

    Python字符串與正則表達(dá)式詳細(xì)介紹

    這篇文章主要介紹了Python字符串與正則表達(dá)式,Python字符串與正則表達(dá)式在Python中具有非常重要的地位,熟練的使用字符串與正則表達(dá)式能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • Python列表與元組操作技巧分享

    Python列表與元組操作技巧分享

    Python 中的列表(List)和元組(Tuple)是兩種常用的數(shù)據(jù)結(jié)構(gòu),它們都可以用來(lái)存儲(chǔ)一系列的元素,在本文中,我們將分享一些 Python 中列表和元組的操作技巧,幫助您更好地理解它們的用法和特性,需要的朋友可以參考下
    2024-05-05
  • Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    本篇文章主要介紹了Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能的示例。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Python字符串逆序的實(shí)現(xiàn)方法【一題多解】

    Python字符串逆序的實(shí)現(xiàn)方法【一題多解】

    今天小編就為大家分享一篇關(guān)于Python字符串逆序的實(shí)現(xiàn)方法【一題多解】,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Python如何使用字符打印照片

    Python如何使用字符打印照片

    這篇文章主要介紹了Python如何使用字符打印照片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • OpenCV圖像處理之圖像的二值化解讀

    OpenCV圖像處理之圖像的二值化解讀

    這篇文章主要介紹了OpenCV圖像處理之圖像的二值化解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論