根据像素的标签将二维像素阵列更改为图像
Changing a 2D array of pixels to an image based on the labels of the pixels
我正在尝试实现连接组件标记,但我一直在研究如何将标记的像素(即属于图像中组件的像素)转换为颜色(最好是每个组件的随机颜色)。
我有一个二维数组 newPixels [][]
,它包含 0, which is the background color
和我的 labels, which are values of 1, 4, 7, 10
的值
现在我要做的是将标有 1, 4, 7, 10
的像素转换为不同的颜色(标有 1、4 等的像素的不同颜色)
我想做什么
BufferedImage img = new BufferedImage(ewPixelsWidth,
newPixelHeight, BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < newPixelsWidth; i++){
for(int j = 0; j < newPixelHeight; j++}
set img.setRGB(i,j, newPixel[i][i])
}
然而,当执行上述代码时,我得到的图像是黑色的。现在是因为像素的数字是十进制的,需要是十六进制的吗?或者标签编号 1, 4, 7, 10
无法转换为颜色?
值 1
...10
实际上 do 代表不同的颜色:这些是不同深浅的蓝色,但太暗以至于几乎没有区别于黑色。
BufferedImage.TYPE_INT_RGB
类型图像中的像素表示为 int
值。这些由 4 个字节组成。最后三个字节定义了红色、绿色和蓝色 (R,G,B) 分量。
请注意,对于 BufferedImage.TYPE_INT_ARGB
类型的图像,第一个字节是 alpha 分量(不透明度)。对于这样的图像,您还必须将第一个字节设置为 255
- 否则,像素将保持透明。
这些是你的颜色:
RRGGBB
0x000001
0x000004
0x000007
0x000010
像
这样的值
0x0000FF
将是完全饱和的蓝色。
为了根据这些值将颜色分配给像素,了解您期望的颜色数量会很有帮助。一种方法可能是只用随机颜色填充一个数组,稍后再查找它们:
int numColors = 10;
int colors[] = new int[numColors];
Random random = new Random(0);
for (int i=0; i<numColors; i++) {
colors[i] = 0xFF000000 | random.nextInt();
}
// In your loop:
img.setRGB(i,j, colors[newPixel[i][i]]);
请注意,您不能确定这些随机颜色是否容易区分。或者,您可以使用一些常见的颜色贴图。可以在线找到示例,例如 http://colorbrewer2.org/#type=qualitative&scheme=Paired&n=11。使用这些,您可以直接定义颜色数组:
int colors[] =
{
0xffa6cee3,
0xff1f78b4,
0xffb2df8a,
0xff33a02c,
0xfffb9a99,
0xffe31a1c,
0xfffdbf6f,
0xffff7f00,
0xffcab2d6,
0xff6a3d9a,
0xffffff99
};
我正在尝试实现连接组件标记,但我一直在研究如何将标记的像素(即属于图像中组件的像素)转换为颜色(最好是每个组件的随机颜色)。
我有一个二维数组 newPixels [][]
,它包含 0, which is the background color
和我的 labels, which are values of 1, 4, 7, 10
的值
现在我要做的是将标有 1, 4, 7, 10
的像素转换为不同的颜色(标有 1、4 等的像素的不同颜色)
我想做什么
BufferedImage img = new BufferedImage(ewPixelsWidth,
newPixelHeight, BufferedImage.TYPE_INT_RGB);
for(int i = 0; i < newPixelsWidth; i++){
for(int j = 0; j < newPixelHeight; j++}
set img.setRGB(i,j, newPixel[i][i])
}
然而,当执行上述代码时,我得到的图像是黑色的。现在是因为像素的数字是十进制的,需要是十六进制的吗?或者标签编号 1, 4, 7, 10
无法转换为颜色?
值 1
...10
实际上 do 代表不同的颜色:这些是不同深浅的蓝色,但太暗以至于几乎没有区别于黑色。
BufferedImage.TYPE_INT_RGB
类型图像中的像素表示为 int
值。这些由 4 个字节组成。最后三个字节定义了红色、绿色和蓝色 (R,G,B) 分量。
请注意,对于 BufferedImage.TYPE_INT_ARGB
类型的图像,第一个字节是 alpha 分量(不透明度)。对于这样的图像,您还必须将第一个字节设置为 255
- 否则,像素将保持透明。
这些是你的颜色:
RRGGBB
0x000001
0x000004
0x000007
0x000010
像
这样的值0x0000FF
将是完全饱和的蓝色。
为了根据这些值将颜色分配给像素,了解您期望的颜色数量会很有帮助。一种方法可能是只用随机颜色填充一个数组,稍后再查找它们:
int numColors = 10;
int colors[] = new int[numColors];
Random random = new Random(0);
for (int i=0; i<numColors; i++) {
colors[i] = 0xFF000000 | random.nextInt();
}
// In your loop:
img.setRGB(i,j, colors[newPixel[i][i]]);
请注意,您不能确定这些随机颜色是否容易区分。或者,您可以使用一些常见的颜色贴图。可以在线找到示例,例如 http://colorbrewer2.org/#type=qualitative&scheme=Paired&n=11。使用这些,您可以直接定义颜色数组:
int colors[] =
{
0xffa6cee3,
0xff1f78b4,
0xffb2df8a,
0xff33a02c,
0xfffb9a99,
0xffe31a1c,
0xfffdbf6f,
0xffff7f00,
0xffcab2d6,
0xff6a3d9a,
0xffffff99
};