Luk*_*lar 3 java binary image-processing 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现(像素[i]和0xff)只是以某种方式"标准化"并让像素/字节变为0..255之间的正值.
(pixels [i]&0xff00 >> 8)做什么?
什么是0xff00?为什么如果灰色<128像素变为0xff000000或者0xffffffff?
它的作用取决于颜色模型以及颜色在内存中的表示方式.
我的猜测是,它将普通的ARGB图像转换为基于50%阈值的黑/白图像.(使所有小于50%"亮度"的像素变为全黑,其他所有像素都变为白色.)
怎么
(pixels[i] & 0xff00 >> 8)办?
pixel[i] 你已经知道了 :-)& ff00 屏蔽掉第二个字节中的位>> 8 将位移到右边,八个位置(即使边缘的最右边的字节落下)什么是
0xff00?
0xff00是值65280的十六进制文字(或二进制的1111111100000000)
为什么如果灰色<128像素变为0xff000000或者0xffffffff?
这一行:
int gray = ((pixels[i] & 0xff) +
((pixels[i] & 0xff00) >> 8) +
((pixels[i] & 0xff0000) >> 16)) / 3;
Run Code Online (Sandbox Code Playgroud)
添加红色,绿色和蓝色组件并将其除以3(找出平均值).
这条线
pixels[i] = gray < 128 ? 0xff000000 : 0xffffffff;
Run Code Online (Sandbox Code Playgroud)
据推测,如果灰度小于一半,像素应该是完全黑色,否则应该是完全白色.
使用等的&操作0xff应用位掩码.这是一个按位和操作.由于Java中的int是32位,因此您可以将其读0xff作as 00000000_00000000_00000000_11111111,0xff00as 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;
Run Code Online (Sandbox Code Playgroud)
这里发生的是我们按如下方式创建一个int(不是精确的代码执行顺序,仅用于说明):
那么这实现了什么?那么,它基本上归结为像素[i]的前8位被忽略,并且随后的3位8位被解释为0到255之间的单个值,其中取平均值.
然后针对128检查该结果.如果它低于,则像素[i]设置为0xff000000,否则设置为0xffffffff.
这是你在编码为int的颜色操作中遇到的典型比特.这可能是argb方案,其中int的前8位是alpha(透明度),接下来的8位是红色,接下来的8位是绿色,后8位是蓝色.或其变体.0xff000000将是完全不透明的黑色,而0xffffffff是完全不透明的白色.