C++ opencv把蓝底照片转化为白底照片

38 篇文章 1 订阅
29 篇文章 2 订阅

本文系转载,出处:http://blog.csdn.net/qq_37059483/article/details/77840976

#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;
}

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

这里写图片描述

这里写图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值