Python/OpenCV 修复方法通常不适合您的图像类型。它们在薄(划痕状)区域而不是大块上效果最好。您确实需要一个示例类型方法,例如https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/criminisi_tip2004.pdf https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/criminisi_tip2004.pdf。但 OpenCV 没有这个。
然而,我怀疑 OpenCV 方法在这里确实有效,因为你填充的是恒定的颜色(绿色)而不是纹理。因此,您最好尝试仅获取字母(字符)的掩码,而不是单词的矩形块。因此,为了向您展示我的意思,这是我的 Python/OpenCV 方法。
Input:
- 读取输入
- 绿色标志上的门槛
- 应用形态学将其关闭并保留为掩模1
- 将蒙版应用于图像以将标志的外部变黑
- 新图像中白色的阈值并保留为 mask2
- 应用形态扩张将其稍微放大并另存为mask3
- 进行修补
- 保存结果
import cv2
import numpy as np
# read input
img = cv2.imread('airport_sign.jpg')
# threshold on green sign
lower = (30,80,0)
upper = (70,120,20)
thresh = cv2.inRange(img, lower, upper)
# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (135,135))
mask1 = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# apply mask to img
img2 = img.copy()
img2[mask1==0] = (0,0,0)
# threshold on white
#gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
#mask2 = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
lower = (120,120,120)
upper = (255,255,255)
mask2 = cv2.inRange(img2, lower, upper)
# apply morphology dilate
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
mask3 = cv2.morphologyEx(mask2, cv2.MORPH_DILATE, kernel)
# do inpainting
result1 = cv2.inpaint(img,mask3,11,cv2.INPAINT_TELEA)
result2 = cv2.inpaint(img,mask3,11,cv2.INPAINT_NS)
# save results
cv2.imwrite('airport_sign_mask.png', mask3)
cv2.imwrite('airport_sign_inpainted1.png', result1)
cv2.imwrite('airport_sign_inpainted2.png', result1)
# show results
cv2.imshow('thresh',thresh)
cv2.imshow('mask1',mask1)
cv2.imshow('img2',img2)
cv2.imshow('mask2',mask2)
cv2.imshow('mask3',mask3)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Mask 3:
修复 1(Telea):
修补 2 (NS):