Java中的颜色算术

我在尝试为某些Landsat图像着色时,在网上寻找图像融合算法时发现了我要实现的特定兴趣之一.我已经实现了3种算法,它们很好,但是我似乎无法使这一算法起作用.

我有以下代码:

int red1 = ((redImage.getRGB(x, y)>>> 16) & 0xFF);
int green1 = ((greenImage.getRGB(x, y)>>> 8) & 0xFF);
int blue1 = ((blueImage.getRGB(x, y)) & 0xFF);

它分别检索红色,绿色和蓝色图像的红色,绿色和蓝色值.我也有以下代码:

int pan1 = ((panImage.getRGB(x, y)>>> 16) & 0xFF);
int pan2 = ((panImage.getRGB(x, y)>>> 8) & 0xFF);
int pan3 = ((panImage.getRGB(x, y)) & 0xFF);

此代码检索单个全色图像的红色,绿色和蓝色值.
这与问题无关紧要,但值得以防万一.

我一直在研究的算法非常简单,它表示该算法是每个多光谱带与全色图像的简单相乘.听起来很简单,所以我继续执行以下操作:

int red = red1 * pan1;
int green = green1 * pan2;
int blue = blue1 * pan3;

int rgb = ((red << 16) | (green << 8) | blue);

colouredImage.setRGB(x, y, (rgb | 0xFF000000));

生成的图像看起来好像受到了一些严重的噪音干扰,即到处都有紫色和绿色斑点,这使图像变得毫无用处.我不知道如何附加图像,但是它到处都是随机的颜色,这对我来说毫无意义.

因此,我认为将它们相乘的颜色的算术有问题,导致这些随机颜色的alpha通道是否正在发生某些事情?

任何帮助深表感谢.

解决方法:

这看起来像一个简单的溢出问题.当您将red1 * pan1相乘时,它将超出允许的0 … 255范围.

有两种方法可以避免这种情况:

乘法前转换为[0 … 1]范围

您可以将颜色值转换为0.0 … 1.0之间的浮点类型.这样,乘法结果保持在正确范围内.只要记住,完成后就将结果转换回0 … 255范围.

要么

将产品除以255

我认为这是更清洁的方法.取结果并将其简单地除以255.您可以使用整数除法,并且不需要进行浮点转换.很抱歉没有在我的原始答案中提及此内容,我的大脑无法正常工作.

int red = (red1 * pan1) / 255;
// same for other colors
上一篇:如何使用Javascript / jQuery计算RGB十六进制颜色变化


下一篇:java-PLAF无法更改按钮颜色