gpt4 book ai didi

android - openCV中的线性颜色渐变

转载 作者:太空狗 更新时间:2023-10-29 16:02:42 28 4
gpt4 key购买 nike

我正在尝试像 Photoshop 一样创建两种颜色的渐变。输入两种颜色的r,g,b,结果就是渐变的Mat。我至少试了 5 个小时,但我找不到 Photoshop 的确切效果。我试图创建自己的公式(因为我在网上找不到任何公式),方法是将 RGB 更改为 HSV,然后将相对于总行数的色调差异添加到 Mat 的每一行,同时减少强度到图像的中心,然后再次增加它。代码不言自明。

此外,如果有人能告诉我创建渐变的确切公式,那将非常有帮助。

这是 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");

最佳答案

我纠正了我的第一个代码

对于本应更简单的事情来说,这似乎是一个非常复杂的代码。我会做那样的事情。

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.

关于android - openCV中的线性颜色渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25622612/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com