opencv图像修复FMM、NS图像修复算法GUI版

注意注意注意:代码所在的目录,不能有中文路径,包括图片不能有中文名称,不然会报错

算法介绍

FMM (Fast Marching Method) 和 NS (Navier-Stokes) 是两种不同的图像修复方法,通常用于填充缺失、损坏或污染的图像区域。它们在图像处理中有不同的应用场景和原理。

FMM算法

FMM应用场景:FMM主要用于基于物理模型的图像修复,例如医学图像处理、地理信息系统(GIS)和自然图像复原。

FMM原理:FMM基于波动方程的数值解。它通过沿着波的前进路径来填充缺失区域,从已知的像素值开始,不断向外扩展。该方法模拟了波动传播的方式,因此能够很好地处理连续和自然图像的修复,产生平滑和自然的结果。FMM通常会更好地保留图像中的细节信息

NS算法

NS场景:NS方法通常用于图像复原,包括去噪和修复。这是一种更广泛用于实际应用的方法,包括数字摄影中的红眼修复、去除污点、去除线缆或水印等任务

NS原理:NS方法基于流体动力学的方程,使用偏微分方程(PDE)来模拟图像的复原过程。通过求解PDE,NS方法可以自然地填充图像中的缺失部分,并且在图像中保留边缘和细节信息。NS方法通常更适用于实时或批量处理。

小结

在实际应用中,选择使用哪种方法取决于图像修复任务的性质和要求。通常情况下,NS方法更常用,因为它具有较低的计算成本,适用于许多图像修复场景。如果需要更高精度的修复,并且计算资源允许,FMM方法可以提供更好的结果。

Gui界面设计

使用Tkinter 库创建用于图像修复的简单图形用户界面 (GUI)。修复是填充图像缺失或损坏部分的过程。实现加载图像,在图像中损坏或缺失的区域上绘制,然后使用 OpenCV 执行修复

全部代码

from tkinter import *
import tkinter.filedialog
from PIL import Image, ImageFilter, ImageTk
import os
import tkinter.messagebox
import tkinter.ttk
import numpy as np
import cv2 as cv


sizex=0
sizey=0
quality=100
path=''
output_path=None
output_file=None
root = Tk()
root.geometry()
label_img=None

# 设置窗口标题
root.title('图片智能修复')

# 用于处理鼠标的OpenCV实用类
class Sketcher:

    def __init__(self, windowname, dests, colors_func):
        self.prev_pt = None
        self.windowname = windowname
        self.dests = dests
        self.colors_func = colors_func
        self.dirty = False
        self.show()
        cv.setMouseCallback(self.windowname, self.on_mouse)

    def show(self):
        cv.imshow(self.windowname, self.dests[0])
        #cv.imshow(self.windowname + ": mask", self.dests[1])
     
    # 鼠标处理的onMouse函数

    def on_mouse(self, event, x, y, flags, param):
        pt = (x, y)
        if event == cv.EVENT_LBUTTONDOWN:
            self.prev_pt = pt
        elif event == cv.EVENT_LBUTTONUP:
            self.prev_pt = None

        if self.prev_pt and flags & cv.EVENT_FLAG_LBUTTON:
            for dst, color in zip(self.dests, self.colors_func()):
                cv.line(dst, self.prev_pt, pt, color, 5)
            self.dirty = True
            self.prev_pt = pt
            self.show()



#载入图像
def loadimg():
    global path
    global sizex
    global sizey
    path = tkinter.filedialog.askopenfilename()
    lb.config(text=path)
    if path != '':
        try:
            img = Image.open(path)
            sizex=img.size[0]
            sizey=img.size[1]
            img=img.resize((400,400),Image.ANTIALIAS)
            global img_origin
            img_origin = ImageTk.PhotoImage(img)
            global label_img
            label_img.configure(image=img_origin)
            label_img.pack()

        except OSError:
            tkinter.messagebox.showerror('错误', '图片格式错误,无法识别')

