OpenCV實驗:圖片加水印

第二篇:圖片添加水印(加 logo)


1. 實驗原理

水印原理

  • 圖片添加水印是圖像疊加的一種應用,分為透明水印不透明水印
  • 水印的實現通常依賴于像素值操作,將水印圖片融合到目標圖片中,常用的方法包括:
    • 位運算:通過掩碼(Mask)將目標區域清空,再將水印疊加到清空的區域。
    • Alpha 混合(Alpha Blending):通過加權計算將水印半透明地融合到目標圖片。

步驟

  1. 將水印圖片轉為灰度圖,并通過閾值處理生成二值化掩碼。
  2. 利用掩碼清空背景圖像中水印位置的區域。
  3. 將水印圖片嵌入到清空區域,完成水印添加。

2. 實驗代碼

以下為具體代碼實現:

import cv2# 讀取背景圖像
img = cv2.imread("./background.jpeg")# 讀取兩個 logo 圖像
logo = cv2.imread("./logo.png")# --------------------處理第一個 logo--------------------# 將 logo 轉換為灰度圖像,用于后續的二值化處理
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)# 對灰度圖像進行二值化處理,生成二值掩碼
_, logo_binary = cv2.threshold(logo_gray,             # 輸入的灰度圖像0,                     # 閾值(自動確定)255,                   # 二值化后的最大值cv2.THRESH_BINARY_INV  # 反閾值化,將前景變為黑色,背景變為白色
)# 定義第一個 logo 的插入位置 (x1, y1)
x1, y1 = 10, 100# 從背景圖中截取一個與 logo 大小相同的 ROI(Region of Interest)區域
ROI = img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]]# 使用掩碼進行位與運算,將 ROI 中對應 logo 的位置清空
ROI_logo = cv2.bitwise_and(ROI, ROI, mask=logo_binary)# 將清空的 ROI 區域與 logo 圖像進行加法操作,完成 logo 的融合
img_logo = cv2.add(ROI_logo, logo)# 將融合后的 logo 替換回背景圖的對應位置
img[y1:y1+logo.shape[0], x1:x1+logo.shape[1]] = img_logo# --------------------顯示最終結果--------------------# 顯示最終結果圖像
cv2.imshow('image', img)# 等待用戶按鍵退出窗口
cv2.waitKey(0)# 銷毀所有窗口
cv2.destroyAllWindows()

3. 實驗現象

實驗結果

  1. 原始圖片:背景圖為一個沒有水印的圖片。
  2. 水印圖像:Logo 被疊加到背景圖的指定位置,與背景圖的像素融合,看起來像是原始圖像的一部分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62714.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WinDbg 中使用 !process 命令

PROCESS 81a979d0 SessionId: 0 Cid: 0210 Peb: 7ffda000 ParentCid: 063cDirBase: 145b9000 ObjectTable: e12fed70 HandleCount: 53.Image: Dbgview.exe 1. PROCESS 81a979d0 意義:PROCESS 是該進程對象的內核地址。用途:可以使用這個地址獲…

深入解析下oracle的number底層存儲格式

oracle數據庫中,number數據類型用來存儲數值數據,它既可以存儲負數數值,也可以存儲正數數值。相對于其他類型數據,number格式的數據底層存儲格式要復雜得多。今天我們就詳細探究下oracle的number底層存儲格式。 一、環境搭建 1.…

SparkSQL與Hive的整合

文章目錄 SparkSQL與Hive的整合1.1. Spark On Hive1.1.1. Hive的準備工作1.1.2. Spark的準備工作1.1.3. Spark代碼開發1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查詢引擎1.4.1. 開啟ThriftServer服務1.4.2. beeline連接ThriftServer…

(持續更新)linux網絡編程中需要注意的內核參數與網絡機制

