gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C++ opencv实现的把蓝底照片转化为白底照片功能完整示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#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;
}

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

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

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

参考文章:http://www.zzvips.com/article/182398.html 。

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

原文链接:https://blog.csdn.net/xiangxianghehe/article/details/78581251 。

最后此篇关于C++ opencv实现的把蓝底照片转化为白底照片功能完整示例的文章就讲到这里了,如果你想了解更多关于C++ opencv实现的把蓝底照片转化为白底照片功能完整示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com