算法介绍
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.传统方法的性能通常受限于数学模型的准确性和复杂性。它们在某些情况下可能无法处理复杂的图像修复任务,尤其是在需要高度自然合成的情况下。文章来源:https://www.toymoban.com/news/detail-844545.html
完成一个小作业基本是可以的,后面会继续出深度学习图像修复篇文章来源地址https://www.toymoban.com/news/detail-844545.html
到了这里,关于opencv图像修复FMM、NS图像修复算法GUI版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!