ビットプレーン スライシングは、画像のピクセル値表現を異なるバイナリ ビット プレーンに分割する画像処理で一般的に使用される手法です。これらの平面はそれぞれ画像内の異なる特徴や情報を表すことができるため、画像の分析、強調、圧縮に役立つツールが提供されます。以下は、ビット プレーン レイヤ化の数学的原理、意味、および使用シナリオの説明です。
数学的原理:
グレースケール イメージの場合、各ピクセルのピクセル値は 8 ビットの 2 進数 (通常は 0 の範囲) で表すことができます。 255まで)。ビット プレーンの階層化では、これらの 8 ビット 2 進数を 8 つの独立したプレーンに分割し、各プレーンが特定の 2 進数のビットに対応します。各ビット プレーンには、画像内の対応するピクセルのそのビットに関する情報のみが含まれ、他のビットは 0 に設定されます。これは次の数式で表すことができます。
ピクセル値ppの場合p、その 8 ビット バイナリ表現はp = b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 p = b_7b_6b_5b_4b_3b_2b_1b_0 です。p=b7b6b5b4b3b2b1b0、ここでb 7 b_7b7最上位ビットを表します、b 0 b_0b0最下位ビットを示します。次に、iiiビットプレーン (i = 0 , 1 , … , 7 i = 0, 1, \ldots, 7私=0 、1 、…、7 ) は次のように表すことができます:
P i (x, y) = bi P_i(x, y) = b_iP私は( x ,y )=b私は
ここでは(x, y) (x, y)( x ,y )は画像内のピクセル座標です。
意義:
ビット プレーン レイヤ化の主な意義は、画像の情報を分解して、画像内のさまざまな詳細や特徴を観察および操作できるようにすることです。上位ビットプレーン ( b 7 b_7b7b 4 b_4へb4) には通常、画像のグローバル構造と主な特徴が含まれますが、低ビット プレーン ( b 3 b_3b3b 0 b_0へb0) にはさらに細かい詳細が含まれています。これにより、ビット プレーン レイヤ化がいくつかの操作の基礎となります。
- 画像の強化:特定のビット プレーンを強化することにより、画像内の特定の詳細を強調表示したり抑制したりすることができ、それによって画像の視覚的な品質が向上します。
- 画像圧縮:場合によっては、低ビット情報を破棄することで画像圧縮を実現し、ストレージと送信のオーバーヘッドを削減できます。
- 画像分析:さまざまなビット プレーンを調べることで、画像内の構造、テクスチャ、特徴をより深く理解できます。
使用シナリオ:
ビット プレーン レイヤ化は、次のようなさまざまな画像処理シナリオで役立ちます。
- 画像の強化:高レベルの平面を強化することで、画像内の主な特徴を強調表示することができ、画像の視覚化効果を向上させることができます。
- 画像圧縮:低ビット プレーンを破棄することで、可逆または非可逆画像圧縮を実現し、ストレージと送信のオーバーヘッドを削減できます。
- 画像分析:ビット プレーンを分析すると、テクスチャ、形状、エッジなどの画像内の特徴を識別するのに役立ちます。
- ステガノグラフィー:ステガノグラフィーでは、画像の外観に影響を与えることなく、低レベルのプレーンを使用して秘密情報を隠すことができます。
要約すると、ビットプレーン レイヤ化は、画像の強調から画像の特徴の分析まで、さまざまな分野で複数の目的に使用できる便利な画像処理ツールです。
コードの実装プロセスは次のとおりです。
import cv2 # 导入OpenCV库用于图像处理
import matplotlib.pyplot as plt # 导入matplotlib库用于绘图
import numpy as np # 导入NumPy库用于数值操作
class BIT:
def __init__(self, input_path):
self.input_path = input_path # 初始化类,传入输入图像路径
def fenceng(self):
img_gray = cv2.imread(self.input_path, flags=0) # 以灰度方式读取输入图像
if img_gray is None:
print('Unable to load image!')
else:
print('Load image successfully!')
height, width = img_gray.shape[:2] # 获取图像的高度和宽度
plt.figure(figsize=(10, 8)) # 设置绘图的图像大小
for i in range(9, 0, -1): # 循环从9到1(倒序)
plt.subplot(3, 3, (9 - i) + 1, xticks=[], yticks=[]) # 在3x3的网格中创建子图
if i == 9: # 对于第一个子图(i = 9),显示原始灰度图像
plt.imshow(img_gray, cmap='gray')
plt.title('Original')
else:
img_bit = np.empty((height, width), dtype=np.uint8) # 创建一个空的图像数组
for w in range(width):
for h in range(height):
x = np.binary_repr(img_gray[h, w], width=8) # 将像素值转换为8位二进制字符串
x = x[::-1] # 反转二进制字符串
a = x[i - 1] # 从反转的二进制字符串中获取第(9-i)位的值
img_bit[h, w] = int(a) # 将像素值设置为所选位的值
plt.imshow(img_bit, cmap='gray') # 显示带有所选位平面的图像
plt.title(f"{bin((i - 1))}") # 将标题设置为(i - 1)的二进制表示
plt.show() # 显示包含所有子图的完整图像
# 输入图像文件的路径
imgfile = "./Images/stuff.jpg"
bit = BIT(imgfile) # 使用输入图像路径创建BIT类的实例
bit.fenceng() # 调用fenceng方法执行位平面分割并可视化操作