最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之OpenCV圖像高光調(diào)整具體流程

 更新時(shí)間:2021年09月18日 15:19:17   作者:翟天保Steven  
PS中的高光命令是一種校正由于太接近相機(jī)閃光燈而有些發(fā)白的焦點(diǎn)的方法,對(duì)高光區(qū)和非高光區(qū)的邊緣作平滑處理,接下來通過本文給大家分享C++之OpenCV圖像高光調(diào)整具體流程,感興趣的朋友一起看看吧

實(shí)現(xiàn)原理

PS中的高光命令是一種校正由于太接近相機(jī)閃光燈而有些發(fā)白的焦點(diǎn)的方法。在用其他方式采光的圖像中,這種調(diào)整也可用于使高光區(qū)域變暗。要實(shí)現(xiàn)圖像的高光調(diào)整,首先要識(shí)別出高光區(qū);再通過對(duì)高光區(qū)的色彩進(jìn)行一定變換,使其達(dá)到提光或者暗化效果;最后也是最重要的,就是對(duì)高光區(qū)和非高光區(qū)的邊緣作平滑處理。

下方介紹具體流程。

具體流程

1)讀取識(shí)別圖像的原圖,并轉(zhuǎn)灰度圖,再歸一化。

// 生成灰度圖
cv::Mat gray = cv::Mat::zeros(input.size(), CV_32FC1);
cv::Mat f = input.clone();
f.convertTo(f, CV_32FC3);
vector<cv::Mat> pics;
split(f, pics);
gray = 0.299f*pics[2] + 0.587*pics[2] + 0.114*pics[0];
gray = gray / 255.f;

圖1 灰度圖

2)確定高光區(qū)。因?yàn)槲覀円R(shí)別高光,所以thresh通過gray*gray,得到的圖像中原本亮的地方則為亮,取平均值當(dāng)閾值,進(jìn)行二值化得到掩膜mask。

// 確定高光區(qū)
cv::Mat thresh = cv::Mat::zeros(gray.size(), gray.type());
thresh = gray.mul(gray);
// 取平均值作為閾值
Scalar t = mean(thresh);
cv::Mat mask = cv::Mat::zeros(gray.size(), CV_8UC1);
mask.setTo(255, thresh >= t[0]);

圖2 掩膜圖

3)對(duì)掩膜區(qū)邊緣進(jìn)行平滑過渡。假設(shè)light為50,那么midrate的掩膜區(qū)值為1.5,黑色區(qū)為1,過渡區(qū)為1~1.5;bright的掩膜區(qū)為0.125,黑色區(qū)為0,過渡區(qū)為0~0.125。

// 參數(shù)設(shè)置
int max = 4;
float bright = light / 100.0f / max;
float mid = 1.0f + max * bright;
 
// 邊緣平滑過渡
cv::Mat midrate = cv::Mat::zeros(input.size(), CV_32FC1);
cv::Mat brightrate = cv::Mat::zeros(input.size(), CV_32FC1);
for (int i = 0; i < input.rows; ++i)
{
	uchar *m = mask.ptr<uchar>(i);
	float *th = thresh.ptr<float>(i);
	float *mi = midrate.ptr<float>(i);
	float *br = brightrate.ptr<float>(i);
	for (int j = 0; j < input.cols; ++j)
	{
		if (m[j] == 255)
		{
			mi[j] = mid;
			br[j] = bright;
		}
		else {
			mi[j] = (mid - 1.0f) / t[0] * th[j] + 1.0f;
			br[j] = (1.0f / t[0] * th[j])*bright;
		}
	}
}

4)根據(jù)midrate和brightrate,進(jìn)行高光區(qū)提亮。對(duì)非高光區(qū)而言,midrate都為1,brightrate都為0,即沒有變化;對(duì)高光區(qū)而言,midrate都為1.5,brightrate都為0.125,所以色彩數(shù)值均有所增加,帶來了提亮效果;對(duì)邊緣地區(qū),midrate和brightrate起到了很好的過渡作用。

