我尝试了一些示例(我目前正在使用CV2,如果其他库可以解决问题,请也建议),但是没有一个库,但没有一个库。我知道要走的方法是戴上口罩(例如在
帖中),但是它们都已经有蒙版的图像,但是我没有。 我试图做的是要戴上口罩的地方,我拒绝了黑白的饱和度,并创建了图像“ imagemask.jpg”,然后尝试以
for
循环的方式浏览像素:
mask = cv2.imread('imagemask.jpg')
new = []
rows, cols, _ = mask.shape
for i in range(rows):
new.append([])
#print(i)
for j in range(cols):
k = img[i, j]
#print(k)
if all(x in range(110, 130) for x in k):
new[-1].append((255, 255, 255))
else:
new[-1].append((0, 0, 0))
cv2.imwrite('finalmask.jpg', np.array(new))
之后,然后想将代码用于蒙版,但是我意识到“ finalmask.jpg”是一个完整的混乱...所以我没有尝试使用掩码的代码。
这实际上是可能的吗?我已经尝试了大约3个小时,但没有运气...
细分
图像中的watermark文本 filter
分割面膜,并尝试使二进制面膜尽可能清洁使用输入映像作为参考,将文本掩码用于
in-paint
现在,正如您已经看到的那样,棘手的部分正在细分文本。在尝试了一些技术和颜色空间后,我发现
CMYK
颜色空间 - 尤其是
KChannelAdaptive Thresholding
# Imports
import cv2
import numpy as np
# Read image
imagePath = "D://opencvImages//"
img = cv2.imread(imagePath+"0f5zZm.jpg")
# Store a deep copy for the inpaint operation:
originalImg = img.copy()
# Convert to float and divide by 255:
imgFloat = img.astype(np.float) / 255.
# Calculate channel K:
kChannel = 1 - np.max(imgFloat, axis=2)
OpenCV
转换,因此我必须手动使用contryversion公式来获取BGR
CMYK
(或K
频道:
K
操作,因此要小心K
。也许我们可以通过稍微亮度/对比度调整来改善此图像。只是一点点,我只是想将更多的文字与讨厌的眩光分开:
float
这是调整后的图像:
似乎在文字和眩光之间有更多的分离。好吧,让我们对这个坏男孩应用一个初始分割面膜:data types
您看到我在这里使用不那么远的# Apply a contrast/brightness adjustment on Channel K:
alpha = 0
beta = 1.2
adjustedK = cv2.normalize(kChannel, None, alpha, beta, cv2.NORM_MINMAX, cv2.CV_32F)
# Convert back to uint 8:
adjustedK = (255*adjustedK).astype(np.uint8)
在这里阈值吗?如果愿意,请随意调整这些参数。这是我得到的二进制图像:
Yeah,有很多噪音。这是我建议获得更清洁的面膜的建议:比文本有一些明显的斑点。同样,除文本外,还有其他斑点。让我们找到大斑点和小斑点,并提取它们。如果我们正确设置参数,则结果图像应包含文本。让我们看看:
Adaptive Thresholding
在这里,我正在使用称为
# Adaptive Thresholding on adjusted Channel K:
windowSize = 21
windowConstant = 11
binaryImg = cv2.adaptiveThreshold(adjustedK, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, windowSize, windowConstant)
的辅助功能。此功能返回图像的所有斑点,该斑点高于最小面积阈值。我将在答案结束时发布功能。同时,请查看这些酷图像:滤光了小斑点: 它们之间的区别:
,似乎某些角色没有在过滤操作中幸存下来。这是因为眩光和文本的交集太多,无法获得清晰的分离。可能会受益于镶嵌结果的东西是在这个面具上的微妙模糊,以摆脱这种压缩别名。让我们涂抹一些
windowSize
以使面膜平滑一点:
# Get the biggest blobs on the image:
minArea = 180
bigBlobs = areaFilter(minArea, binaryImg)
# Filter the smallest blobs on the image:
minArea = 20
smallBlobs = areaFilter(minArea, binaryImg)
# Let's try to isolate the text:
textMask = smallBlobs - bigBlobs
cv2.imshow("Text Mask", textMask)
cv2.waitKey(0)
内核并不大,我只想要微妙的效果。这是结果:
最终,让我们使用镶嵌:
areaFilter
Gaussian Blur
函数:
# Blur the mask a little bit to get a
# smoother inpanting result:
kernelSize = (3, 3)
textMask = cv2.GaussianBlur(textMask, kernelSize, cv2.BORDER_DEFAULT)