【问题标题】:complement image- read the rgb values from the pixels of an image and implement appropriate transformation function补图像- 从图像的像素中读取 rgb 值并实现适当的变换函数
【发布时间】:2013-11-16 18:25:28
【问题描述】:

在我看来,我一直在努力解决一个小问题。我的任务是实现转换功能以使给定图像成为补图。我的代码可以工作并输出具有不同颜色的图像,但是我不确定该函数是否真正转换了彼此互补的色调。我已经包含了我的代码中最重要的部分以供参考。任何指针?

float hue,sat,brightness;
int rgbValues;

float[]hsbVals=Color.RGBtoHSB(red, green , blue , null );
hue=hsbVals[0];
sat=hsbVals[1];
brightness=hsbVals[2]; 

rgbValues=Color.HSBtoRGB(hue, sat, brightness);
red=(rgbValues << 16)& 0xFF;
green=(rgbValues << 8) & 0xFF;
blue= rgbValues & 0xFF;


/* Put these values into imageTwo */
imageTwo.setRGB(x, y,red, green, blue);
 }
}  

【问题讨论】:

  • 为什么将它们转换为 hsb 再转换回 rgb?
  • 我不确定转换回 rbg 背后的实际原因,但我关注了这篇文章。 stackoverflow.com/questions/11530167/…
  • 这不是完整的算法,请尝试详细阅读问题和答案。
  • 是的,我认为她正在寻找一种更有效的方法。我只想将给定的图像及其颜色变成自身的补充。我的问题是,我上面的实现有什么问题吗?
  • 是的,您将 rgb 值转换为 hsb,然后在没有任何目的或效果的情况下再次返回,并且您永远不会更改这些值。

标签: java image-processing image-manipulation


【解决方案1】:

您似乎正试图在此处“解包”RGB 整数:

red=(rgbValues << 16)& 0xFF;
green=(rgbValues << 8) & 0xFF;
blue= rgbValues & 0xFF;

但是你换错了方向。见Color.getRGB。

red = (rgbValues >>> 16) & 0xFF;
green = (rgbValues >>> 8) & 0xFF;
blue = rgbValues & 0xFF;

现在你没有做任何事情来获得补充。你得到了不同的颜色,因为你的左移导致红色和绿色总是为 0。如果你的补码是指complementary colors,你需要将色调旋转 180 度。

float[] hsb = Color.RGBtoHSB(Color.CYAN.getRed(), Color.CYAN.getBlue(), Color.CYAN.getGreen(), new float[3]);
hsb[0] = hsb[0] + 0.5f > 1.0f ? hsb[0] - 0.5f : hsb[0] + 0.5f;
Color shouldBeRed = new Color(Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]));

【讨论】:

  • 是的,我只需要将色调旋转 180,但我不知道它的编码...谢谢
  • 你认为这是正确的吗?色调 = 色调 + 0.5f > 1.0f ? sat - 0.5f:亮度 + 0.5f;因为您使用了 hsb,当我在 netbeans 中尝试该行时,它给了我错误
  • 我忘记了数组索引。哎呀。
猜你喜欢
  • 2015-10-06
  • 2019-03-11
  • 2015-03-07
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多