OpenCV-Python開発ガイド(4)---ビットプレーンの分解と合成

ビットプレーン分解とは

グレースケール画像の均一なビットでバイナリピクセル値を組み合わせて、グレースケール画像のビットプレーンと呼ばれるバイナリ画像を取得します。このプロセスはビットプレーン分解と呼ばれます。たとえば、グレースケール画像のすべてのピクセルのバイナリビットの最下位ビットの値を組み合わせると、「最下位ビット」ビットプレーンを形成できます。

8ビットのグレースケール画像では、各ピクセルは8ビットのバイナリで表され、その値の範囲は[0,255]で、それぞれ低から高です。

00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000

これらの値を取得した後、ビット単位のAND演算によってすべてのビットプレーン分解図を取得できます。用途は?賢い友達は知っておく必要があります。たとえば、画像に透かしを追加する必要がある場合、それを高ビットプレーンまたは最下位ビットプレーンに追加する必要がありますか?

もちろん、情報が少ないので低レベルの平面です。透かしを追加した後は、透かしを削除する方が簡単です。

グレースケールビットプレーン分解

これで、グレーレベルのビットプレーン分解とそのすべての知識を理解できました。次に、描画画像を取得し、そのすべてのビットプレーン画像を抽出します。

具体的なコードは次のとおりです。

import cv2
import numpy as np

a = cv2.imread("4.jpg", 0)
r, c = a.shape
b = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
    b[:, :, i] = 2 ** i
for i in range(8):
    temp = cv2.bitwise_and(a, b[:, :, i])
    cv2.imshow(str(i),temp)
cv2.waitKey()
cv2.destroyAllWindows()

実行後、グレースケール画像の8ビットプレーン画像を取得します。

ビットプレーン
元の画像は次のようになります。

元の画像

カラー画像のビットプレーン分解

グレースケール画像にはビットプレーンがあるため、カラー画像も抽出できます。ただし、カラー画像の行列は3次元行列であるため、RGBの各色値に対してビット単位のAND演算を実行する必要があります。

具体的なコードは次のとおりです。

import cv2
import numpy as np

a = cv2.imread("4.jpg", -1)
x, y, z = a.shape
b = np.zeros((x, y, 8), dtype=np.uint8)
for i in range(8):
    b[:, :, i] = 2 ** i
temp = np.zeros((x, y, 3), dtype=np.uint8)
for i in range(8):
    temp[:, :, 0] = cv2.bitwise_and(a[:, :, 0], b[:, :, i])
    temp[:, :, 1] = cv2.bitwise_and(a[:, :, 1], b[:, :, i])
    temp[:, :, 2] = cv2.bitwise_and(a[:, :, 2], b[:, :, i])
    cv2.imshow(str(i), temp)
cv2.waitKey()
cv2.destroyAllWindows()

実行後、次の8つのビットマップを取得します。
カラービットプレーン

しきい値

グレースケール画像であろうとカラー画像であろうと、0〜4ビットマップの詳細はほとんど見えず、すべて黒であることに読者は気づいています。現時点でその詳細をより目立たせるにはどうすればよいですか?

答えは、しきい値を変更することです。値は非常に小さい必要があります。直接255に変更します。0を除くすべての詳細を強調表示できます。ここで、カラービットマップ抽出のコードを変更します。コードは次のとおりです。

import cv2
import numpy as np

a = cv2.imread("4.jpg", -1)
x, y, z = a.shape
b = np.zeros((x, y, 8), dtype=np.uint8)
for i in range(8):
    b[:, :, i] = 2 ** i
temp = np.zeros((x, y, 3), dtype=np.uint8)
for i in range(8):
    temp[:, :, 0] = cv2.bitwise_and(a[:, :, 0], b[:, :, i])
    temp[:, :, 1] = cv2.bitwise_and(a[:, :, 1], b[:, :, i])
    temp[:, :, 2] = cv2.bitwise_and(a[:, :, 2], b[:, :, i])
    m = temp[:, :] > 0
    temp[m] = 255
    cv2.imshow(str(i), temp)
cv2.waitKey()
cv2.destroyAllWindows()

実行後の効果は次のとおりです。
しきい値の変更

カラービットプラン合成

分解があるので、合成が必要です。したがって、すべてのビットプレーンを1つの画像に結合する方法も習得する必要があります。コードは次のように表示されます。

import cv2
import numpy as np

a = cv2.imread("4.jpg", -1)
x, y, z = a.shape
b = np.zeros((x, y, 8), dtype=np.uint8)
for i in range(8):
    b[:, :, i] = 2 ** i
bit_img = np.zeros((x, y, 3), dtype=np.uint8)
temp = np.zeros((x, y, 3), 'uint8')
for i in range(8):
    bit_img[:, :, 0] = cv2.bitwise_and(a[:, :, 0], b[:, :, i])
    bit_img[:, :, 1] = cv2.bitwise_and(a[:, :, 1], b[:, :, i])
    bit_img[:, :, 2] = cv2.bitwise_and(a[:, :, 2], b[:, :, i])

    temp[:, :, 0] = cv2.bitwise_or(temp[:, :, 0], bit_img[:, :, 0])
    temp[:, :, 1] = cv2.bitwise_or(temp[:, :, 1], bit_img[:, :, 1])
    temp[:, :, 2] = cv2.bitwise_or(temp[:, :, 2], bit_img[:, :, 2])

    m = bit_img[:, :] > 0
    bit_img[m] = 255
    #cv2.imshow(str(i)+".bmp",bit_img)
cv2.imshow('00000000', temp)
cv2.waitKey()
cv2.destroyAllWindows()

ここでは、bitwiseまたはbitwise_or関数によってビットプレーンイメージにマージします。実行後、tempは元のイメージであり、bit_imgはビットプレーンイメージです。このようにして、実際に処理しているときに、中央のbit_imgを操作して、1つの画像にマージすることができます。

グレースケールビット平面画像合成

色はグレースケールよりもはるかに複雑であり、グレースケールのビットプランのマージは比較的簡単です。さらに面倒なことをせずに、コードに直接行きましょう:

import cv2
import numpy as np

a = cv2.imread("4.jpg", 0)
r, c = a.shape
b = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
    b[:, :, i] = 2 ** i
c=np.zeros((r,c),dtype=np.uint8)
for i in range(8):
    temp = cv2.bitwise_and(a, b[:, :, i])
    c=cv2.bitwise_or(c,temp)
cv2.imshow("111",c)
cv2.waitKey()
cv2.destroyAllWindows()

おすすめ

転載: blog.csdn.net/liyuanjinglyj/article/details/113769212