opencv-python 图像修复
opencv中的图像修复很简单,用相邻像素替换这些坏标记,使其看起来跟周围颜色一样。
图像修复函数是:inpaint(src,inpaintmask,inpaintradius,flags)
参数说明:
inpaintmask:图像掩码,单通道图像,大小和原图像一致,inpaintmask图像上除了需要修复的部分,其他地方全是0。
inpaintradius:每个点的圆心领域半径。
flags:修复图像的方法。INPAINT_NS(流体力学法), INPAINT_TELET(快速行进法)。
图像修复案例如下:
首先根据待修复图片制作mask。

利用鼠标事件,鼠标在待修复图像上面操作,鼠标左键按下拖动画白线,对应mask同时绘制白线(获取图片和mask):
import cv2
import numpy as np
start_point=(0,0) #鼠标开始坐标
lb_down = False #鼠标左键按下的标志,bool型
def mouse_event(event,x,y,flags,param):
global start_point,end_point,lb_down #如果全局变量是int或者str,那么如果想要在函数中对函数变量进行修改,则需要
#先在函数内,声明其为global,再进行修改,如果是list或者dict则可以直接修改
if event == cv2.EVENT_LBUTTONDOWN: #左键按下,更新鼠标坐标,启动按下标志
start_point = (x,y)
lb_down = True
elif event == cv2.EVENT_MOUSEMOVE and lb_down: #鼠标移动,绘制线
cv2.line(img,start_point,(x,y),(255,255,255),thickness=5)
cv2.line(mask,start_point,(x,y),(255,255,255),thickness=5)
start_point = (x,y) #只要鼠标移动,就更新鼠标的坐标
elif event == cv2.EVENT_LBUTTONUP: #左键释放
cv2.line(img,start_point,(x,y),(255,255,255),thickness=5) #鼠标点击后直接释放鼠标的时候也会绘制一个点
cv2.line(mask,start_point,(x,y),(255,255,255),thickness=5)
lb_down = False
cv2.namedWindow('image') #新建窗口,用来进行鼠标操作
img = cv2.imread('./strawberry.jpg')
mask = np.zeros(img.shape,np.uint8) #创建一个黑色mask图像
cv2.setMouseCallback('image',mouse_event) #设置鼠标回调
while True:
cv2.imshow('image',img)
cv2.imshow('mask',mask)
if cv2.waitKey(1)==ord('q'): #waitKey参数不能写0,写0就需要键盘输入才会继续
break
cv2.destroyAllWindows()

利用获取的mask进行图像修复:
import cv2
import numpy as np
img = cv2.imread('./image.png')
mask = cv2.imread('mask.png',0)
result = cv2.inpaint(img,mask,5,cv2.INPAINT_TELEA)
cv2.imshow('img',np.hstack((img,result)))
cv2.waitKey(0)
cv2.destroyAllWindows()


浙公网安备 33010602011771号