欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

OpenCV-Python 视频演示:图像位平面分解与合成的过程

程序员文章站 2022-06-22 16:28:15
一、前言二、位平面分解(提取)与合成1.灰度图-位平面提取2.彩色图-位平面提取三、视频演示:图像位平面分解与合成的过程1.灰度图-位平面提取过程2.彩色图-位平面提取过程3.灰度图-位平面合成过程4.彩色图-位平面合成过程...

一、前言

OpenCV-Python 视频演示:图像位平面分解与合成的过程
本次演示使用的这张图片来源于壁纸网站,如有侵权,请联系我删除。


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

所用到的库:

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()

OpenCV-Python 视频演示:图像位平面分解与合成的过程
如图所示的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()

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

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

OpenCV-Python 视频演示:图像位平面分解与合成的过程


OpenCV-Python 视频演示:图像位平面分解与合成的过程

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

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()

OpenCV-Python 视频演示:图像位平面分解与合成的过程
视频演示过程中,请留意标题的变化。
11111111表示未开始提取的原图
01111111表示从原图中提取了第8位位图之后的效果
00111111表示从原图提取了第8、7位位图之后的效果,依次类推。

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

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

下面演示从低位到高位的顺序进行提取:
OpenCV-Python 视频演示:图像位平面分解与合成的过程
也可以发现刚开始从低位提取的时候,对原图的影响是不大的。

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()

从高位到低位的顺序提取
OpenCV-Python 视频演示:图像位平面分解与合成的过程

从低位到高位的顺序提取
OpenCV-Python 视频演示:图像位平面分解与合成的过程


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

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()

从高位到低位的顺序合成
OpenCV-Python 视频演示:图像位平面分解与合成的过程

从低位到高位的顺序合成
OpenCV-Python 视频演示:图像位平面分解与合成的过程

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()

从高位到低位的顺序合成
OpenCV-Python 视频演示:图像位平面分解与合成的过程

从低位到高位的顺序合成
OpenCV-Python 视频演示:图像位平面分解与合成的过程


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


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