【Python】使用OpenCV特征匹配检测图像中的【特定水印】

2025-09-04 13:17:01 世界杯经典歌曲

如果没有方向

往哪里走都是前方

做自己的光 不需要多亮

曾受过的伤 会长出翅膀

大雨冲刷过的天空会更加明亮

流过泪的眼睛也一样

做自己的光 悄悄的发亮

逆风的方向 更容易飞翔

世界怎样在于你凝视它的目光

那未曾谋面过的远方

或许就在身旁

🎵 虎妹Huu、承桓《做自己的光》

在图像处理中,识别和检测水印是一项重要任务,特别是在版权保护和验证领域。本文将介绍如何使用OpenCV和Python库来识别图像中的固定水印,即使水印的位置和角度可能不同。我们将使用特征匹配技术来实现这一目标。

安装所需的库

在开始之前,请确保你已经安装了必要的Python库:

pip install opencv-python numpy

代码实现

以下是完整的Python代码,展示了如何从文件夹中读取图像,增强图像颜色以凸显蓝色并降低黑白灰色的影响,然后使用特征匹配技术检测图像中的水印。

import cv2

import numpy as np

import os

def extract_images_from_folder(folder_path):

"""

从文件夹中读取所有PNG图像并进行预处理

"""

images = []

filenames = []

for filename in os.listdir(folder_path):

if filename.lower().endswith(".png"):

image_path = os.path.join(folder_path, filename)

image = cv2.imread(image_path)

# 调整图像大小为800x600

image = cv2.resize(image, (800, 600))

enhanced_image = enhance_colors(image)

images.append(enhanced_image)

filenames.append(filename)

return images, filenames

def detect_watermark(image, watermark_template):

"""

使用特征匹配检测图像中是否存在水印

"""

# 转换为灰度图像

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray_template = cv2.cvtColor(watermark_template, cv2.COLOR_BGR2GRAY)

# 使用ORB特征检测器

orb = cv2.ORB_create()

# 检测关键点和描述符

keypoints1, descriptors1 = orb.detectAndCompute(gray_image, None)

keypoints2, descriptors2 = orb.detectAndCompute(gray_template, None)

# 创建BFMatcher对象

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

# 匹配描述符

matches = bf.match(descriptors1, descriptors2)

# 根据匹配距离排序

matches = sorted(matches, key=lambda x: x.distance)

# 设定一个距离阈值,过滤较好的匹配

threshold = 70 # 可能需要调整此阈值

good_matches = [m for m in matches if m.distance < threshold]

# 检查匹配的数量是否足够

if len(good_matches) > 80: # 你可以调整这个阈值

return True, good_matches

else:

return False, None

def enhance_colors(image):

"""

增强图像中的其他颜色,降低黑、白、灰的影响

"""

# 将图像从BGR转换到HSV

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 创建一个掩码,选择非黑白灰色区域

# 定义黑色、白色和灰色的范围

lower_black = np.array([0, 0, 0])

upper_black = np.array([180, 255, 30])

lower_white = np.array([0, 0, 200])

upper_white = np.array([180, 30, 255])

lower_gray = np.array([0, 0, 31])

upper_gray = np.array([180, 30, 199])

# 创建掩码

mask_black = cv2.inRange(hsv_image, lower_black, upper_black)

mask_white = cv2.inRange(hsv_image, lower_white, upper_white)

mask_gray = cv2.inRange(hsv_image, lower_gray, upper_gray)

# 合并掩码

mask = mask_black | mask_white | mask_gray

# 反转掩码

mask = cv2.bitwise_not(mask)

# 增强非黑白灰区域的饱和度和亮度

hsv_image[:, :, 1] = np.where(mask > 0, hsv_image[:, :, 1] * 2, hsv_image[:, :, 1]) # 增强饱和度

hsv_image[:, :, 2] = np.where(mask > 0, hsv_image[:, :, 2] * 1.5, hsv_image[:, :, 2]) # 增强亮度

# 将图像从HSV转换回BGR

enhanced_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)

return enhanced_image

def main(folder_path, watermark_image_path):

"""

主函数,执行从文件夹读取图像并检测水印的流程

"""

images, filenames = extract_images_from_folder(folder_path)

watermark_template = cv2.imread(watermark_image_path)

for i, image in enumerate(images):

has_watermark, good_matches = detect_watermark(image, watermark_template)

if has_watermark:

print(f"Watermark detected in image {filenames[i]} with {len(good_matches)} good matches")

else:

print(f"No watermark detected in image {filenames[i]}")

if __name__ == "__main__":

folder_path = "img" # 替换为包含PNG文件的文件夹路径

watermark_image_path = "test.jpg" # 替换为你的水印图像路径

main(folder_path, watermark_image_path)

样本案例

水印案例

测试案例

HSV转换之后

匹配结果

Watermark detected in image img_1.png with 106 good matches

Watermark detected in image img_2.png with 107 good matches

Watermark detected in image img_3.png with 147 good matches

No watermark detected in image img_4.png

代码解析

extract_images_from_folder函数:

该函数从指定文件夹中读取所有PNG图像,并将它们调整为800x600的大小。

调用enhance_colors函数增强图像中的其他颜色,降低黑、白、灰的影响。

返回增强后的图像列表和文件名列表。

detect_watermark函数:

使用ORB特征检测器检测图像和水印模板中的关键点和描述符。

使用BFMatcher对象匹配描述符。

根据匹配距离排序,并过滤较好的匹配。

如果好的匹配数量超过一个阈值,则认为检测到了水印。

enhance_colors函数:

将图像从BGR转换到HSV颜色空间。

定义黑、白、灰色的HSV范围,并创建掩码。

反转掩码以选择非黑白灰色区域。

增强非黑白灰色区域的饱和度和亮度。

将图像从HSV转换回BGR。

main函数:

从指定文件夹中读取所有图像,并调用enhance_colors函数进行处理。

读取水印图像。

遍历每一张图像,使用特征匹配来检测水印。

输出每张图像是否检测到水印及其匹配的质量。

结论

通过这种方法,可以识别具有不同位置和角度的固定类型水印。使用特征匹配技术,即使水印的位置和角度有所变化,也能进行有效的识别和检测。希望这篇文章对你有所帮助。如果有任何问题或需要进一步的修改,请在评论区告诉我。