首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将logo作为水印添加到图片中?

如何将logo作为水印添加到图片中?
EN

Stack Overflow用户
提问于 2019-09-04 16:53:03
回答 1查看 666关注 0票数 3

最近,我对使用OpenCV进行图像处理很感兴趣,但我还是个新手。

我对许多图像做了一些简单的图像处理,最后我想在每个图像上添加一个小png图像的标志。

有很多代码混合了两个图像。这是一个我用来混合两个图像的例子:

代码语言:javascript
复制
int main( int argc, char** argv )
{
        double alpha = 0.5; double beta; double input;
        Mat src1, src2, dst;

        // main image with real size.(Large)
        src1 = imread("a.jpg");

        // logo which will be used as a watermark.(small size)
        src2 = imread("logo.png");

        namedWindow("Linear Blend", 1);
        beta = ( 1.0 - alpha );

        addWeighted( src1, alpha, src2, beta, 0.0, dst);

        imshow( "Linear Blend", dst );

        waitKey(0);
        return 0;
}

在这里,两个图像应该是相同的类型和相同的大小,而我的徽标图像是一个小图像,我想在一个角落(实际上是在任意点)混合到主图像中。

有人能帮我做到这一点吗?(也许,一种解决方案是从徽标创建一个矩阵,该矩阵与主图像的大小相同,因此徽标外部的每个点都应该为零,然后最后混合两个大小相同的图像。)

我的最终代码是这样的:

代码语言:javascript
复制
int main( int argc, char** argv )
{
        double alpha = 0.5; double beta; double input;
        Mat src1, src2, src2_copy, dst;

        src1 = imread("a.jpg");
        src2 = imread("logo.png");


        resize(src2, src2_copy, src2.size() / 2, 0.5, 0.5);

        int x = 100;
        int y = 100;
        int w = src2_copy.size().width;
        int h = src2_copy.size().height;
        cv::Rect pos = cv::Rect(x, y, w, h);


        dst = src1.clone();

        namedWindow("Linear Blend", 1);
        beta = ( 1.0 - alpha );

        addWeighted(src1(pos), alpha, src2_copy, beta, 0.0, dst);

        imshow("Linear ", dst);


        waitKey(0);
        return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-04 17:20:09

您可以使用cv::Rect (参见documentation on the base class)访问cv::Mat中的(矩形) region of interest (ROI)xywidthheight对此进行了描述。这是一种广泛使用的技术,在很多用例中都很方便!

所以,现在你只需要在你的主图像中设置一个合适的ROI,并在那里混合你的水印。让我们来看一下下面的代码片段:

代码语言:javascript
复制
// Artificial main image
cv::Mat img = cv::Mat(300, 300, CV_8UC3, cv::Scalar(128, 128, 128));

// Artificial watermark
cv::Mat wtm = cv::Mat(25, 25, CV_8UC3, cv::Scalar(0, 0, 255));

// Position of watermark in main image
int x = 30;
int y = 35;
int w = wtm.size().width;
int h = wtm.size().height;
cv::Rect pos = cv::Rect(x, y, w, h);

// Blending
double alpha = 0.7;
double beta = (1.0 - alpha);
cv::addWeighted(img(pos), alpha, wtm, beta, 0.0, img(pos));

人工主图像如下所示:

人工水印图像如下所示:

并且,最终结果如下所示:

如您所见,在

代码语言:javascript
复制
cv::addWeighted(img(pos), alpha, wtm, beta, 0.0, img(pos))

ROI img(pos)被用作操作的源和目标,因此您可以就地混合。如果你想要有一个单独的输出图像,同时保持你的主图像不变,可以在一开始克隆你的主图像,即

代码语言:javascript
复制
cv::Mat dst = img.clone()

然后用dst(pos)而不是img(pos)进行混合。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57784853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档