文章目录

  • 一、前言
  • 二、位平面分解(提取)与合成
    • 1.灰度图-位平面提取
    • 2.彩色图-位平面提取
  • 三、视频演示:图像位平面分解与合成的过程
    • 1.灰度图-位平面提取过程
    • 2.彩色图-位平面提取过程
    • 3.灰度图-位平面合成过程
    • 4.彩色图-位平面合成过程

一、前言

本次演示使用的这张图片来源于壁纸网站,如有侵权,请联系我删除。

关于位平面分解的原理,这里不进行进行阐述,只展示代码和运行结果。

所用到的库:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

二、位平面分解(提取)与合成

1.灰度图-位平面提取

def bit_decompose_gray(file):
    # 灰度图-位平面提取
    img = cv.imread(file, 0)
    r,c = img.shape
    mask = np.zeros((r, c, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 2 ** i

    for i in range(8):
        temp = cv.bitwise_and(img, mask[:, :, i])

        title = '{:0>8s}'.format(str(bin(2 ** i))[2:])
        plt.subplot(2, 4, i + 1), plt.title(title)
        plt.imshow(temp, 'gray')
        plt.xticks([]), plt.xticks([]), plt.axis('off')

    plt.show()

如图所示的8个图中,分别提取的是从第0位至第7位的位图。
如标题所示:00000001表示提取第0位,00000010表示提取第1位,以此类推,并且下文也是采用这种规则。

2.彩色图-位平面提取

def bit_decompose_rgb(file):
    # 彩色图-位平面提取
    img = cv.imread(file, -1)
    img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    x, y, z = img.shape
    mask = np.zeros((x, y, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 2 ** i

    temp = np.zeros((x, y, 3), 'uint8')

    for i in range(8):
        temp[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
        temp[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
        temp[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])

        title = '{:0>8s}'.format(str(bin(2 ** i))[2:])
        plt.subplot(2, 4, i + 1), plt.title(title)
        plt.imshow(temp)
        plt.xticks([]), plt.xticks([]),plt.axis('off')

    plt.show()

在低4位(第0位~第3位)提取的画面都非常暗,不容易观察。
可以经过阈值处理,把大于0的像素值都显示为255,这样就能够比较明显地看到变化了:

# 对temp进行阈值处理
m = temp[:,:] > 0
temp[m] = 255

三、视频演示:图像位平面分解与合成的过程

1.灰度图-位平面提取过程

def bit_decompose_gray_video(file):
    # 视频演示:灰度图-位平面提取过程
    img = cv.imread(file, 0)
    r, c = img.shape
    mask = np.zeros((r, c, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 255 - 2**i

    cv.imshow('11111111', img)
    cv.waitKey(1250)

    num = 255
    # for i in range(8): # 从低位到高位的顺序提取
    for i in range(7, -1, -1):  # 从高位到低位的顺序提取
        img = cv.bitwise_and(img, mask[:, :, i])

        num -= 2**i
        title = '{:0>8s}'.format(str(bin(num))[2:])
        cv.setWindowTitle('11111111', title)
        cv.imshow('11111111', img)
        cv.waitKey(1250)
    cv.waitKey()
    cv.destroyAllWindows()

视频演示过程中,请留意标题的变化。
11111111表示未开始提取的原图
01111111表示从原图中提取了第8位位图之后的效果
00111111表示从原图提取了第8、7位位图之后的效果,依次类推。

所以00000000是一张纯黑的图,因为原图的8位的位图都已经被提取了。
其实00000111和00000011和00000001也已经是接近黑的图了,高位的位图已经被提取了,剩下低位的位图所包含原图的元素已经很少了。

上面是从高位到低位的顺序提取,也可以从低位到高位的顺序进行提取,
如代码中for循环的备注所示,只要修改一下for循环的顺序就可以了。

下面演示从低位到高位的顺序进行提取:

也可以发现刚开始从低位提取的时候,对原图的影响是不大的。

2.彩色图-位平面提取过程

def bit_decompose_rgb_video(file):
    # 视频演示:彩色图-位平面提取过程
    img = cv.imread(file, -1)
    x, y, z = img.shape
    mask = np.zeros((x, y, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 255 - 2**i

    cv.imshow('11111111', img)
    cv.waitKey(1250)

    num = 255
    # for i in range(8): # 从低位到高位的顺序提取
    for i in range(7, -1, -1):  # 从高位到低位的顺序提取
        img[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
        img[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
        img[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])

        num -= 2**i
        title = '{:0>8s}'.format(str(bin(num))[2:])
        cv.setWindowTitle('11111111',title)
        cv.imshow('11111111',img)
        cv.waitKey(1250)

    cv.waitKey()
    cv.destroyAllWindows()

从高位到低位的顺序提取

从低位到高位的顺序提取

上面演示的是分解过程,接下来演示合成过程 (要想进行合成,也是要先对原图进行分解,分解之后再进行合成)

3.灰度图-位平面合成过程

def bit_compose_gray_video(file):
    # 视频演示:灰度图-位平面合成过程
    img = cv.imread(file, 0)
    r, c = img.shape
    mask = np.zeros((r, c, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 2 ** i

    cv.imshow('00000000', img)
    cv.waitKey(1250)

    num = 0
    temp = np.zeros((r, c), 'uint8')
    # for i in range(8): # 从低位到高位的顺序合成
    for i in range(7, -1, -1):  # 从高位到低位的顺序合成
        bit_img = cv.bitwise_and(img, mask[:, :, i])
        temp = cv.bitwise_or(temp, bit_img)

        num += 2**i
        title = '{:0>8s}'.format(str(bin(num))[2:])
        cv.setWindowTitle('00000000', title)
        cv.imshow('00000000', temp)
        cv.waitKey(1250)

    cv.waitKey()
    cv.destroyAllWindows()

从高位到低位的顺序合成

从低位到高位的顺序合成

4.彩色图-位平面合成过程

def bit_compose_rgb_video(file):
    # 视频演示:彩色图-位平面合成过程
    img = cv.imread(file, -1)
    x, y, z = img.shape
    mask = np.zeros((x, y, 8), 'uint8')
    for i in range(8):
        mask[:, :, i] = 2 ** i

    bit_img = np.zeros((x, y, 3), 'uint8')
    temp = np.zeros((x, y, 3), 'uint8')

    cv.imshow('00000000', temp)
    cv.waitKey(1250)
    
    num = 0
    # for i in range(8): # 从低位到高位的顺序合成
    for i in range(7,-1,-1):  # 从高位到低位的顺序合成
        bit_img[:, :, 0] = cv.bitwise_and(img[:, :, 0], mask[:, :, i])
        bit_img[:, :, 1] = cv.bitwise_and(img[:, :, 1], mask[:, :, i])
        bit_img[:, :, 2] = cv.bitwise_and(img[:, :, 2], mask[:, :, i])

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

        num += 2**i
        title = '{:0>8s}'.format(str(bin(num))[2:])
        cv.setWindowTitle('00000000', title)
        cv.imshow('00000000', temp)
        cv.waitKey(1250)

    cv.waitKey(0)
    cv.destroyAllWindows()

从高位到低位的顺序合成

从低位到高位的顺序合成

转载请附上本文链接:https://blog.csdn.net/FujLiny/article/details/110817053

本文地址:https://blog.csdn.net/FujLiny/article/details/110817053