注意:temp要進(jìn)行數(shù)值限制,假設(shè)temp大于1,則進(jìn)行uchar處理后數(shù)值會(huì)因?yàn)轭愋驮虍a(chǎn)生突變,那么圖像也就變成了五顏六色。

// 高光提亮,獲取結(jié)果圖
cv::Mat result = cv::Mat::zeros(input.size(), input.type());
for (int i = 0; i < input.rows; ++i)
{
	float *mi = midrate.ptr<float>(i);
	float *br = brightrate.ptr<float>(i);
	uchar *in = input.ptr<uchar>(i);
	uchar *r = result.ptr<uchar>(i);
	for (int j = 0; j < input.cols; ++j)
	{
		for (int k = 0; k < 3; ++k)
		{
			float temp = pow(float(in[3 * j + k]) / 255.f, 1.0f / mi[j])*(1.0 / (1 - br[j]));
			if (temp > 1.0f)
				temp = 1.0f;
			if (temp < 0.0f)
				temp = 0.0f;
			uchar utemp = uchar(255*temp);
			r[3 * j + k] = utemp;
		}
	}
}

C++測(cè)試代碼

#include <iostream>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
cv::Mat HighLight(cv::Mat input, int light);
 
int main()
{
	cv::Mat src = imread("test3.jpg");
	int light1 = 50;
	int light2 = -50;
	cv::Mat result1 = HighLight(src, light1);
	cv::Mat result2 = HighLight(src, light2);
	imshow("original", src);
	imshow("result1", result1);
	imshow("result2", result2);
	waitKey(0);
	return 0;
}
 
// 圖像高光選取
cv::Mat HighLight(cv::Mat input, int light)
{
	// 生成灰度圖
	cv::Mat gray = cv::Mat::zeros(input.size(), CV_32FC1);
	cv::Mat f = input.clone();
	f.convertTo(f, CV_32FC3);
	vector<cv::Mat> pics;
	split(f, pics);
	gray = 0.299f*pics[2] + 0.587*pics[2] + 0.114*pics[0];
	gray = gray / 255.f;
 
	// 確定高光區(qū)
	cv::Mat thresh = cv::Mat::zeros(gray.size(), gray.type());
	thresh = gray.mul(gray);
	// 取平均值作為閾值
	Scalar t = mean(thresh);
	cv::Mat mask = cv::Mat::zeros(gray.size(), CV_8UC1);
	mask.setTo(255, thresh >= t[0]);
 
	// 參數(shù)設(shè)置
	int max = 4;
	float bright = light / 100.0f / max;
	float mid = 1.0f + max * bright;
 
	// 邊緣平滑過渡
	cv::Mat midrate = cv::Mat::zeros(input.size(), CV_32FC1);
	cv::Mat brightrate = cv::Mat::zeros(input.size(), CV_32FC1);
	for (int i = 0; i < input.rows; ++i)
	{
		uchar *m = mask.ptr<uchar>(i);
		float *th = thresh.ptr<float>(i);
		float *mi = midrate.ptr<float>(i);
		float *br = brightrate.ptr<float>(i);
		for (int j = 0; j < input.cols; ++j)
		{
			if (m[j] == 255)
			{
				mi[j] = mid;
				br[j] = bright;
			}
			else {
				mi[j] = (mid - 1.0f) / t[0] * th[j] + 1.0f;
				br[j] = (1.0f / t[0] * th[j])*bright;
			}
		}
	}
 
	// 高光提亮,獲取結(jié)果圖
	cv::Mat result = cv::Mat::zeros(input.size(), input.type());
	for (int i = 0; i < input.rows; ++i)
	{
		float *mi = midrate.ptr<float>(i);
		float *br = brightrate.ptr<float>(i);
		uchar *in = input.ptr<uchar>(i);
		uchar *r = result.ptr<uchar>(i);
		for (int j = 0; j < input.cols; ++j)
		{
			for (int k = 0; k < 3; ++k)
			{
				float temp = pow(float(in[3 * j + k]) / 255.f, 1.0f / mi[j])*(1.0 / (1 - br[j]));
				if (temp > 1.0f)
					temp = 1.0f;
				if (temp < 0.0f)
					temp = 0.0f;
				uchar utemp = uchar(255*temp);
				r[3 * j + k] = utemp;
			}
 
		}
	}
	return result;
}

