设为首页 加入收藏

TOP

C++ opencv把蓝底照片转化为白底照片的代码教程
2018-01-30 12:42:00 】 浏览:331
Tags: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;
}
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++函数重载实例讲解 下一篇C++ 调用Linux系统命令的简单实例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目