OpenCV實現數字水印的相關函數和示例代碼

OpenCV計算機視覺開發實踐:基于Qt C++ - 商品搜索 - 京東

實現數字水印的相關函數

用OpenCV來實現數字水印功能,需要使用一些位操作函數,我們需要先了解一下這些函數。

1. bitwise_and函數

bitwise_and函數是OpenCV中的位運算函數之一,用于對兩幅二值圖像進行按位與操作。具體來說,對于每個像素,將兩幅輸入圖像相應位置的像素值分別進行按位與運算,輸出的結果圖像的對應像素值即為這兩幅輸入圖像對應像素值的按位與結果。

bitwise_and函數的語法如下:

void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray());

其中,src1和src2表示要進行按位與操作的兩幅輸入圖像;mask是可選參數,如果指定了掩膜,則只對掩膜對應位置的像素進行按位與操作;dst表示按位與運算的結果。

【例14.1】創建空白圖像進行按位與操作

?? 打開Qt Creator,新建一個控制臺項目,項目名稱是test。

?? 在main.cpp中輸入如下代碼:

#include "opencv2/opencv.hpp"
using namespace cv;int main()
{// 空白圖像創建Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);// 在圖像內添加矩陣rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);imshow("m1", m1);imshow("m2", m2);Mat dst;bitwise_and(m1, m2, dst); // 進行與操作,結果存于dst中imshow("result", dst);waitKey();return 0;
}

通過bitwise_and函數就能得到與操作的結果dst。

?? 運行程序,結果如圖14-1所示。

圖14-1

再看個示例,對現有圖片進行按位與操作,代碼如下:

【例14.2】對現成圖像進行按位與操作

?? 打開Qt Creator,新建一個控制臺項目,項目名稱是test。

?? 在main.py中輸入如下代碼:

#include "opencv2/opencv.hpp"
using namespace cv;int main()
{Mat dog,cat,img_and;resize(imread("cat.png"),cat, Size(400, 360));resize(imread("dog.png"),dog, Size(400, 360));bitwise_and(cat,dog,img_and); // 與運算 1 & 1 = 1, 其它為0imshow("result",img_and);waitKey(0);return 0;
}

?? 保存程序并運行,結果如圖14-2所示。

可以看出,與運算的結果是使圖像變小,最后的圖像也會偏暗。

2. bitwise_or函數

在OpenCV中進行或運算使用bitwise_or函數,其聲明如下:

void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray());

其中輸入參數src1和src2可為灰度圖或彩色圖,src1和src2大小需相同;輸出參數dst存放或運算的結果,尺寸和類型與src保持一致;掩膜mask可通俗理解為一個遮罩,只對mask設定的有效區域進行操作。

圖14-2

或運算 0 | 0 = 0,其他情況為1。下面將貓和狗的圖片進行或運算。

【例14.3】對現成圖像進行按位或操作

?? 打開Qt Creator,新建一個控制臺項目,項目名稱是test。

?? 在main.cpp中輸入如下代碼:

#include "opencv2/opencv.hpp"
using namespace cv;int main()
{Mat dog,cat,img_and;resize(imread("cat.png"),cat, Size(400, 360));resize(imread("dog.png"),dog, Size(400, 360));bitwise_or(cat,dog,img_and); // 或運算 1 & 1 = 1,其他為0imshow("result",img_and);waitKey(0);return 0;
}

?? 保存程序并運行,結果如圖14-3所示。

圖14-3

可以看出,或運算的結果是使圖像變大,最后的圖像也偏亮。

代碼實現數字水印

前面講解了數字水印的嵌入過程和提取過程,步驟比較清晰。本節將根據這些步驟,通過代碼來實現數字水印的嵌入和提取。

【例14.4】實現數字水印的嵌入和提取

?? 打開Qt Creator,新建一個控制臺項目,項目名稱是test。

?? 在main.cpp中輸入如下代碼:

#include "opencv2/opencv.hpp"
using namespace cv;int main()
{Mat gray1H7,dst,getWatermark;Mat src= imread("src.bmp",0);// 讀取水印圖像Mat watermark= imread("watermark.bmp",0);// 將水印圖像內的正值處理為1,以方便嵌入,相當于把水印圖像變成二值圖像for(int i=0;i<watermark.rows;i++){for(int j=0;j<watermark.cols;j++){if(watermark.at<uchar>(i,j)>0)watermark.at<uchar>(i,j)=1;}}// 讀取原始載體圖像的行和列int r=src.rows;int c=src.cols;// ----------------------嵌入過程------------------------// 生成元素值都是254的數組Mat t254 = Mat::ones(r, c, CV_8UC1) * 254;// 獲取gray1H7圖像的高七位bitwise_and(src,t254,gray1H7);// 將watermark嵌入gray1H7內bitwise_or(gray1H7,watermark,dst);// ----------------------提取過程--------------------------// 生成元素值都是1的數組Mat t1=  Mat::ones(r, c, CV_8UC1);// 從目標載體圖像內提取水印圖像bitwise_and(dst,t1,getWatermark);// 將水印圖像內的正值處理為255,以方便顯示for(int i=0;i<getWatermark.rows;i++){for(int j=0;j<getWatermark.cols;j++){if(getWatermark.at<uchar>(i,j)>0)getWatermark.at<uchar>(i,j)=255;}}// ---------顯示結果--------imshow("srcImg",src);imshow("watermark",watermark*255); // 當前watermark內最大值為1imshow("dstImg",dst);imshow("getWatermark",getWatermark);waitKey();destroyAllWindows();waitKey(0);return 0;
}

