C++ opencv实现的把蓝底照片转化为白底照片功能完整示例

 更新时间:2019年12月13日 09:57:50   作者:nudt_qxx  
这篇文章主要介绍了C++ opencv实现的把蓝底照片转化为白底照片功能,结合完整实例形式详细分析了C++使用opencv模块进行图片转换操作的相关实现技巧,需要的朋友可以参考下

本文实例讲述了C++ opencv实现的把蓝底照片转化为白底照片功能。分享给大家供大家参考,具体如下:

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;//包含cv命名空间
int main()
{
 char *origin="Original";
 char *window="Image";
 char *str="G:\\yay.jpg";
 namedWindow(origin,1);
 namedWindow(window,1);
 Mat image=imread(str);
 if(!image.data)
 {
  cout<<"图像载入出现问题"<<endl;
  return 0;
 }
 Mat roi=image(Rect(20,20,20,20));
 Mat hsvImg;
 cvtColor(image, hsvImg, CV_BGR2HSV); //将图像转换到HSV颜色空间
 //分离HSV空间,v[0]为H色调,v[1]为S饱和度,v[2]为v灰度
 vector<Mat> v;
 split(hsvImg,v);
 Mat roiH=v[0](Rect(20,20,20,20));
 Mat roiS=v[1](Rect(20,20,20,20));
 int SumH=0;
 int SumS=0;
 int avgH, avgS;//蓝底的平均色调和平均饱和度
 //取一块蓝色背景,计算出它的平均色调和平均饱和度
 for(int i=0; i<20; i++)
 {
  for(int j=0; j<20; j++)
  {
   /*SumH=SumH+roiH(i,j);*/
   SumH=int(roiH.at<uchar>(j,i))+SumH;
   SumS=int(roiS.at<uchar>(j,i))+SumS;
  }
 }
 avgH=SumH/400;
 avgS=SumS/400;
 //遍历整个图像
 int nl=hsvImg.rows;
 int nc=hsvImg.cols;
 int step=10;
 for(int j=0; j<nl; j++)
 {
  for(int i=0; i<nc; i++)
  {
   //以H.S两个通道做阈值分割,把蓝色替换成红色
   if((v[0].at<uchar>(j,i))<=(avgH+5) && v[0].at<uchar>(j,i)>=(avgH-5)
    &&(v[1].at<uchar>(j,i))<=(avgS+40) && v[1].at<uchar>(j,i)>=(avgS-40))
   {
    //cout<<int(v[0].at<uchar>(j,i))<<endl;
    //红色底
    //v[0].at<uchar>(j,i)=0;
    //白色底
    v[0].at<uchar>(j,i)=0;
    v[1].at<uchar>(j,i)=0; //V[0]和V[1]全调成0就是变成白色
    //绿色底
    //v[0].at<uchar>(j,i)=60;
    //蓝色底
    //v[0].at<uchar>(j,i)=120;
    /*cout<<int(v[0].at<uchar>(j,i))<<endl;*/
   }
  }
 }
 Mat finImg;
 merge(v,finImg);
 Mat rgbImg;
 cvtColor(finImg,rgbImg, CV_HSV2BGR); //将图像转换回RGB空间
 imshow(origin,image);
 imshow(window,rgbImg);
 //加个滤波把边缘部分的值滤掉(此处应该用低通滤波器,但感觉不太好,还是不用了。)
 Mat result;
 GaussianBlur(rgbImg,result,Size(3,3),0.5);
 imshow(window,result);
 imwrite("new.jpg",result);
 waitKey(0);
 //system("pause");
 return 0;
}

这个效果比之前要好,图片对比:

参考文章:https://www.jb51.net/article/176326.htm

希望本文所述对大家C++程序设计有所帮助。

相关文章

  • C语言数据结构之vector底层实现机制解析

    C语言数据结构之vector底层实现机制解析

    向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组
    2021-11-11
  • c语言多进程tcp服务器示例

    c语言多进程tcp服务器示例

    这篇文章主要介绍了c语言多进程tcp服务器示例,多进程socket,epoll实现IO复用,需要的朋友可以参考下
    2014-03-03
  • Qt连接数据库并实现数据库增删改查的图文教程

    Qt连接数据库并实现数据库增删改查的图文教程

    QT连接数据库是应用开发的常用基础操作,经过实验我总结了一些例程,下面这篇文章主要给大家介绍了关于Qt连接数据库并实现数据库增删改查的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • C++在C语言基础之上增强的几个实用特性总结

    C++在C语言基础之上增强的几个实用特性总结

    这篇文章主要介绍了C++在C语言基础之上增强的几个实用特性总结,包括C++中更强的类型约束以及结构体方面等一些更加高级的特性,需要的朋友可以参考下
    2016-03-03
  • C语言实现贪吃蛇小游戏开发

    C语言实现贪吃蛇小游戏开发

    这篇文章主要为大家详细介绍了C语言实现贪吃蛇小游戏开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++ cin.get用法案例详解

    C++ cin.get用法案例详解

    这篇文章主要介绍了C++ cin.get用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作

    这篇文章主要介绍了C语言数据结构之栈简单操作的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言中交换int型变量的值及转换为字符数组的方法

    C语言中交换int型变量的值及转换为字符数组的方法

    这篇文章主要介绍了C语言中交换int型变量的值及转换为字符数组的方法,讲解了以不同进制将整型数字转换成字符数组,需要的朋友可以参考下
    2016-04-04
  • C语言const关键字的用法详解

    C语言const关键字的用法详解

    今天探讨const,首先来说是将变量常量化。为什么要将变量常量化,原因有诸多好处有诸多。比如可以使数据更加安全不会被修改
    2022-08-08
  • C语言 格式化读写文件详解

    C语言 格式化读写文件详解

    本文主要介绍C语言 格式化读写文件,这里提供了关于格式化读写文件的基本资料及实现示例代码,有兴趣的小伙伴可以参考下,以便理解学习
    2016-08-08

最新评论