目錄 零、基本說明 一、內核參數 二、相關機制 1、GRO (1)適用場景 (2)優缺點 (3)相關操作 2、Nagle 算法 (1)基本規則 (2)優缺點 (3&…

DevExpress WPF中文教程:Grid - 如何移動和調整列大小?(一)

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Matlab筆記---clear、clc、clear all應用

在MATLAB中,clear、clc 和 clear all 是三個常用的命令,它們各自有不同的作用: clc: clc 命令用于清除MATLAB命令窗口中的所有輸出。它不會刪除任何變量、函數或文件,只是清除屏幕上的顯示內容,讓你可以更…

銘記一次項目重大事故

在程序的世界里,bug 就像隱藏在暗處的小怪獸,時不時跳出來搗亂。而職業生涯中,總有那么一個或幾個 bug 讓我們刻骨銘心。它或許讓項目差點夭折,或許讓你熬了無數個通宵,或許有著離奇的出現方式和曲折的解決過程。無論是…

Qt 一個簡單的QChart 繪圖

Qt 一個簡單的QChart 繪圖 先上程序運行結果圖&#xff1a; “sample9_1QChart.h” 文件代碼如下&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必須這么設置 QT_CHARTS_USE_NAME…

分布式事物XA、BASE、TCC、SAGA、AT

分布式事務——Seata 一、Seata的架構&#xff1a; 1、什么是Seata&#xff1a; 它是一款分布式事務解決方案。官網查看&#xff1a;Seata 2.執行過程 在分布式事務中&#xff0c;會有一個入口方法去調用各個微服務&#xff0c;每一個微服務都有一個分支事務&#xff0c;因…

MySQL為什么使用B+樹來作索引

我來詳細解釋一下B樹的結構和特點。 graph TDA[根節點 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[9…

python 下載 b站視頻 和音頻

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一個從外部得到的單個視頻ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

2024年06月中國電子學會青少年軟件編程(Python)等級考試試卷(五級)答案 + 解析

青少年軟件編程(python)等級考試試卷(五級) 一、單選題(共25題,共50分) range()函數的基本用法是什么?( ) A. 生成一個等差數列 B. 生成一個隨機數列 C. 生成一個遞增數列 D. 生成一個遞減數列 正確答案:A 答案解析:range() 函數用于生成一個等差數列,其中起始值、…

以太網鏈路詳情

文章目錄 1、交換機1、常見的概念1、沖突域2、廣播域3、以太網卡1、以太網卡幀 4、mac地址1、mac地址表示2、mac地址分類3、mac地址轉換為二進制 2、交換機的工作原理1、mac地址表2、交換機三種數據幀處理行為3、為什么會泛洪4、轉發5、丟棄 3、mac表怎么獲得4、同網段數據通信…

Shell編程 腳本的運行方式與注釋

目錄 shell腳本的運行方式 1. 路徑運行 2.bash或sh加腳本運行 ?編輯 3.source在加腳本路徑運行 shell腳本注釋 單行注釋 多行注釋 shell腳本的運行方式 我們在/usr/etc/demo01目錄下新建了一個腳本 a.sh &#xff0c;腳本內容是要求輸出數字1&#xff0c;怎么運行呢 1…

獲取淘寶商品評論數據的API應用:市場調研|產品更新|用戶數據

下面是一段我用item_review&#xff08;獲取商品評論數據&#xff09;抓來的商品評論數據&#xff1a; "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…

智算網絡中Scale-out和Scale-up網絡的技術原理

智算網絡中Scale-out網絡和Scale-up網絡的本質區別是什么&#xff1f; 一、什么是智算中心的Scale-out網絡和Scale-up網絡 數據中心網絡總體上可分為兩大類&#xff1a;通算網絡和智算網絡。通算網絡主要用于支持傳統的計算任務和應用&#xff0c;如企業的IT系統、網站托管、電…

HCIA筆記7--OSPF協議入門

文章目錄 0. 路由分類1. OSPF介紹1.1 概念1.2 報文類型 2. 鄰接關系的建立2.1 鄰居關系的建立2.2 鄰接關系的形成2.3 ospf狀態機 3. DR與BDR3.1 為什么要有DR和BDR&#xff1f;3.2 DR和BDR的選舉原則 4. ospf的配置4.1 內部優先級 5. 問題5.1 三層環路如何解決&#xff1f; Ref…

C05S06-Nginx的內置變量和代理

一、常見內置變量 內置變量說明$uri請求的URL&#xff0c;不包括主機和參數$request_uri請求的URL&#xff0c;包括主機和參數$host請求的主機名$http_user_agent客戶端信息&#xff0c;瀏覽器和操作系統$remote_addr客戶端IP地址$remote_port客戶端端口$server_addr服務端IP地…

mysql排序問題

mysql 建數據庫時&#xff0c;需要指定 字符集 和 排序規則 建表時&#xff0c;也可以指定 也可以指定具體的字段 安照下面的sql順序執行插入&#xff0c;它們的排序是什么樣的&#xff1f; INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

JAVA 圖形界面編程 AWT篇(1)

前言 為了應對JAVA課設&#xff0c;小編走上了java的圖形界面編程的道路&#xff0c;通過博客分享自己的學習歷程&#xff0c;并進行筆記的記錄。 AWT&#xff08;Abstract Window Toolkit&#xff09;介紹 AWT&#xff08;抽象窗口工具包&#xff09;是 Java 最早的圖形用戶界…