图像混合(前景+背景)【实例4】

我们可以将一些logo图案加在其他的图像上,这和图像的按比重加法的不同之处在于按比重加法是整体的加法,要求比较多,而在本节内容中,则主要是提取一些特征来实现加法,实用性更强,首先来对比一下这两者的差别。

图1 图像按比重混合(左)图像前景背景混合(右)

实现的过程(代码网上较多,本文就不附代码)

1. 获取前景图像的特征轮廓(logo部分)

将前景图像转为灰度图像,然后进行二值化(确保logo与背景在灰度图中像素值差异明显,提取的效果才会好)

img2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)#将图像转为灰度图
ret,mask=cv2.threshold(img2gray,242,255,cv2.THRESH_BINARY)#第二个参数为阈值,第三个参数为高于阈值取值结果,第四个是阈值方法

ret值存放的是阈值,mask存放二值图,我们希望logo部分的值为0,这样和背景图做与运算时,logo部分就会保留(为0)

图2 logo二值化后
2. logo二值化后与背景图做与运算

这样做的结果就是在背景图中,logo部分的像素值均会为0

图3 logo二值化后与背景图上的ROI区域做与运算
3. 对logo的二值化图取反,将其与logo图做与运算

结果就和上一步相反,logo图中的特征部分保留,其背景被消除

图4 logo图二值化取反后与logo原图与运算
4. 上两步的结果相加

相加后,我们希望的结果就实现了!然后,将这一部分复制到我们原图的对应部分(ROI区域)

图5 相加后的结果

5. 对图像中的噪点进行滤波 

5.1对取得logo的边缘后对其滤波(在最终相加前)

图 6 对logo部分滤波(均值滤波,核矩阵大小为5*5)
滤波后,图像边缘噪点要少,但图像模糊化了,在猫的眼睛部分尤其明显,采用小的核矩阵效果会好一些,但在边缘处的处理有不如前者。
5.2 对相加后的结果滤波

图7 相加后对图像滤波
对比两者(相加前和相加后滤波),可以发现后者在对边缘的处理效果要好,噪点少,更加平滑。后续的可以结合其他的滤波方法,来对比效果,选择最佳的滤波方法。



参考文献:OpenCV官方文档(中文版) for python

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Halcon实现前景背景分离的简单示例: ```cpp #include <iostream> #include <string> #include <chrono> #include "HalconCpp.h" #include "HDevThread.h" using namespace HalconCpp; using namespace std; int main(int argc, char* argv[]) { // 读取图像 HImage image("test.jpg"); // 初始化背景模型 HTuple width, height; GetImageSize(image, &width, &height); HImage background("byte", width, height, 128); HRegion region("rectangle1", 0, 0, height-1, width-1); // 创建前景背景模型 HRegion foreground, background_region; HImage foreground_image, background_image; CreateBackgroundModel(image, &background, &foreground, &background_region, &foreground_image, &background_image); // 显示结果 OpenWindow(0, 0, width, height, 0, "原图"); HDevWindowStack::Push(0); DispObj(image, HDevWindowStack::GetActive()); OpenWindow(0, 0, width, height, 0, "前景背景分离"); HDevWindowStack::Push(0); SetColor(HDevWindowStack::GetActive(), "blue"); DispObj(background_region, HDevWindowStack::GetActive()); SetColor(HDevWindowStack::GetActive(), "red"); DispObj(foreground, HDevWindowStack::GetActive()); // 等待用户关闭窗口 cout << "按任意键退出..." << endl; GetChar(); return 0; } ``` 在这个例子中,我们首先从文件中加载图像,然后使用 `CreateBackgroundModel()` 函数创建前景背景模型。该函数需要传入图像背景模型、前景区域、背景区域和前景图像背景图像等参数。 我们还使用 `OpenWindow()` 和 `DispObj()` 函数在屏幕上显示原始图像前景背景分离的结果。最后,我们等待用户按下任意键,然后退出程序。 需要注意的是,该示例仅演示了如何使用 Halcon 实现前景背景分离,实际应用中可能需要更复杂的算法和技术来处理不同的场景和图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值