【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函数进行处理。
    读取水印图像。
    遍历每一张图像,使用特征匹配来检测水印。
    输出每张图像是否检测到水印及其匹配的质量。

结论

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洗地机哪个品牌好?四大实力拔尖单品力荐

洗地机哪个品牌好呢&#xff1f;想必姐妹们肯定觉得保持家里清洁是非常重要的&#xff0c;但是每天打扫卫生真的会让人整个都要疯狂&#xff0c;这不&#xff0c;救星洗地机就能派上用场了&#xff0c;干垃圾湿垃圾统统都能一次清理干净。只需轻轻一推&#xff0c;就能把扫地、…

SEO之预估流量及价值(二)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、新手上云 &#xff08;接上一篇。。。。&#xff09; 2、点击率 搜索结果页面各排名位置点击率也不精确。前面介绍的…

思科ospf+rip重发布配置命令

——————————————————————————————————————————— 基础配置 R1 Router>en #进入配置模式 Router#conf #进入配置模式 Router(config)#h…

初识C++ · 继承(1)

目录 前言&#xff1a; 1 继承的概念和定义 2 基类与子类的赋值转换 3 继承中的作用域 4 派生类的默认成员函数 4.1 构造函数 4.2 拷贝构造 4.3 赋值重载 4.4 析构函数 前言&#xff1a; 对于面向对象这门语言的三大特性 -> 封装 继承 多态&#xff0c;我们已经学…

数电逻辑门电路分析和Digital仿真

文章目录 1. 逻辑门电路 2. 非门&#xff08;NOT Gate&#xff09; 3. 与门&#xff08;AND Gate&#xff09; 4. 或门&#xff08;OR Gate&#xff09; 5. 与非门&#xff08;NAND Gate&#xff09; 6. 或非门&#xff08;NOR Gate&#xff09; 7. 异或门&#xff08;XO…

Java面试八股之什么是mybatis流式查询

什么是mybatis流式查询 Mybatis流式查询是一种处理大量数据的有效方法&#xff0c;它允许你以低内存消耗的方式来处理查询结果。传统的查询操作会一次性将所有数据加载到内存中&#xff0c;如果数据量非常大&#xff0c;可能会导致OutOfMemoryError&#xff08;OOM&#xff09…

Matlab个性化绘图第3期—带三维球标记的折线图

前段时间有会员在群里问该如何绘制下面这种带三维球标记的折线图&#xff1a; 本期内容就来分享一下带三维球标记的折线图的Matlab绘制思路。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需…

Shell脚本、相关命令;重定向、管道符、变量相关命令讲解

目录 Shell脚本 概念 执行命令流程的交互区别 交互式 非交互式 Shell脚本应用场景 Shell的作用 Shell的作用 —— 命令解释器&#xff0c;“翻译官” 列出系统中全部解释器 实验 脚本的基本书写格式和执行命令 在子bash下执行脚本 指定解释器的方式执行脚本 指定…

苹果入局AI手机 iOS 18将应用AI功能

当三星、华为等国内外手机厂商都在卷着造AI手机时&#xff0c;智能手机大佬苹果那边确一直没什么动静。直到今年5月&#xff0c;距离苹果 WWDC24 全球开发者大会还有十多天时&#xff0c;长期关注苹果的博社记者Mark Gurman放料&#xff0c;iOS 18系统中将会应用一些AI功能。 从…

JavaScript妙笔生花:打造沉浸式中国象棋游戏体验

前言 随着信息技术的飞速发展&#xff0c;Web开发领域也出现了翻天覆地的变化。JavaScript作为前端开发中不可或缺的编程语言&#xff0c;其重要性不言而喻。而当我们谈论到利用JavaScript打造一款沉浸式的中国象棋游戏体验时&#xff0c;我们不仅仅是在开发一个游戏&#xff0…

本地大模型服务 Ollama:从安装到使用

文章目录 前言一、下载安装1.1 官网安装1.2 压缩包安装1.3 docker 安装二、命令行使用2.1 常用命令2.2 模型列表2.3 使用三、Open-WebUI3.1 安装3.2 修改语言3.3 使用参考前言 Ollama 是专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源框架,它有如下几个特点…

SAP_FICO模块-获利能力段新增特征字段

业务背景&#xff1a; 公司有启用获利能力分析功能&#xff0c;有一个销售订单接口&#xff0c;是通过第三方销售订单管理平台推送数据到SAP的&#xff0c;用户希望对接新增一个编号ID到销售订单上&#xff0c;并且可以用KE24/KE30报表查看显示&#xff1b; 对于我这么一个后勤…

Tailwindcss 扩展默认配置来自定义颜色

背景 项目里多个Tab标签都需要设置同样的背景颜色#F1F5FF&#xff0c;在集成tailwindcss之前就是重复该样式&#xff0c;如下图&#xff1a; .body {background-color: #f1f5ff; }集成tailwindcss时&#xff0c;我们希望在class中直接设置该背景色&#xff0c;但是默认的tai…

python如何做报表系统

首先我们安装的python和PyQt5要保持一致&#xff0c;要么都是32位或者都是64位。 下载安装&#xff0c;安装完成之后我们记得要设置环境变量。 一路选择“下一步”就可以了。 安装完成之后我们需要验证是否成功。 pyqt5的安装直接安装就可以的&#xff0c;主要更改环境变量~~\p…

Serverless如何赋能餐饮行业数字化?乐凯撒思变之道

导语 | 在数字化浪潮席卷全球的今天&#xff0c;每一个行业都在经历着前所未有的变革。餐饮行业作为人们日常生活中不可或缺的一部分&#xff0c;更是面临着巨大的转型压力。如何完成数字化转型&#xff0c;打破传统经营模式的限制&#xff0c;成为摆在众多餐饮商家面前的一道难…

RocketMQ快速入门:如何保证消息不丢失|保证消息可靠性(九)

0. 引言 在金融、电商等对数据完整性要求极高的行业&#xff0c;消息的丢失可能会导致数据不一致&#xff0c;严重影响业务逻辑和数据统计&#xff0c;也影响客户体验&#xff0c;所以在很多业务场景下&#xff0c;我们都要求数据不能丢失。而rocketmq中&#xff0c;如何对消息…

集合进阶(泛型、泛型通配符、数据结构(二叉树、平衡二叉树、红黑树

一、泛型类、泛型方法、泛型接口 1、泛型概述 泛型&#xff1a;是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。泛型的格式&#xff1a;<数据类型>注意&#xff1a;泛型只能支持引用数据类型。 泛型的好处 1、统一数据类型。 …

建筑主体沉降观测规范详解

随着城市化进程的加速&#xff0c;高层建筑和大型建筑项目日益增多&#xff0c;建筑主体的沉降观测工作显得尤为重要。沉降观测是确保建筑安全稳定的关键环节&#xff0c;对于预防建筑安全事故、保障人民生命财产安全具有重要意义。本文将详细解析建筑主体沉降观测的规范和要求…

【机器学习】线性回归:从基础到实践的深度解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 线性回归&#xff1a;从基础到实践的深度解析引言一、线性回归基础1.1 定义与目…

Word和Excel如何快速对齐姓名

日常工作经常遇到整理参会人员名单时&#xff0c;有2字姓名、3字姓名&#xff0c;为保证文档美观&#xff0c;你是否还在一个一个空格在敲空格&#xff1f; 今天刘小生分享如何在Word和Excel中快速对齐姓名&#xff0c;快来练起来吧&#xff01; 1. Word姓名对齐 【第一步】…