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

news2024/11/17 7:56:57

如果没有方向
往哪里走都是前方
做自己的光 不需要多亮
曾受过的伤 会长出翅膀
大雨冲刷过的天空会更加明亮
流过泪的眼睛也一样
做自己的光 悄悄的发亮
逆风的方向 更容易飞翔
世界怎样在于你凝视它的目光
那未曾谋面过的远方
或许就在身旁
                     🎵 虎妹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函数进行处理。
    读取水印图像。
    遍历每一张图像,使用特征匹配来检测水印。
    输出每张图像是否检测到水印及其匹配的质量。

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1818035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Intel 8080接口与Motorola 6800接口定义与应用

本文介绍Intel 8080接口与Motorola 6800接口定义与应用。 Intel 8080接口与Motorola 6800接口是常用的并行总线接口&#xff0c;在MCU与外设直接的接口中经常用到&#xff0c;如MCU与LCD接口&#xff0c;MCU与FPGA之间的接口。本文介绍Intel 8080接口与Motorola 6800接口定义&…

Springboot的小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

通用大模型VS垂直大模型,相辅相成!

1.通用大模型&#xff1a; 如OpenAI的GPT系列、Google的PaLM等&#xff0c;因其广泛的训练数据来源和强大的泛化能力&#xff0c;展现出在多种任务和场景中的应用潜力。它们能够处理从文本生成、代码编写到语言翻译等多种复杂任务&#xff0c;适应性强&#xff0c;减少了针对单…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点&#xff1a; ● 模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用12位AD转换器&#xff0c;测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高&…

CPN tools学习——可执行的 PN

目录 1添加令牌 2.转换防护Guard 1添加令牌 左侧新建颜色集和变量的声明定义&#xff1a; 为库所分配颜色集&#xff1a;左键tab键 P1处&#xff1a;添加多重集合&#xff0c;表示添加了两个令牌&#xff0c;第一个令牌值为A&#xff0c;第二个为B。 P2处&#xff1a;表示…

VMware清理拖拽缓存

磁盘空间越用越小&#xff0c;如何快速解决磁盘空间的问题&#xff0c;甩掉烦恼 安装VM tools之后可以通过拖拽的方式把文件拉入虚拟机之中。但每一次拖拽&#xff0c;其实都是现在cache文件夹里面生成一个同样的文件&#xff0c;并使用cp拷贝的方式将其拷贝到拖拽放置的目录中…

云平台DNS故障导致网站访问卡顿异常排查过程,wireshark、strace等工具在实际问题排查过程中的应用方法

一、问题现象 项目上使用华为私有云&#xff0c;前段时间华为升级云平台后&#xff0c;云上用户反馈业务系统出现卡顿&#xff0c;之前几秒可以刷新出来的页面现在需要几十秒。提供了一个比较明显的url和curl调用方法。 10.213.x.xxx:8082/files/login curl -H "Content-…

泰迪智能科技携手广西科技大学理学院共建“上进双创工作室”

6月12日&#xff0c;广东泰迪智能科技股份有限公司携手广西科技大学理学院在泰迪智能科技产教融合实训中心举行“上进双创工作室”签约揭牌仪式&#xff0c;标志“泰迪科技广西科大上进双创工作室”的正式启动。 仪式由泰迪智能科技运营中心总监翁梦婷主持。广西科技大学理学院…

使用 Elasticsearch 设计大规模向量搜索

作者&#xff1a;Jim Ferenczi 第 1 部分&#xff1a;高保真密集向量搜索 简介 在设计向量搜索体验时&#xff0c;可用选项的数量之多可能会让人感到不知所措。最初&#xff0c;管理少量向量很简单&#xff0c;但随着应用程序的扩展&#xff0c;这很快就会成为瓶颈。 在本系列…

ATA-3040C功率放大器的正确使用方法

