Python基于OpenCV的图像修复技术

一、实现效果预览

左边为修复前图像 ,中间为掩模图,右边为修改复图像如下

 

 

 二、修复算法介绍

1、算法INPAINT_TELEA介绍:

基于快速行进算法(FMM),从待修补区域的边界向区域内部前进,先填充区域边界像素。
选待修补区域小的领域,使用领域归一化加权和更新修复像素。(先修复待修改区域的边界,依据边界外正常的像素向内修复)

如图:

扫描二维码关注公众号,回复: 13476831 查看本文章

2、算法INPAINT_NS介绍:

        通过匹配待修复区域的梯度相邻来延伸等光强线,灰度相等的点连成线,通过填充颜色使区域内的灰度值变化最小

如图:

三、代码详解

1、导入numpy及cv2文件包,导入方法略

import numpy as np
import cv2

#读取图片
img = cv2.imread('pikachu.jpg')
#图像转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#灰度二值化
_,mask = cv2.threshold(cv2.cvtColor(img,cv2.COLOR_BGR2GRAY),100,255,cv2.THRESH_BINARY_INV)

2、创建掩模图像,代码如下,效果如下:

_,mask = cv2.threshold(gray,10,255,cv2.THRESH_BINARY_INV)

掩模图

3、添加修复算法(二选一)

#INPAINT_TELEA算法
dst = cv2.inpaint(img,mask,10,cv2.INPAINT_TELEA) #10为领域大小
#INPAINT_NS算法
dst = cv2.inpaint(img,mask,10,cv2.INPAINT_NS) #10为领域大小

4、显示各个图像

cv2.imshow('img0',img)#源图像
#cv2.imshow('img10',mask1)
cv2.imshow('img1',mask) #掩模图
cv2.imshow('img2',dst) #修改处理后的图像
cv2.waitKey(0)
cv2.destroyAllWindows() 

四、完整源码

import numpy as np
import cv2

#读取图片
img = cv2.imread('pikachu.jpg')
#图像转换为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#灰度二值化
_,mask = cv2.threshold(cv2.cvtColor(img,cv2.COLOR_BGR2GRAY),100,255,cv2.THRESH_BINARY_INV)
#_,mask = cv2.threshold(gray,10,255,cv2.THRESH_BINARY_INV)
#mask1 = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
#第一种方法 img:输入图像;mask为单通道二值图掩模,非零位置为需要修复的地方;3:领域大小,在修复
#开路中图像素的范围
#dst = cv2.inpaint(img,mask,10,cv2.INPAINT_TELEA)
#第二种方法 INPAINT_NS
#区域内的灰度值变化最小。
dst = cv2.inpaint(img,mask,10,cv2.INPAINT_NS) #3:领域大小
cv2.imshow('img0',img)
#cv2.imshow('img10',mask1)
cv2.imshow('img1',mask)
cv2.imshow('img2',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/m0_49047167/article/details/107178467