作者:Steven
著作權宣告:著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處
實作原理
顏色所具有的亮度和暗度被稱為影像明度,計算明度的基準是灰度測驗卡,黑色為0,白色為10,色彩可以分為有彩色和無彩色,但后者仍然存在著明度,作為有彩色,每種色各自的亮度、暗度在灰度測驗卡上都具有相應的位置值,彩度高的色對明度有很大的影響,不太容易辨別,在明亮的地方鑒別色的明度比較容易的,在暗的地方就難以鑒別,
明度調整可通過合成方式實作:若引數為正,則調整后的影像可以認為加了一層白色遮罩層,即原影像RGB數值×(1-alpha)+255*alpha;反之亦然,認為加了一層黑色遮罩層,即原圖RGB*(1+alpha),其中alpha是負數,
明度調整演算法的具體實作流程如下:
1.設定調整引數percent,取值為-100到100,類似PS中設定,歸一化后為-1到1,
2.針對影像所有像素點單個處理,當percent大于等于0時,加上白色遮罩,調整后的RGB三通道數值為:
3.若percent小于0時,加上黑色遮罩,此時調整后的影像RGB三通道值為:
至此,影像實作了明度的調整,演算法邏輯參考xingyanxiao,C++實作代碼如下,
功能函式代碼
// 明度
cv::Mat Lightness(cv::Mat src, float percent)
{
float alpha = percent / 100;
alpha = max(-1.f, min(1.f, alpha));
cv::Mat temp = src.clone();
int row = src.rows;
int col = src.cols;
for (int i = 0; i < row; ++i)
{
uchar *t = temp.ptr<uchar>(i);
uchar *s = src.ptr<uchar>(i);
for (int j = 0; j < col; ++j)
{
uchar b = s[3 * j];
uchar g = s[3 * j + 1];
uchar r = s[3 * j + 2];
if (alpha >= 0)
{
t[3 * j + 2] = static_cast<uchar>(r*(1 - alpha) + 255 * alpha);
t[3 * j + 1] = static_cast<uchar>(g*(1 - alpha) + 255 * alpha);
t[3 * j] = static_cast<uchar>(b*(1 - alpha) + 255 * alpha);
}
else
{
t[3 * j + 2] = static_cast<uchar>(r*(1 + alpha));
t[3 * j + 1] = static_cast<uchar>(g*(1 + alpha));
t[3 * j] = static_cast<uchar>(b*(1 + alpha));
}
}
}
return temp;
}
C++測驗代碼
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
cv::Mat Lightness(cv::Mat src, float percent);
int main()
{
cv::Mat src = imread("1.jpg");
cv::Mat result = Lightness(src, 50.f);
imshow("original", src);
imshow("result", result);
waitKey(0);
return 0;
}
// 明度
cv::Mat Lightness(cv::Mat src, float percent)
{
float alpha = percent / 100;
alpha = max(-1.f, min(1.f, alpha));
cv::Mat temp = src.clone();
int row = src.rows;
int col = src.cols;
for (int i = 0; i < row; ++i)
{
uchar *t = temp.ptr<uchar>(i);
uchar *s = src.ptr<uchar>(i);
for (int j = 0; j < col; ++j)
{
uchar b = s[3 * j];
uchar g = s[3 * j + 1];
uchar r = s[3 * j + 2];
if (alpha >= 0)
{
t[3 * j + 2] = static_cast<uchar>(r*(1 - alpha) + 255 * alpha);
t[3 * j + 1] = static_cast<uchar>(g*(1 - alpha) + 255 * alpha);
t[3 * j] = static_cast<uchar>(b*(1 - alpha) + 255 * alpha);
}
else
{
t[3 * j + 2] = static_cast<uchar>(r*(1 + alpha));
t[3 * j + 1] = static_cast<uchar>(g*(1 + alpha));
t[3 * j] = static_cast<uchar>(b*(1 + alpha));
}
}
}
return temp;
}
測驗效果
通過調整percent可以實作影像明度的調整,
如果函式有什么可以改進完善的地方,非常歡迎大家指出,一同進步何樂而不為呢~
如果文章幫助到你了,可以點個贊讓我知道,我會很快樂~加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297670.html
標籤:其他
