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()