当前位置:   article > 正文

OpenCV实现照片换底色处理_opencv怎么改变图片背景颜色

opencv怎么改变图片背景颜色

目录

1.导言

2.引言

3.代码分析

4.优化改进

5.总结


1.导言

在图像处理领域,OpenCV是一款强大而广泛应用的开源库,能够提供丰富的图像处理和计算机视觉功能。本篇博客将介绍如何利用Qt 编辑器调用OpenCV库对照片进行换底色处理,实现更加独特和吸引人的效果

最终的实现效果如下图

2.引言

OpenCV是一个跨平台的计算机视觉库,其中包含了大量用于图像处理的函数和算法。照片换底色处理是一种常见的图像处理技术,可应用于广告设计、摄影后期处理等领域,为照片增添更多的艺术表现力。本次博客将使用OpenCV库中的函数和方法,在一张照片中将指定颜色范围内的背景替换为自定义的颜色。

3.代码分析

照片换底色处理是一种图像处理技术,通过选择并替换背景颜色,改变照片的整体视觉效果。OpenCV库提供了丰富的函数和方法,可以实现对图像的读取、处理和显示等操作。通过利用OpenCV的颜色转换、颜色范围选择和图像复制等函数,我们可以方便地实现照片换底色处理。

1.首先,需要在程序中引入OpenCV库的头文件,这样才能使用OpenCV的函数和数据结构。先下载好OpenCV然后把OpenCv的头文件包含到pro文件中去 注意要找到include文件地址

然后在x86中bin文件下所以形如 libopencv_*,dll 的文件 包含进去同时复制粘贴到C:\Windows\SysWOW64

 添加好库以后头文件也要包含进去(可以在添加OpenCV头文件之前运行一遍,不然电脑可能没有运行找不到库,让电脑反应过来)

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. using namespace cv;
  4. using namespace std;

 2.对图片进行处理

本次使用的代码中,我们首先将输入图像转换为HSV格式,以便更好地处理颜色信息。然后,通过指定颜色范围,创建一个掩膜(mask),将在范围内的像素设置为白色,不在范围内的像素设置为黑色。接下来,通过取反操作,我们可以从原始图像中抠出人像区域。创建一个新的背景图像,并将其设置为自定义的背景颜色。最后,通过将原始图像复制到新的背景图像中,仅保留人像区域,实现照片换底色的效果。

代码实现

  1. //1.显示一张图片
  2. Mat image = imread("d:/test.png");
  3. imshow("1",image);
  4. //2.图片转hsv格式
  5. Mat hsv;
  6. cvtColor(image,hsv,COLOR_BGR2HSV);
  7. imshow("2",hsv);
  8. //3.截取颜色区域的范围 inRang 在hsv取值范围内 呈白色 不在范围内 呈黑色
  9. Mat mask;//模板
  10. inRange(hsv,Scalar(100,43,46),Scalar(124,255,255),mask);
  11. imshow("3",mask);//现在的mask 就是可以抠出蓝色的底色
  12. //4.取反操作 但是我们需要抠出的是人像
  13. bitwise_not(mask,mask);
  14. imshow("4",mask);

 对图片进行hsv  ,取色  , 取反 创建新背景效果如下

Scalar可以选择颜色范围,三元素RGB颜色范围,针对选取的颜色可以参考hsv表

 3.实现照片换底色,选取红色背景

红色背景RGB选择 为 40,40,200,也可以根据自己需要调整范围

  1. //5.做一张红色背景图 大小?类型? 参考image原始图片
  2. Mat redBack = Mat::zeros(image.size(),image.type());
  3. redBack = Scalar(40,40,200);
  4. imshow("5",redBack);
  5. //6.实现图片的拷贝操作
  6. image.copyTo(redBack,mask);
  7. imshow("6",redBack);

4.优化改进

对于原始代码,我们可以进行一些优化和改进,以提高代码的可读性和扩展性。例如,可以将换底色处理的功能封装成一个独立的函数,方便重复调用。同时,可以通过参数化的方式,使得函数可以根据不同的需求进行自定义设置。此外,还可以添加错误检查和异常处理机制,提高代码的健壮性和容错性。此外优化后还增加了对图像的保存流程

优化后完整代码

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. using namespace cv;
  4. using namespace std;
  5. void changeBackground(const Mat& inputImage, const Scalar& backgroundColor, const Scalar& lowerBound, const Scalar& upperBound)
  6. {
  7. // 图片转为hsv格式
  8. Mat hsv;
  9. cvtColor(inputImage, hsv, COLOR_BGR2HSV);
  10. // 在指定范围内的变为白色,不在范围内的变为黑色
  11. Mat mask;
  12. inRange(hsv, lowerBound, upperBound, mask);
  13. imwrite("D:/QtProject/mask1.png", mask);
  14. // 取反操作,抠出人像
  15. bitwise_not(mask, mask);
  16. // 创建新的背景图像
  17. Mat newBackground = Mat::zeros(inputImage.size(), inputImage.type());
  18. newBackground = backgroundColor;
  19. // 将原始图像复制到新背景图像中,只保留前景(人像)区域
  20. inputImage.copyTo(newBackground, mask);
  21. imshow("New Background Image", newBackground);
  22. //保存图片
  23. imwrite("D:/QtProject/new_background.png", newBackground);
  24. }
  25. int main(int argc, char* argv[])
  26. {
  27. // 显示一张图片
  28. Mat image = imread("D:/QtProject/gege.jpg");
  29. imshow("1",image);
  30. // 检查图像是否成功加载
  31. if (image.empty())
  32. {
  33. cout << "Failed to load image." << endl;
  34. return -1;
  35. }
  36. // 定义背景颜色、颜色范围
  37. Scalar backgroundColor(60,60,220);
  38. Scalar lowerBound(100, 43, 46);
  39. Scalar upperBound(124, 255, 255);
  40. // 更换背景
  41. changeBackground(image, backgroundColor, lowerBound, upperBound);
  42. // 等待用户按下任意键
  43. waitKey(0);
  44. return 0;
  45. }

5.总结

通过本篇博客,我们了解了OpenCV实现照片换底色处理的方法和步骤。OpenCV库提供了丰富的图像处理函数和算法,可以帮助我们实现各种各样的图像处理任务。照片换底色处理是其中的一种,通过选择并替换背景颜色,可以为照片增添独特的艺术效果。希望本篇博客能够对读者理解和应用OpenCV库进行图像处理有所帮助。如果有需要Qt和OpenCV下载的同学可以私聊我,欢迎大家共同进步

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/309564
推荐阅读
相关标签
  

闽ICP备14008679号