C++ opencv實(shí)現(xiàn)的把藍(lán)底照片轉(zhuǎn)化為白底照片功能完整示例
本文實(shí)例講述了C++ opencv實(shí)現(xiàn)的把藍(lá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)問(wè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;//藍(lán)底的平均色調(diào)和平均飽和度
//取一塊藍(lán)色背景,計(jì)算出它的平均色調(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;
//遍歷整個(gè)圖像
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兩個(gè)通道做閾值分割,把藍(lán)色替換成紅色
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;
//藍(lán)色底
//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);
//加個(gè)濾波把邊緣部分的值濾掉(此處應(yīng)該用低通濾波器,但感覺(jué)不太好,還是不用了。)
Mat result;
GaussianBlur(rgbImg,result,Size(3,3),0.5);
imshow(window,result);
imwrite("new.jpg",result);
waitKey(0);
//system("pause");
return 0;
}
這個(gè)效果比之前要好,圖片對(duì)比:


參考文章:http://www.dhdzp.com/article/176326.htm
希望本文所述對(duì)大家C++程序設(shè)計(jì)有所幫助。
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之vector底層實(shí)現(xiàn)機(jī)制解析
向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence?Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象??梢院?jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組2021-11-11
Qt連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查的圖文教程
QT連接數(shù)據(jù)庫(kù)是應(yīng)用開(kāi)發(fā)的常用基礎(chǔ)操作,經(jīng)過(guò)實(shí)驗(yàn)我總結(jié)了一些例程,下面這篇文章主要給大家介紹了關(guān)于Qt連接數(shù)據(jù)庫(kù)并實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
C++在C語(yǔ)言基礎(chǔ)之上增強(qiáng)的幾個(gè)實(shí)用特性總結(jié)
這篇文章主要介紹了C++在C語(yǔ)言基礎(chǔ)之上增強(qiáng)的幾個(gè)實(shí)用特性總結(jié),包括C++中更強(qiáng)的類型約束以及結(jié)構(gòu)體方面等一些更加高級(jí)的特性,需要的朋友可以參考下2016-03-03
C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧簡(jiǎn)單操作
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧簡(jiǎn)單操作的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語(yǔ)言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法
這篇文章主要介紹了C語(yǔ)言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法,講解了以不同進(jìn)制將整型數(shù)字轉(zhuǎn)換成字符數(shù)組,需要的朋友可以參考下2016-04-04

