Bit图片分层

numpy.binary_repr 

numpy.binary_reprnumwidth = None 

将输入数字的二进制表示形式返回为字符串。

对于负数,如果未给出宽度,则在前面添加减号。如果给定宽度,则返回该数字的二进制补码,相对于该宽度。

在二进制补码系统中,负数由绝对值的二进制补码表示。这是在计算机上表示有符号整数的最常用方法[1]。A N位的二进制补码系统可以代表在范围内的每个整数 Bit图片分层Bit图片分层

参数:

num : int

只能使用整数十进制数。

width : int,可选

如果num为正,则返回字符串的长度;如果num为负,则返回二进制补码的长度,条件是宽度至少足以使num以指定的形式表示。

如果宽度值不足,它将被忽略,num将以二进制(num > 0)或二进制补码(num <0)形式返回,其宽度等于表示该数字所需的最小位数。指定表格。不推荐使用此行为,稍后会引发错误。

自1.12.0版开始不推荐使用。

返回:

bin : str

的二进制表示NUM或补NUM

例子

>>>

>>> np.binary_repr(3)
'11'
>>> np.binary_repr(-3)
'-11'
>>> np.binary_repr(3, width=4)
'0011'

当输入数字为负且指定宽度时,将返回二进制补码:

>>>

>>> np.binary_repr(-3, width=3)
'101'
>>> np.binary_repr(-3, width=5)
'11101'

Bit图片分层

比特平面分层:把十进制的灰度值转化为二进制,灰度值范围[0,255]即2的8次方种取值,所以结果的二进制最多有8位,每一位取值0或1,对应每个比特平面上的值。

例如十进制90转为二进制01011010,则在第一个比特平面到第八个比特平面上的值依次为[0-1-0-1-1-0-1-0](对原图上的每个点做相同的处理,最终可以得到8个比特平面。


matlab:

X=double(rgb2gray(imread(r'C:\Users\x\Desktop\yb.jpg')));%将原始图像转换为灰度图像
[h w] = size(X);
subplot(3,3,1);
imshow(X,[]);
title('原始图像');
for k=1:8
 for i=1:h
     for j=1:w
      tmp(i,j) = bitget(X(i,j),k);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第k位
     end
 end
 subplot(3,3,k+1);
 imshow(tmp,[]);
 ind = num2str(k);
 imti = ['第',ind,'个位平面'];
 title(imti);
end

python

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\x\Desktop\yb.jpg', cv2.IMREAD_GRAYSCALE)

h, w = img.shape[:2]

new_img = np.zeros((h,w,8))

for k in range(8):
    for i in range(h):
        for j in range(w):
            n = np.binary_repr(img[i,j],8)
            new_img[i,j,k] = n[k]

cv2.imshow('image',img)
cv2.imshow('image8',new_img[:,:,0])
cv2.imshow('image7',new_img[:,:,1])
cv2.imshow('image6',new_img[:,:,2])
cv2.imshow('image5',new_img[:,:,3])
cv2.imshow('image4',new_img[:,:,4])
cv2.imshow('image3',new_img[:,:,5])
cv2.imshow('image2',new_img[:,:,6])
cv2.imshow('image1',new_img[:,:,7])
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:1~8平面

Bit图片分层