所以我有一张地图的图像。我有一个叠加图像,我想放置在地图上,这样你可以主要看到地图,但也可以看到叠加。然而,在逐个像素的基础上,我不知道如何评估结果图片的颜色,因为它是地图和叠加的混合。为了便于说明,我制作了以下图片:
你可以看到胡萝卜主要,但你也可以看到唐纳德特朗普超过胡萝卜。因此,考虑到整个图像的每个像素的RGB值(或HSV,无论哪个更有用),我如何以这样的方式将它们组合起来,我可以看到它们?
答案 0 :(得分:0)
我最终解决这个问题的方法是通过http://www.rapidtables.com/convert/color/rgb-to-hsv.htm上的公式将每个像素的RGB值转换为HSV颜色。然后我将每种颜色的Hue,Saturation和Value值与我想要的任何比例相结合,并将该HSV值转换回RGB。我发现如果我想比另一个更清楚地看到一个对象,你应该更多地保留该对象的Value值。因此,在我的项目中,我希望看到的地图多于叠加层,我将最终的Value值与原始地图图像的值相匹配。
这是我的HSV颜色代码。
public static class HSVColor {
double[] HSV = new double[3];
int[] RGB = new int[3];
int RGBV;
//Constructor using the formula from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm
public HSVColor(int R, int G, int B) {
RGB[0] = R;
RGB[1] = G;
RGB[2] = B;
RGBV = (256 * 256) * R + 256 * G + B;
double r = (double) R / 255.0;
double g = (double) G / 255.0;
double b = (double) B / 255.0;
double min = Math.min(r, Math.min(g, b));
double max = Math.max(r, Math.max(g, b));
double delta = max - min;
if (r == max) {
HSV[0] = 60 * (((g - b) / delta) % 6);
} else if (g == max) {
HSV[0] = 60 * (((b - r) / delta) + 2);
} else if (b == max) {
HSV[0] = 60 * (((r - g) / delta) + 4);
} else {
HSV[0] = 0;
}
if (max == 0) {
HSV[1] = 0;
} else {
HSV[1] = delta / max;
}
HSV[2] = max;
}
//Constructor using the formula from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
public HSVColor(double H, double S, double V) {
HSV[0] = H;
HSV[1] = S;
HSV[2] = V;
double C = V * S;
double X = C * (1 - Math.abs(((H / 60) % 2) - 1));
double m = V - C;
double r;
double g;
double b;
if (H < 60) {
r = C;
g = X;
b = 0;
} else if (H < 120) {
r = X;
g = C;
b = 0;
} else if (H < 180) {
r = 0;
g = C;
b = X;
} else if (H < 240) {
r = 0;
g = X;
b = C;
} else if (H < 300) {
r = X;
g = 0;
b = C;
} else {
r = C;
g = 0;
b = X;
}
RGB[0] = (int) ((r + m) * 255);
RGB[1] = (int) ((g + m) * 255);
RGB[2] = (int) ((b + m) * 255);
RGBV = (256 * 256) * RGB[0] + 256 * RGB[1] + RGB[2];
}
}