C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能完整示例
更新時間:2019年12月13日 09:57:50 作者:nudt_qxx
這篇文章主要介紹了C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能,結(jié)合完整實例形式詳細分析了C++使用opencv模塊進行圖片轉(zhuǎn)換操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
本文實例講述了C++ opencv實現(xiàn)的把藍底照片轉(zhuǎn)化為白底照片功能。分享給大家供大家參考,具體如下:
#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<<"圖像載入出現(xiàn)問題"<<endl;
return 0;
}
Mat roi=image(Rect(20,20,20,20));
Mat hsvImg;
cvtColor(image, hsvImg, CV_BGR2HSV); //將圖像轉(zhuǎn)換到HSV顏色空間
//分離HSV空間,v[0]為H色調(diào),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;//藍底的平均色調(diào)和平均飽和度
//取一塊藍色背景,計算出它的平均色調(diào)和平均飽和度
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]全調(diào)成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); //將圖像轉(zhuǎn)換回RGB空間
imshow(origin,image);
imshow(window,rgbImg);
//加個濾波把邊緣部分的值濾掉(此處應(yīng)該用低通濾波器,但感覺不太好,還是不用了。)
Mat result;
GaussianBlur(rgbImg,result,Size(3,3),0.5);
imshow(window,result);
imwrite("new.jpg",result);
waitKey(0);
//system("pause");
return 0;
}
這個效果比之前要好,圖片對比:


參考文章:http://www.dbjr.com.cn/article/176326.htm
希望本文所述對大家C++程序設(shè)計有所幫助。
相關(guān)文章
C++實現(xiàn)LeetCode(347.前K個高頻元素)
這篇文章主要介紹了C++實現(xiàn)LeetCode(347.前K個高頻元素),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08

