我想創建兩種顏色的漸變,如Photoshop。 輸入兩種顏色的r,g,b,結果將是漸變的Mat。我至少嘗試了5個小時,並且我無法找到Photoshop的確切效果。 我試圖創建我自己的公式(因爲我在網上找不到任何東西),通過將RGB更改爲HSV,然後將相對於總行數的色調差異添加到Mat的每一行,並且還將強度降低到圖像的中心,然後再次增加。代碼是自我解釋的。openCV中的線性顏色漸變
此外,如果任何人都可以告訴我創建一個漸變的確切公式,這將是非常有益的。
這裏的Photoshop漸變的樣子
,這是我從我的代碼
int r1, g1, b1, r2, g2, b2;
r1 = 255;
g1 = 0;
b1 = 0;
r2 = 0;
g2 = 255;
b2 = 0;
Mat input = imread("img.jpg");
Mat color1(input.size(), input.type());
Mat color2(input.size(), input.type());
vector<Mat> bgr1;
vector<Mat> bgr2;
split(color1, bgr1);
bgr1[0] = b1;
bgr1[1] = g1;
bgr1[2] = r1;
merge(bgr1, color1);
split(color2, bgr2);
bgr2[0] = b2;
bgr2[1] = g2;
bgr2[2] = r2;
merge(bgr2, color2);
vector<Mat> hls1;
vector<Mat> hls2;
cvtColor(color1, color1, CV_BGRA2BGR);
cvtColor(color1, color1, CV_BGR2HSV);
split(color1, hls1);
cvtColor(color2, color2, CV_BGRA2BGR);
cvtColor(color2, color2, CV_BGR2HSV);
split(color2, hls2);
double h1 = hls1[0].at<uchar>(0, 0);
double h2 = hls2[0].at<uchar>(0, 0);
double dif = (h2 - h1)/input.rows;
double h = h1;
double halfL = 255/2;
double halfR = input.rows/2;
double ldif = halfL/halfR;
double l = 255;
bool isHalf = false;
for (int i = 0; i < input.rows; i++)
{
for (int j = 0; j < input.cols; j++)
{
hls1[0].at<uchar>(i, j) = h;
hls1[2].at<uchar>(i, j) = l;
}
if (isHalf == false){
l -= ldif;
}
else{
l += ldif;
}
if (i < input.rows * 0.40)
{
h += dif * 0.40;
}
else if (i < input.rows * 0.60)
{
h += dif * 3;
}
else
{
h += dif * 0.40;
}
if (i >= input.rows/2)
{
isHalf = true;
}
}
merge(hls1, color1);
merge(hls2, color2);
cvtColor(color1, color1, CV_HSV2BGR);
cvtColor(color1, color1, CV_BGR2BGRA);
cvtColor(color2, color2, CV_HSV2BGR);
cvtColor(color2, color2, CV_BGR2BGRA);
namedWindow("Color1", cv::WINDOW_NORMAL);
resizeWindow("Color1", color1.size().width/2, color1.size().height/2);
imshow("Color1", color1);
waitKey(0);
destroyAllWindows();
system("pause");
btw,它是一個計算機視覺庫,不是photoshop。 – berak 2014-09-02 11:55:56