当前位置: 首页 > news >正文

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


如果没有方向
往哪里走都是前方
做自己的光 不需要多亮
曾受过的伤 会长出翅膀
大雨冲刷过的天空会更加明亮
流过泪的眼睛也一样
做自己的光 悄悄的发亮
逆风的方向 更容易飞翔
世界怎样在于你凝视它的目光
那未曾谋面过的远方
或许就在身旁
                     🎵 虎妹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

代码解析

  1. extract_images_from_folder函数:

    该函数从指定文件夹中读取所有PNG图像,并将它们调整为800x600的大小。
    调用enhance_colors函数增强图像中的其他颜色,降低黑、白、灰的影响。
    返回增强后的图像列表和文件名列表。

  2. detect_watermark函数:

    使用ORB特征检测器检测图像和水印模板中的关键点和描述符。
    使用BFMatcher对象匹配描述符。
    根据匹配距离排序,并过滤较好的匹配。
    如果好的匹配数量超过一个阈值,则认为检测到了水印。

  3. enhance_colors函数:

    将图像从BGR转换到HSV颜色空间。
    定义黑、白、灰色的HSV范围,并创建掩码。
    反转掩码以选择非黑白灰色区域。
    增强非黑白灰色区域的饱和度和亮度。
    将图像从HSV转换回BGR。

  4. main函数

    从指定文件夹中读取所有图像,并调用enhance_colors函数进行处理。
    读取水印图像。
    遍历每一张图像,使用特征匹配来检测水印。
    输出每张图像是否检测到水印及其匹配的质量。

结论

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

相关文章:

  • 如何从微软官方下载Edge浏览器的完整离线安装包
  • FISCO BCOS x GitLink,为国产开源技术生态注入新活力
  • 【源码】校园小情书小程序最新版 校园小程序开发 微信情书小程序 校园小情书小程序源代码
  • 探索密码哈希技术:原理、实现与安全性
  • 7、Spring之Bean生命周期~初始化
  • Linux内核 -- ftrace 调试工具培训
  • 【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现
  • PPT设置为本框的默认格式以及固定文本框
  • CorelDRAW2024官方最新中文破解版Crack安装包网盘下载安装方法
  • golang使用WaitGroup等待多个协程执行完成
  • 玄机靶场 第二章日志分析-mysql应急响应
  • 【运维】如何更换Ubuntu默认的Python版本,update-alternatives如何使用
  • 【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解
  • leetcode hot100 之 最长公共子序列
  • 工作总结1
  • 苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?
  • Kotlin 委托
  • 面试Flask需要知道的知识点1
  • 【目标检测】基于深度学习的车牌识别管理系统(含UI界面)【python源码+Pyqt5界面 MX_002期】
  • 【Nginx系列】基于请求头的分发
  • 福特汽车撤回业绩指引,警告关税或造成15亿美元利润损失
  • 中演协:五一假期全国营业性演出票房收入同比增长3.6%
  • 体坛联播|米兰逆转热那亚豪取3连胜,阿诺德官宣离开利物浦
  • G40迎来返程大车流,今明两日预计超13万辆车经长江隧桥进沪
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 熬夜又不想伤肝?方法只有一个