python图片修复软件_Python利用Opencv实现图像修复

图像修复是图像处理中的一个应用. 图像处理的方式有传统算法和深度学习算法, 这里我们使用python中的esaygui和opencv实现一个图像修复的功能, 深度学习的算法github上面的开源项目也有很多, 爱学习的小伙伴们可以直接去github上面搜索学习, 话不多说,直接上代码:

import os

import numpy as np

import cv2

from easygui import *

BLUE = [255, 0, 0] # rectangle color

RED = [0, 0, 255] # PR BG

GREEN = [0, 255, 0] # PR FG

BLACK = [0, 0, 0] # sure BG

WHITE = [255, 255, 255] # sure FG

THICKNESS = -1 # solid brush circle 实心圆

DRAW_MASK = {'color': BLACK, 'val': 255}

drawing = False

radius = 3 # brush radius

value = DRAW_MASK

dst = None

def onmouse_input(event, x, y, flags, param):

"""

mouse callback function, whenever mouse move or click in input window this function is called.

只要鼠标在input窗口上移动(点击),此函数就会被回调执行

"""

# to change the variable outside of the function

# 为方法体外的变量赋值,声明global

global img, img2, drawing, value, mask, dst

# print(x,y)

# draw touchup curves

if event == cv2.EVENT_LBUTTONDOWN:

drawing = True

cv2.circle(img, (x, y), radius, value['color'], THICKNESS, lineType=cv2.LINE_AA)

cv2.circle(mask, (x, y), radius, value['val'], THICKNESS, lineType=cv2.LINE_AA)

elif drawing is True and event == cv2.EVENT_MOUSEMOVE:

cv2.circle(img, (x, y), radius, value['color'], THICKNESS, lineType=cv2.LINE_AA)

cv2.circle(mask, (x, y), radius, value['val'], THICKNESS, lineType=cv2.LINE_AA)

elif drawing is True and event == cv2.EVENT_LBUTTONUP:

drawing = False

cv2.circle(img, (x, y), radius, value['color'], THICKNESS, lineType=cv2.LINE_AA)

cv2.circle(mask, (x, y), radius, value['val'], THICKNESS, lineType=cv2.LINE_AA)

dst = inpain(img, mask)

img = dst.copy()

def inpain(input_image, mask_image):

dst = cv2.inpaint(input_image, mask_image, 1, cv2.INPAINT_TELEA)

# cv2.imshow('INPAINT_TELEA', dst)

return dst

if __name__ == "__main__":

# image: absolute image path

image = fileopenbox(msg='Select a image', title='Select', filetypes=[['*.png', '*.jpg', '*.jpeg', 'Image Files']])

if image is None:

print('\nPlease select a image.')

exit()

else:

print('Image selected: ' + image)

img = cv2.imread(image)

img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)

# resize the photo if it is too small

if max(img.shape[0], img.shape[1]) < 256:

img = cv2.resize(img, dsize=(0, 0), fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)

img2 = img.copy() # a copy of original image

mask = np.zeros(img.shape[:2], dtype=np.uint8) # mask initialized to PR_BG

# input and output windows

cv2.namedWindow('input')

cv2.setMouseCallback('input', onmouse_input)

cv2.moveWindow('input', img.shape[1] + 20, 100) # move input window

while 1:

cv2.imshow('input', img)

cv2.imshow("mask", mask)

k = cv2.waitKey(200)

# key bindings

if k == 27 or k == ord('q'): # esc to exit

break

elif k == ord('0'): # BG drawing

print(" mark background regions with left mouse button \n")

value = DRAW_MASK

elif k == ord('r'): # reset everything

print("resetting \n")

drawing = False

value = DRAW_MASK

img = dst.copy()

mask = np.zeros(img.shape[:2], dtype=np.uint8) # mask initialized to PR_BG

elif k == ord('['):

radius = 1 if radius == 1 else radius - 1

print('Brush thickness is', radius)

elif k == ord(']'):

radius += 1

print('Brush thickness is', radius)

elif k == ord('s'):

path = filesavebox('save', 'save the output.', default='patched_' + os.path.basename(image),

filetypes=[['*.jpg', 'jpg'], ['*.png', 'png']])

if path:

if not path.endswith('.jpg') and not path.endswith('.png'):

path = str(path) + '.png'

cv2.imwrite(path, dst)

print('Patched image is saved to', path)

cv2.destroyAllWindows()

Retouch Pilot v3.10.2是一款非常完美的相片修复工具,能够快速的将一系列老旧照片来进行修复,是一款非常实用的旧照片翻新修复工具,通过它可以对一些损坏的照片进行修复,可以修复旧片中的污点刮痕等细小的瑕疵,除此之外还可以将它当做水印去除工具来使用,可以完美地清除图片中的LOGO水印等,即使在复杂的背景下也可以完成。可真是老照片的救星啊! 以前我们修复破旧的老照片都是使用PS,对技术要求比较高,怎么办呢?后来出现了一款专门修复老照片的工具Retouch Pilot,使用简单。 在胶片摄影时代(俗称“传统摄影”时代),修复一张严重破损的旧照片,步骤非常复杂:首先把旧照片翻拍放大成低反差照片,之后用铅笔、毛笔和刀片进行修 整,之后再翻拍放大出照片;在新翻拍的照片上修整,再根据照片破损的程度和修复的效果决定翻拍和修整的次数,直到修好、翻拍放大出成品照片为止。 如今,有了电子计算机这个高效的工具,图像可以转为数字文件进行后期数字化处理,旧照片的修复就变得容易和简单了。不过,这是单纯从技术方面,或者说是修整工具方面来说的。如果不懂得修像的原理和方法,用再高级的电子计算机也是不行的,旧照片的修复都不会变得容易和简单。 使用方法可以看软件界面提供的DEMO。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值