可以看出,上述代碼是按照嵌入過程的步驟和提取過程的步驟來實現的。我們把一副水印圖像(watermark.bmp)嵌入原始載體圖像(src.bmp)中變為目標載體圖像(也稱含水印的載體圖像)dst,然后從dst中提取出水印數據存于getWatermark中,最后顯示4種圖像。

?? 運行程序,結果如圖14-4所示。

從圖14-4中可以看到,原始載體圖像(src)和含水印的載體圖像(dst)肉眼是看不出區別的。下面再看水印圖像,如圖14-5所示。

圖14-4

圖14-5

在圖14-5中,左邊是原來的數字水印圖像,右邊是從目標載體圖像中提取出來的數字水印圖像,可以發現兩者并沒有變化。這樣我們就實現了把一副數字水印圖像嵌入載體圖像再提取出的過程。

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

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

相關文章

基于Python的計算機科學研究話題管理系統的設計與實現 - 爬蟲

標題:基于Python的計算機科學研究話題管理系統的設計與實現 - 爬蟲 內容:1.摘要 本文聚焦于基于Python的計算機科學研究話題管理系統的爬蟲部分。背景是隨著計算機科學研究的快速發展&#xff0c;相關話題數據海量且分散&#xff0c;人工管理效率低。目的是設計并實現一個能高…

告別手動解析!借助 CodeBuddy 快速開發網頁源碼提取工具

作為一名長期從事 Web 開發的程序員&#xff0c;我們在日常工作中&#xff0c;時不時會需要查看網頁的源代碼。這么做的目的通常是為了排查前端渲染的問題、分析接口返回的數據結構&#xff0c;或者就是單純地想快速提取頁面中的某些信息&#xff0c;比如文章鏈接、圖片地址&am…

為什么要在 input() 后加 .strip()?

strip() 是 Python 字符串的一個方法&#xff0c;用于去除字符串開頭和結尾的空白字符&#xff08;包括空格、制表符 \t、換行符 \n 等&#xff09;。 為什么要在 input() 后加 .strip()&#xff1f; 用戶在輸入時&#xff0c;可能會不小心在開頭或結尾輸入空格&#xff0c;例…

【日擼 Java 300行】Day 14(棧)

目錄 Day 14&#xff1a;棧 一、棧的基本知識 二、棧的方法 1. 順序表實現棧 2. 入棧 3. 出棧 三、代碼及測試 拓展&#xff1a; 小結 Day 14&#xff1a;棧 Task&#xff1a; push 和 pop 均只能在棧頂操作.沒有循環, 時間復雜度為 O(1). 一、棧的基本知識 詳細的介…

dotnet core c#調用Linux c++導出函數

1.聲明C++導出函數 platform_export.h // // Created by dev on 5/6/25. //#ifndef PLATFORM_EXPORT_H #define PLATFORM_EXPORT_H #if defined(_WIN32)#ifdef LIB_EXPORTS#define LIB_API __declspec(dllimport)#else#define LIB_API __declspec(dllimport)#endif #else#ifde…

SparkSQL操作Mysql

前面的課程我們學習了如何從csv文件中讀入數據&#xff0c;這相當于是對csv這種類型的數據的操作。那么接下來&#xff0c;我們一起看看&#xff0c;如何寫Spark程序來操作mysql數據庫。先來給大家介紹一下我們這節課的主要學習內容&#xff1a; &#xff08;1&#xff09;安裝…

語言學中的對象語言與元語言 | 概念 / 區別 / 實例分析

注&#xff1a;英文引文&#xff0c;機翻未校。 語言學中的“對象語言”和“元語言” 劉福長 現代外語 1989年第3期&#xff08;總第45期&#xff09; 在閱讀語言學著作時&#xff0c;我們有時會遇到這樣兩個術語&#xff1a;對象語言&#xff08;object language&#xff0…

livenessProbe 和 readinessProbe 最佳實踐

在 Kubernetes 中&#xff0c;livenessProbe 和 readinessProbe 是確保應用高可用性的關鍵機制&#xff0c;但配置不當可能導致應用頻繁重啟或流量中斷。以下是配置這兩個探針的最佳實踐&#xff1a; 1. 核心區別與作用 探針類型目的失敗后果livenessProbe檢測應用是否 存活&…

