opencv-python 图像修复

发布时间 2023-08-09 22:46:13作者: 寒水浮云

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