如何解决在 Python 中从图像中获取水印掩码
我正在使用 Python 和 numpy。
我已将图片叠加在一起:
def compare_n_img(array_of_img_paths):
img_float_array = []
for path in array_of_img_paths:
img_float_array.append(load_img_as_float(path))
additionF = sum(img_float_array)/len(img_float_array)
addition = additionF.astype('uint8')
return addition
这,转换为灰度,给我这个 composite image。
水印在此合成中清晰可见。对于人类来说,很容易追踪。
我想要的结果是一张白色图像,水印的形状填充为黑色。因此,如果我用蒙版覆盖我的一张水印图像,水印将被完全覆盖。
我尝试在合成图像上使用边缘检测和阈值处理。但是我一直无法找到一种以编程方式隔离水印内容的方法。更不用说创建清晰的蒙版了。
如果可能,我想在纯 numpy 或 cv2 中执行此操作。
解决方法
您可以在使用 canny 边缘检测器之前尝试模糊图像。由于检测到的边缘太薄,膨胀和腐蚀的迭代可以解决问题。
检测到边缘后,背景中很可能会有很多噪声,因此过滤掉小面积的轮廓会很有效。
可能的情况如下:
import cv2
def process(img):
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray,(3,3),0)
img_canny = cv2.Canny(img_blur,161,54)
img_dilate = cv2.dilate(img_canny,None,iterations=1)
return cv2.erode(img_dilate,iterations=1)
def get_watermark(img):
contours,_ = cv2.findContours(process(img),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
img.fill(255)
for cnt in contours:
if cv2.contourArea(cnt) > 100:
cv2.drawContours(img,[cnt],-1,-1)
img = cv2.imread("watermark.jpg")
get_watermark(img)
cv2.imshow("Watermark",img)
cv2.waitKey(0)
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。