集成管理工具Gitlab

GitLab 是一個功能強大的開源代碼托管和協作平臺&#xff0c;集成 GitLab 可以顯著提升團隊的開發效率。下面我將為你介紹如何集成 GitLab&#xff0c;包括安裝配置和基本使用流程。 一、GitLab 安裝與配置 GitLab 有多種安裝方式&#xff0c;推薦使用官方 Omnibus 包安裝&am…

Electron-Vue3、Electron-React、Electron-Angular打造輿情監控系統項目

Electron是一個跨平臺的桌面應用開發框架&#xff0c;可以讓我們用html css js的技術開發跨平臺桌面上可以安裝的軟件。視頻詳解: Electron教程 ElectronVue跨平臺桌面軟件開發教程-2024年更新&#xff08;大地老師&#xff09; 從Electron環境搭建開始到手把手教你調試、Elect…

08.webgl_buffergeometry_attributes_none ,three官方示例+編輯器+AI快速學習

本實例主要講解內容 這個Three.js示例展示了無屬性幾何體渲染技術&#xff0c;通過WebGL 2的gl_VertexID特性和偽隨機數生成算法&#xff0c;在著色器中動態計算頂點位置和顏色&#xff0c;而不需要在CPU端預先定義幾何體數據。 核心技術包括&#xff1a; WebGL 2的頂點ID特…

Ubuntu 22.04搭建OpenStreeMap地址解析服務(保姆級教程)

1.數據準備 1.1.全球數據 下載地址&#xff1a;https://planet.openstreetmap.org/ 1.2.特定區域的數據 下載地址&#xff1a;Geofabrik Download Server 2.安裝必要的軟件包 2.1.更新系統軟件包 sudo apt updatesudo apt upgrade 2.2.安裝所需要的軟件包 執行下面的命…

Ubuntu 22.04.5 LTS上部署Docker及相關優化

以下是在Ubuntu 22.04.5 LTS上部署Docker及相關優化的步驟&#xff1a; 安裝Docker 更新系統&#xff1a;在安裝Docker之前&#xff0c;先確保系統是最新的&#xff0c;執行以下命令&#xff1a;sudo apt update sudo apt upgrade -y安裝依賴包&#xff1a;安裝一些必要的依賴…

React -> AI組件 -> 調用Ollama模型, qwen3:1.7B非常聰明

使用 React 搭建一個現代化的聊天界面&#xff0c;支持與 Ollama 本地部署的大語言模型進行多輪對話。界面清爽、功能完整&#xff0c;支持 Markdown 渲染、代碼高亮、<think> 隱藏思考標簽、流式漸進反饋、暗黑模式適配等特性。 &#x1f9e9; 核心功能亮點 ? 模型選擇…

vue2/3 中使用 @vue-office/docx 在網頁中預覽(docx、excel、pdf)文件

1. 安裝依賴&#xff1a; #docx文檔預覽組件npm install vue-office/docx vue-demi0.14.6#excel文檔預覽組件npm install vue-office/excel vue-demi0.14.6#pdf文檔預覽組件npm install vue-office/pdf vue-demi0.14.6 vue2.6版本或以下還需要額外安裝 vue/composition-api …

【應用密碼學】實驗五 公鑰密碼2——ECC

一、實驗要求與目的 1.復習CCC基本概念&#xff0c;并根據實驗平臺提供的資料完成驗證性實驗。 2.編程練習&#xff1a;以書上例題小模數p為例編程實現ECC的基本運算規則。 二、實驗內容與步驟記錄&#xff08;只記錄關鍵步驟與結果&#xff0c;可截圖&#xff0c;但注意排版…

rust-candle學習筆記9-使用tokenizers加載qwen3分詞,使用分詞器處理文本

參考&#xff1a;about-pytorch&#xff0c; about-tokenizers 在魔搭社區鏈接下載qwen3的tokenizer.json文件 添加依賴庫&#xff1a; cargo add tokenizers tokenizers庫初體驗&#xff1a; use tokenizers::tokenizer::{self, Result, Tokenizer};fn main() -> Resu…

【MySQL】存儲引擎 - ARCHIVE、BLACKHOLE、MERGE詳解

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

5.Redission

5.1 前文鎖問題 基于 setnx 實現的分布式鎖存在下面的問題&#xff1a; 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如 HashTable 這樣的代碼中&#xff0c;他的方法都是使用 sync…

C語言主要標準版本的演進與核心區別的對比分析

以下是C語言主要標準版本的演進與核心區別的對比分析 K&R C&#xff08;1978年&#xff09; 定位?&#xff1a;非標準化的原始版本&#xff0c;由Brian Kernighan和Dennis Ritchie定義 特性?&#xff1a; 基礎語法&#xff1a;函數聲明無參數列表&#xff08;如int func…