2014-09-02 132 views
1

我想創建兩種顏色的漸變,如Photoshop。 輸入兩種顏色的r,g,b,結果將是漸變的Mat。我至少嘗試了5個小時,並且我無法找到Photoshop的確切效果。 我試圖創建我自己的公式(因爲我在網上找不到任何東西),通過將RGB更改爲HSV,然後將相對於總行數的色調差異添加到Mat的每一行,並且還將強度降低到圖像的中心,然後再次增加。代碼是自我解釋的。openCV中的線性顏色漸變

此外,如果任何人都可以告訴我創建一個漸變的確切公式,這將是非常有益的。

這裏的Photoshop漸變的樣子

enter image description here

,這是我從我的代碼enter image description here

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"); 
+1

btw,它是一個計算機視覺庫,不是photoshop。 – berak 2014-09-02 11:55:56

回答

6

我糾正我的第一個代碼得到

似乎對於應該更容易的事情來說,這是一個非常複雜的代碼。 我會做那樣的事情。

int taille = 500;  
Mat image(taille,taille,CV_8UC3); 
for(int y = 0; y < taille; y++){ 
    Vec3b val; 
    val[0] = 0; val[1] = (y*255)/taille; val[2] = (taille-y)*255/taille; 
    for(int x = 0; x < taille; x++) 
     image.at<Vec3b>(y,x) = val; 
} 

在Micka的建議下,我添加了taille = 400的結果圖片; Result of the previous code.

+0

在這裏,我做了一個非常線性的漸變。您可以通過更改計算val的公式來獲得不同的結果。 – biquette 2014-09-02 12:27:18

+0

如果您發佈圖片的結果(而且看起來更像是海報的預期結果),您可能會收到很多upvotes =) – Micka 2014-09-02 12:40:12

+0

感謝您的建議,我編輯了第一條消息以添加圖像。 – biquette 2014-09-02 13:13:48