功率放大器是一种用于增强电信号功率的重要设备。正确使用功率放大器可以确保信号的稳定放大&#xff0c;并避免设备损坏。下面将介绍功率放大器的正确使用方法。 确定输入信号的功率范围&#xff1a;在使用功率放大器之前&#xff0c;需要确定输入信号的功率范围。过大的输入功…

白酒:茅台镇白酒的品牌故事与传奇色彩

茅台镇&#xff0c;这个位于中国贵州省遵义市仁怀市的小镇&#xff0c;因为出产的白酒品质卓着&#xff0c;被誉为“世界名酒之乡”。在这片神奇的土地上&#xff0c;云仓酒庄以其豪迈白酒&#xff0c;书写了一段段品牌故事与传奇色彩。 云仓酒庄豪迈&#xff0c;酿造于茅台镇的…

shell文本三剑客 awk 和 grep

awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep&#xff0c;sed&#xff0c;awk。行内将之称为文本三剑客&#xff0c;就功能量和效率来看&#xff0c;awk是当之无愧的文本三…

取模软件测试版生成的有斜线,但测试字库的功能是好用无限制。只需要自己开发一个字库生成软件。IDA工具,如何搜中文

IDA工具&#xff0c;如何搜中文 在 IDA (Interactive Disassembler) 中搜索中文字符串&#xff0c;可以按照以下步骤操作&#xff1a; 方法一&#xff1a;使用“搜索文本”功能 打开 IDA 并加载目标文件&#xff1a;启动 IDA 并打开你需要分析的二进制文件。打开搜索文本对话…

厨房燃气安全新保障:红外点式可燃气体报警器的作用

在现代家庭生活中&#xff0c;厨房的安全问题日益受到人们的关注。其中&#xff0c;燃气泄漏和火灾是厨房安全的主要隐患。 据统计&#xff0c;90%的火灾源于燃气泄漏&#xff0c;而厨房又是燃气使用最为频繁的区域。因此&#xff0c;一款高效、可靠的可燃气体报警器对于保障家…

原生JS如何实现可配置DM码

原生JS如何实现可配置DM码 一、 DM码简介 1、 Data Matrix码 Data Matrix码是一种二维条形码,简称DM码,由美国公司International Data Matrix, Inc.(I.D. Matrix)在1994年发明,Data Matrix码中的行数和列数随二维码中存储的信息量而增加,信息限值是2335个字母数字字符…

LangChain 与 Elastic 合作为 RAG 添加向量数据库和语义重排序

作者&#xff1a;来自 Elastic Max Jakob 在过去的一年中&#xff0c;我们看到了生成式人工智能领域的许多进展。许多新服务和库应运而生。LangChain 已成为使用大型语言模型 (LLM) 构建应用程序的最受欢迎的库&#xff0c;例如检索增强生成 (RAG) 系统。该库使原型设计和试验不…

汇凯金业:黄金5g工艺是什么意思

黄金5g工艺是一种新型黄金饰品工艺&#xff0c;它在生产加工过程中&#xff0c;通过在黄金中添加一定量的稀有元素&#xff0c;使得黄金的分子结构更加紧密。这种创新工艺不仅提升了黄金的纯度&#xff0c;还改善了其物理特性&#xff0c;使其成为市场上一种备受关注的黄金饰品…

到底要不要报考“通信工程”?(2024版)

又到了高考季。为了方便广大考生全面了解“通信工程”专业&#xff0c;小枣君特此更新了这篇经典文章。 █ “通信工程”的基本介绍 通信工程&#xff0c;英文全称叫做Communication Engineering&#xff0c;是一门重要的工学基础学科。 根据教育部《学位授予和人才培养学科目录…

LLM主要类别架构

LLM主要类别架构介绍 LLM主要类别 LLM本身基于transformer架构。自2017年&#xff0c;attention is all you need诞生起&#xff0c;transformer模型为不同领域的模型提供了灵感和启发。基于原始的Transformer框架&#xff0c;衍生出了一系列模型&#xff0c;一些模型仅仅使用…