在Python中从图像获取水印掩码

2024-10-01 05:05:46 发布

您现在位置: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来做这个


Tags: ofpath图像numpyimgdef图片float
1条回答
网友
1楼 · 发布于 2024-10-01 05:05:46

在使用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, None, 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, 0, -1)

img = cv2.imread("watermark.jpg")
get_watermark(img)
cv2.imshow("Watermark", img)
cv2.waitKey(0)

输出:

enter image description here

相关问题 更多 >