这个java方法对按位运算有什么作用?

时间:2011-11-01 12:14:13

标签: java image-processing binary bitwise-operators

我不熟悉按位操作。这是一种图像处理算法。发生了什么事?

void binarize50(int pixels[]) {
        for(int i = 0; i < pixels.length; i++) {
            int gray = ((pixels[i] & 0xff) + ((pixels[i] & 0xff00) >> 8) + ((pixels[i] & 0xff0000) >> 16)) / 3;
            pixels[i] = gray < 128 ? 0xff000000 : 0xffffffff;
        }
}

我发现(像素[i]&amp; 0xff)只是以某种方式“标准化”并让像素/字节变为0..255之间的正值。

(pixels [i]&amp; 0xff00&gt;&gt; 8)做什么?
什么是0xff00? 如果灰色&lt; 128像素变为0xff000000或者0xffffffff?

5 个答案:

答案 0 :(得分:5)

它的作用取决于颜色模型以及颜色在内存中的表示方式。

我的猜测是它将普通的ARGB图像转换为基于50%阈值的黑/白图像。 (使所有小于50%“亮度”的像素变为全黑,其他所有像素都变为白色。)

  

(pixels[i] & 0xff00 >> 8)做了什么?

  • pixel[i]你已经知道了: - )
  • & ff00屏蔽第二个字节中的位
  • >> 8 向右移位位,八个位置(即使边缘最右边的字节落下)
  

什么是0xff00

0xff00是值为65280的十六进制文字(或二进制中的1111111100000000)

  

为什么如果灰色&lt; 128像素变为0xff000000或者0xffffffff?

这一行:

int gray = ((pixels[i] & 0xff) +
            ((pixels[i] & 0xff00) >> 8) +
            ((pixels[i] & 0xff0000) >> 16)) / 3;

将红色,绿色和蓝色组件添加为upp并将其除以3(找出平均值)。

这一行

pixels[i] = gray < 128 ? 0xff000000 : 0xffffffff;

据推测,如果灰度小于一半,则像素应该是完全黑色的,否则它应该是完全白色的。

答案 1 :(得分:5)

&amp;使用0xff等操作应用位掩码。这是一个按位和操作。由于Java中的int是32位,因此您可以将0xff视为00000000_00000000_00000000_11111111,将0xff00视为00000000_00000000_11111111_00000000,依此类推。他们只是省略了前导零。

所以,如果你做pixels[i] & 0xff,那么你得到一个int,其中最后8位与像素[i]相同,其余的则设置为零。

>>运营商是正确的转变。它会在指定的位数上将位模式向右移位。如果b包含00110011_11001100_00010110_01001100而您执行了b >> 8,那么您最终会得到00000000_00110011_11001100_00010110。最后8位“掉线”,而左边的零点已经移入。我不记得如果前导位为1,此操作是否会向左移1,所以也许有人可以确认或否认。

知道了这一点,让我们来看看这一行:

int gray = ((pixels[i] & 0xff) + ((pixels[i] & 0xff00) >> 8) + ((pixels[i] & 0xff0000) >> 16)) / 3;

这里发生的是我们按如下方式创建一个int(不是精确的代码执行顺序,仅用于说明):

  • 像素[i]被屏蔽,因此只保留最后8位,其余为0。
  • 像素[i]被屏蔽,因此仅保留位8-15(从右向左计数,从0开始),其余为0.然后该结果向右移8位。如果我们从00001111_00001111_10101010_00110011开始,这将导致00000000_00000000_00000000_10101010。
  • 像素[i]被屏蔽,因此仅保留位16-23,然后向右移位16位。
  • 添加了以上三个操作的结果......
  • 该结果除以3。

那么这实现了什么?那么,它基本上归结为像素[i]的前8位被忽略,并且随后的3位8位被解释为0到255之间的单个值,其中取平均值。

然后检查结果是否为128.如果它低于,像素[i]我设置为0xff000000,否则设置为0xffffffff。

这是在编码为int的颜色操作中遇到的典型位。这可能是argb方案,其中int的前8位是alpha(透明度),接下来的8位是红色,接下来的8位是绿色,后8位是蓝色。或其变体。 0xff000000将是完全不透明的黑色,而0xffffffff是完全不透明的白色。

答案 2 :(得分:2)

(pixels [i]&amp; 0xff)= 0到255之间的蓝色值

(pixels [i]&amp; 0xff00)&gt;&gt; 8 = 0到255之间的绿色值

(pixels [i]&amp; 0xff0000)&gt;&gt; 16)= 0到255之间的红色值

然后你取上面找到的3个值的平均值。

在此之后,取决于灰度,使其为白色或黑色,即小于50%的灰色为黑色,否则为白色。

答案 3 :(得分:1)

(pixels[i] & 0xff00) >> 8从int获取第二个字节,表示绿色 - &使除8-15之外的所有位和>>将它们的8位移位到是的,所以如果数字是(以位为单位)0101000100001100:

0101000100001100 & 0xff = 0101000100001100 & 1111111100000000 = 0101000100000000.
0101000100000000 >> 8 = 01010001

((pixels[i] & 0xff0000) >> 16)也一样。

不是你取它们的平均值(/3)并得到颜色是接近白色还是黑色(gray < 128)。根据这个,您可以将像素设为黑色或白色。

答案 4 :(得分:1)

0xFF00这是一个位掩码意味着二进制表示中的1111111100000000。

因此,当您将此掩码应用于数字时,您会留下更高的8位。

运营商&gt;&gt;意味着向右移动。例如11110000&gt;&gt; 2 = 00111100