def inpaint(path):
    def function(img):
        try:
       
        # 创建一个原始图像的副本
            img_mask = img.copy()
        # 创建原始图像的黑色副本
        # Acts as a mask
            inpaintMask = np.zeros(img.shape[:2], np.uint8)
  
        # Create sketch using OpenCV Utility Class: Sketcher
            sketch = Sketcher('image', [img_mask, inpaintMask], lambda : ((255, 255, 255), 255))

           
            ch = cv.waitKey()
           
            if ch == ord('t'):
            # 使用Alexendra Telea提出的算法。快速行进法
                res = cv.inpaint(src=img_mask, inpaintMask=inpaintMask, inpaintRadius=3, flags=cv.INPAINT_TELEA)
                cv.imshow('Inpaint Output using FMM', res)
                cv.waitKey()
                cv.imwrite(path, res)
 
            if ch == ord('n'):
            # 使用Bertalmio, Marcelo, Andrea L. Bertozzi和Guillermo Sapiro提出的算法:Navier-Stokes, 流体动力学,以及图像和视频的绘制
                res = cv.inpaint(src=img_mask, inpaintMask=inpaintMask, inpaintRadius=3, flags=cv.INPAINT_NS)
                cv.imshow('Inpaint Output using NS Technique', res)
                cv.waitKey()
                cv.imwrite(path, res)

            if ch == ord('r'):
                img_mask[:] = img
                inpaintMask[:] = 0
                sketch.show()

            cv.destroyAllWindows()
        except ValueError as e:
            tkinter.messagebox.showerror('',repr(e))


    if path != '':
        try:
            img = Image.open(path)
            img1=cv.imread(path,cv.IMREAD_COLOR)
            img1 = function(img1)
            

        except OSError:
            lb.config(text="您没有选择任何文件")
            tkinter.messagebox.showerror('错误', '图片格式错误,无法识别')

    else:
        tkinter.messagebox.showerror('错误', '未发现路径')

lb = Label(root,text = '会在原路径保存图像')
lb.pack()

lb1 = Label(root,text = '警告:会覆盖原图片',width=27,height=2,font=("Arial", 10),bg="red")
lb1.pack(side='top')

btn = Button(root,text="选择图片",command=loadimg)
btn.pack()


lb2 = Label(root,text = '按下开始绘制想要修复的位置')
lb2.pack()

btn2 = Button(root,text="开始",command=lambda:inpaint(path))
btn2.pack()

lb3 = Label(root,text = '绘制完成使用以下步骤')
lb3.pack()

lb4 = Label(root,text = 't-使用FMM修复\nn-使用NS方法修复\nr-重新绘制区域')
lb4.pack()

label_img = tkinter.Label(root, text='原始图片')
label_img.pack()


root.mainloop()

运行效果和使用方法

注意注意注意:代码所在的目录,不能有中文路径,包括图片不能有中文名称,不然会报错

上面的代码复制之后,需要你配置好环境就行,运行界面
在这里插入图片描述
1.选择一张图片
在这里插入图片描述
2.点击开始按钮,在原图上面绘制
在这里插入图片描述
3.绘制完成之后,按键盘的t键是FMM修复算法,按键盘的n键是NS修复算法,按键盘的r键重新绘制,按完回车就行,结果如下
在这里插入图片描述

环境安装

requirements.txt文件如下,你们自己在电脑里面新建一个requirements.txt把下面的代码复制进去就行

numpy==1.16.4
opencv_python==4.1.0.25
Pillow==8.1.2

总结

缺点:

1.传统方法通常基于数学模型和信号处理技术,如波动方程或偏微分方程。这些方法依赖于数学模型来填充缺失或受损的图像区域

2.传统方法的性能通常受限于数学模型的准确性和复杂性。它们在某些情况下可能无法处理复杂的图像修复任务,尤其是在需要高度自然合成的情况下。

完成一个小作业基本是可以的,后面会继续出深度学习图像修复篇

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挂科边缘(毕业版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值