測(cè)試效果

圖1 原圖

圖2 light為50的效果圖

圖3 light為-50的效果圖

從測(cè)試效果中可以看出,高光區(qū)隨light變化而產(chǎn)生亮度變化,當(dāng)light為正值時(shí),高光區(qū)有明顯提亮效果;反之,則變更暗。

如果函數(shù)有什么可以改進(jìn)完善的地方,非常歡迎大家指出,一同進(jìn)步何樂而不為呢~

到此這篇關(guān)于OpenCV圖像高光調(diào)整的文章就介紹到這了,更多相關(guān)OpenCV圖像高光調(diào)整內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝

    數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝

    今天小編就為大家分享一篇關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言文件操作詳解以及詳細(xì)步驟

    C語言文件操作詳解以及詳細(xì)步驟

    文件(file)一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt,?.bmp,?jpg.?.exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C基礎(chǔ) redis緩存訪問詳解

    C基礎(chǔ) redis緩存訪問詳解

    下面小編就為大家?guī)硪黄狢基礎(chǔ) redis緩存訪問詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 老生常談C++ 中的繼承

    老生常談C++ 中的繼承

    這篇文章主要介紹了C++ 中的繼承,本文通過實(shí)例代碼給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素

    C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素

    vector是一種動(dòng)態(tài)數(shù)組,本文主要介紹了C++ vector如何動(dòng)態(tài)申請(qǐng)內(nèi)存的元素,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • dev?c++的使用和調(diào)試方式

    dev?c++的使用和調(diào)試方式

    這篇文章主要介紹了dev?c++?的使用和調(diào)試方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • VSCode配置C/C++環(huán)境的最新詳細(xì)教程

    VSCode配置C/C++環(huán)境的最新詳細(xì)教程

    VisualStudioCode(簡稱VSCode)是Microsoft開發(fā)的代碼編輯器,它支持Windows,Linux和macOS等操作系統(tǒng)以及開源代碼,下面這篇文章主要給大家介紹了關(guān)于VSCode配置C/C++環(huán)境的最新詳細(xì)教程,需要的朋友可以參考下
    2022-12-12
  • C++通過msxml調(diào)用webservice示例分享

    C++通過msxml調(diào)用webservice示例分享

    這篇文章主要介紹了C++通過msxml調(diào)用webservice示例分享,需要的朋友可以參考下
    2014-03-03
  • C++ Invalidaterect()函數(shù)作用案例詳解

    C++ Invalidaterect()函數(shù)作用案例詳解

    這篇文章主要介紹了C++ Invalidaterect()函數(shù)作用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++利用libcurl獲取下載文件名稱及大小

    C++利用libcurl獲取下載文件名稱及大小

    這篇文章主要為大家詳細(xì)介紹了C++如何利用libcurl獲取下載文件名稱及大小的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03

最新評(píng)論

万年县| 郓城县| 桃园市| 清河县| 普兰县| 城口县| 天津市| 余干县| 巫溪县| 巢湖市| 五指山市| 孝感市| 航空| 汤阴县| 巴林右旗| 连城县| 天柱县| 霍林郭勒市| 家居| 抚顺县| 科技| 九江市| 龙口市| 若尔盖县| 泸州市| 龙山县| 康定县| 云林县| 卓尼县| 襄垣县| 苏尼特右旗| 潮安县| 石棉县| 西和县| 榆中县| 台东市| 定日县| 东乡族自治县| 新巴尔虎左旗| 清苑县| 四会市|