48. 图片修补
2019-11-13 本文已影响0人
十里江城
将一张完好的图片破坏,之后使用inpaint()方法进行修补
破坏图片,即画线:
import cv2
import numpy as np
img = cv2.imread('1.jpg', 1)
cv2.imshow('src', img)
# 在完整的图片上画线
# 横坐标(height)画线长50, 竖直方向
for i in range(200, 250):
img[i, 200] = (255, 255, 255)
img[i, 200 + 1] = (255, 255, 255)
img[i, 200 - 1] = (255, 255, 255)
# 纵坐标(width)画线长200, 水平方向
for i in range(100, 300):
img[250, i] = (255, 255, 255)
img[250 + 1, i] = (255, 255, 255)
img[250 - 1, i] = (255, 255, 255)
# 将破坏后的图片写入文件
cv2.imwrite('1_line.jpg', img)
cv2.imshow('image', img)
cv2.waitKey(0)
结果如下:

修补图片:
步骤:
- 读取待修复图片
- 创建修复掩码paint
- 修复图片
- 显示修复后的图片
import cv2
import numpy as np
# 1 显示图片
img = cv2.imread('1_line.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 2 创建修复掩码paint
# 创建通道为1的三维数组
paint = np.zeros((height, width, 1), np.uint8)
print('paint: ', paint.shape)
for i in range(200, 250):
# 白色
paint[i, 200] = 255
paint[i, 200 + 1] = 255
paint[i, 200 - 1] = 255
for i in range(100, 300):
paint[250, i] = 255
paint[250 + 1, i] = 255
paint[250 - 1, i] = 255
# 显示修复掩码
cv2.imshow('paint', paint)
# 3 修复图片
# 参数:
# 1)src 8位1通道或3通道图片: img
# 2)paint 修复掩码: paint, 8位1通道图像,非零像素表示要修复的区域
# 3)inpaintRadius 算法考虑的每个点的圆形邻域的半径: 3
# 4)flags: INPAINT_NS基于Navier-Stokes的方法和Alexandru Telea的INPAINT_TELEA方法
imgDst = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)
# 4 显示修复后的图片
cv2.imshow('imgDst', imgDst)
cv2.waitKey(0)
破坏线条的维度为, 374 、272为宽高信息:

修补后的图片中破坏痕迹不太明显了,原图片、破坏图片的线条和修补后的图片如下:
