公司企业网站建设方案,域名是什么 有什么用,中国银行官网,开发网站网络公司怎么样OpenCV计算机视觉开发实践#xff1a;基于Qt C - 商品搜索 - 京东
实现数字水印的相关函数
用OpenCV来实现数字水印功能#xff0c;需要使用一些位操作函数#xff0c;我们需要先了解一下这些函数。
1. bitwise_and函数
bitwise_and函数是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 i0;iwatermark.rows;i){for(int j0;jwatermark.cols;j){if(watermark.atuchar(i,j)0)watermark.atuchar(i,j)1;}}// 读取原始载体图像的行和列int rsrc.rows;int csrc.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 i0;igetWatermark.rows;i){for(int j0;jgetWatermark.cols;j){if(getWatermark.atuchar(i,j)0)getWatermark.atuchar(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中左边是原来的数字水印图像右边是从目标载体图像中提取出来的数字水印图像可以发现两者并没有变化。这样我们就实现了把一副数字水印图像嵌入载体图像再提取出的过程。