基于像素的标签将2D像素阵列更改为图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于像素的标签将2D像素阵列更改为图像相关的知识,希望对你有一定的参考价值。

我正在尝试实现连接组件标签,我坚持如何将标记的像素(即属于图像中的组件的像素)转换为颜色(最好是每个组件的随机颜色)。

我有一个二维数组newPixels [][],其中包含0, which is the background color和我的labels, which are values of 1, 4, 7, 10的值现在我想要做的是将用1, 4, 7, 10标记的像素转换为不同的颜色(标记为1,4等的像素的diff颜色)

我想做什么

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实际上代表不同的颜色:这些是不同的蓝色,但是很暗,几乎无法与黑色区分开来。

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
};

以上是关于基于像素的标签将2D像素阵列更改为图像的主要内容,如果未能解决你的问题,请参考以下文章

联合查找2d数组(Java)

尝试在给定阈值处将所有像素更改为黑白

UIImage 将原始像素从白色更改为清晰?

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

获取使用 gl.texImage2D 绘制的纹理的“红色”像素值

如何获取超像素分割后的每个小块