gpt4 book ai didi

java - 根据图像修改背景颜色(主题)

转载 作者:行者123 更新时间:2023-12-01 13:46:32 28 4
gpt4 key购买 nike

我正在尝试找到最适合加载图像的颜色并将其应用到背景中。适应图像并使 UI 感觉更自然。 到目前为止我已经找到了 2 个方案:

1> 平均像素(下面的代码):

final Color acclimatizeAverage(BufferedImage img) {
long avgr = 0, avgb = 0, avgg = 0;
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0; j < img.getHeight(); j++) {
Color c = new Color(img.getRGB(i, j));
avgr += c.getRed(); avgb += c.getBlue(); avgg += c.getGreen();
}
}
avgr = (avgr/(img.getHeight()*img.getWidth()));
avgg = (avgg/(img.getHeight()*img.getWidth()));
avgb = (avgb/(img.getHeight()*img.getWidth()));
Color c = new Color((int)avgr, (int)avgg, (int)avgb);
return c;
}

2> 将像素分组到固定的颜色箱中(下面的代码):

 Map<Color, Integer> createBins() {
Map<Color, Integer> bins = new HashMap<>();
bins.put(Color.red, 0);
bins.put(Color.magenta, 0);
bins.put(Color.orange, 0);
bins.put(Color.PINK, 0);
bins.put(Color.yellow, 0);
bins.put(Color.LIGHT_GRAY, 0);
bins.put(Color.GREEN, 0);
bins.put(Color.GRAY, 0);
bins.put(Color.DARK_GRAY, 0);
bins.put(Color.CYAN, 0);
bins.put(Color.BLUE, 0);
bins.put(Color.BLACK, 0);
return bins;
}

int compare(Color a, Color b) {
return (int)Math.sqrt((a.getRed() - b.getRed())*(a.getRed() - b.getRed())
+ (a.getBlue() - b.getBlue())*(a.getBlue() - b.getBlue())
+ (a.getGreen()- b.getGreen())*(a.getGreen()- b.getGreen()));
}

BufferedImage acclimatizeGrouping(BufferedImage img) {
Map<Color, Integer> bins = createBins();
for (int i = 0; i < img.getWidth(); i++) {
int min = Integer.MAX_VALUE; Color minC = null;
for (int j = 0; j < img.getHeight(); j++) {
Color c = new Color(img.getRGB(i, j));
for (Map.Entry<Color, Integer> entry : bins.entrySet()) {
Integer integer = compare(entry.getKey(), c);
if(integer < min) {
min = integer;
minC = entry.getKey();
}
}
bins.put(minC, bins.get(minC)+1);
}
}
int max = -1, n = 1; Color c = null;
for (Map.Entry<Color, Integer> entry : bins.entrySet()) {
Integer integer = entry.getValue();
if(integer > max) {
max = integer;
c = entry.getKey();
}
}
return c;
}

但是分组产生了奇怪的结果......
左侧是分组后产生的颜色,右侧是图像
为什么会产生这样的结果??? left side is the Color produced as a result of grouping and right side is image

平均会产生更正确的结果: enter image description here

最佳答案

我认为问题在于 RGB 不是人类欧几里得空间。您使用欧氏距离来比较颜色,但这对人类的色感不利。请参阅this link了解更多信息。

编辑:更精确,您应该使用此算法:

typedef struct {
unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

关于java - 根据图像修改背景颜色(主题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20330603/

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