OpenCV 例程200篇221.加密马赛克图像处理与解密复原

Posted YouCans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 例程200篇221.加密马赛克图像处理与解密复原相关的知识,希望对你有一定的参考价值。

『youcans 的 OpenCV 例程200篇 - 总目录』


【youcans 的 OpenCV 例程200篇】221.加密马赛克图像处理与解密复原


9. 图像的马赛克处理

马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化,造成色块模糊的效果,看上去像是一个个小格子组成的色块,称为马赛克。马赛克效果的主要目的是使特定区域的细节无法辨认,经常用于遮挡人物脸部、隐私信息。

上采样和下采样是不可逆的,将下采样的图像还原回原来尺寸时会丢失高频信息,使图片变模糊。因此,消除图像马赛克在原理上是不可能的。但是,通过图片像素临近点插值的填充算法,可以增强马赛克区域的视觉效果。近年来,随着 AI 技术的发展,基于对大量类似清晰图像的学习,使用 AI 算法可以较好地还原图像,识别被马赛克遮挡的人脸或文本,取得了很好的效果。

例程 A4.14 开发了一种可以对指定区域进行加密的马赛克处理方法,处理的图像不仅实现了马赛克效果,而且以加密格式保存了马赛克区域的图像细节。通过加密密钥,可以对马赛克图像进行解密处理,清晰地复原马赛克图像的细节。


例程 A4.14:加密马赛克图像处理与图像解密复原

通常的马赛克处理是图像向下采样的过程,丢失的高频细节是不可逆的,因此消除马赛克复原图像在原理上是不可能的。

本例程开发了一种对指定区域进行加密的马赛克处理方法,处理后的图像不仅实现了马赛克效果,而且以加密格式保存了马赛克区域的图像细节。通过加密密钥可以对马赛克图像进行解密处理,清晰地复原图像的细节。

加密马赛克图像处理的步骤为:

(1)以 8 位灰度图像为例,原始图像指定区域像素值为 8 位二进制数 ( p 7 , p 6 , . . . , p 1 , p 0 ) (p_7, p_6,...,p_1,p_0) (p7,p6,...,p1,p0)
(2)用密钥 key 对指定区域像素值加密处理得到 8 位二进制数 ( c 7 , c 6 , . . . , c 1 , c 0 ) (c_7, c_6,...,c_1,c_0) (c7,c6,...,c1,c0)
(3)将加密的像素值右移两位,成为 ( 0 , 0 , c 7 , c 6 , . . . , c 2 ) (0, 0, c_7, c_6,...,c_2) (0,0,c7,c6,...,c2)
(4)嵌入马赛克块颜色 ( b 7 , b 6 , 0 , . . . 0 ) (b_7,b_6,0,...0) (b7,b6,0,...0) 的前两位,得到结果 ( b 7 , b 6 , c 7 , c 6 , . . . , c 2 ) (b_7,b_6,c_7, c_6,...,c_2) (b7,b6,c7,c6,...,c2)

此时马赛克区域的像素,总体视觉上呈马赛克效果,但每个像素仍以加密的方式保存了大部分高频细节信息。如果没有密匙 key,并不能复原马赛克区域的图像细节。而知道加密方法和密匙 key,则很容易进行解密处理,清晰地复原图像的细节。

例程只是给出基本的实现方法,实际使用时还要考虑算法的抗干扰性能。

    # A4.14 加密马赛克图像处理与图像解密复原
    img = cv.imread("../images/imgLena.tif", 1)  # 加载原始图片,单通道
    psw = 36  # 加密密钥,随机种子

    # 对指定区域进行马赛克处理
    # 选取指定区域
    # roi = cv.selectROI(img, showCrosshair=True, fromCenter=False)
    # x, y, wRoi, hRoi = roi  # 矩形裁剪区域 (y:y+h, x:x+w) 的位置参数
    x, y, wRoi, hRoi = 208, 176, 155, 215  # 矩形裁剪区域的位置参数
    roi = img[y:y+hRoi, x:x+wRoi].copy()  # 切片获得矩形裁剪区域
    print(x, y, wRoi, hRoi)
    # 指定区域马赛克处理
    k = 10  # 马赛克块的宽度
    markH2 = [192, 192, 192]  # 192: 0b11000000
    roiMosaic = np.zeros(roi.shape, np.uint8)  # ROI 区域
    np.random.seed(psw)  # 设置随机种子为 psw
    roiKey = np.random.randint(0, 256, roi.shape, np.uint8)  # 生成 ROI 密钥
    roiEncrypted = cv.bitwise_xor(roi, roiKey)  # 用 roiKey 对 ROI 加密
    for h in range(0, hRoi, k):
        for w in range(0, wRoi, k):
            color = roi[h, w]  # 顶点颜色
            # colorH2 = np.bitwise_and(color, markH2)  # markH2:(0b11000000),color 取高两位
            # mosaic[h:h+k, w:w+k, :] = colorH2  # 用顶点颜色覆盖马赛克块
            colorH2 = np.bitwise_and(color, markH2)  # 取顶点颜色的高两位,作为马赛克块颜色
            block = roiEncrypted[h:h+k, w:w+k, :] >> 2  # 右移 2 位,保存像素特征(已加密)
            roiMosaic[h:h+k, w:w+k, :] = block + colorH2  # 高两位载入马赛克颜色值,形成马赛克块
    # 生成完整的马赛克加密图像
    imgMosaic = img.copy()
    imgMosaic[y:y+hRoi, x:x+wRoi] = roiMosaic

    # 由马赛克加密图像和密钥 psw 重建原始图像
    imgRebuilt = imgMosaic.copy()
    roiExtract = imgMosaic[y:y+hRoi, x:x+wRoi]  # 提取ROI 区域
    roiExtract = roiExtract << 2  # 左移 2 位,恢复像素特征(已加密)
    np.random.seed(psw)  # 设置随机种子为 psw
    roiKey = np.random.randint(0, 256, roi.shape, np.uint8)  # 生成 ROI 密钥
    roiDecrypt = cv.bitwise_xor(roiExtract, roiKey)  # 用 roiKey 对 ROI 解密
    imgRebuilt[y:y+hRoi, x:x+wRoi] = roiDecrypt  # 生成完整的解密图像

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.title("Original image"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(232), plt.title("Encrypted coding image"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgMosaic, cv.COLOR_BGR2RGB))
    plt.subplot(233), plt.title("Rebuilt decrypted image"), plt.axis('off')
    plt.imshow(cv.cvtColor(imgRebuilt, cv.COLOR_BGR2RGB))
    plt.subplot(234), plt.title("Region of interest"), plt.axis('off')
    plt.imshow(cv.cvtColor(roi, cv.COLOR_BGR2RGB))
    plt.subplot(235), plt.title("Encrypted mosaic ROI"), plt.axis('off')
    plt.imshow(cv.cvtColor(roiMosaic, cv.COLOR_BGR2RGB))
    plt.subplot(236), plt.title("Decrypted ROI"), plt.axis('off')
    plt.imshow(cv.cvtColor(roiDecrypt, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()



【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125529465)
Copyright 2022 youcans, XUPT
Crated:2022-6-30

219. 添加数字盲水印
220.对图像进行马赛克处理
221.加密马赛克图像处理与解密复原

以上是关于OpenCV 例程200篇221.加密马赛克图像处理与解密复原的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇220.对图像进行马赛克处理

youcans 的 OpenCV 例程200篇201. 图像的颜色空间转换

OpenCV 例程200篇204. 图像的色彩风格滤镜

youcans 的 OpenCV 例程200篇179.图像分割之 GrabCut 图割法(掩模图像)

youcans 的 OpenCV 例程 200 篇111. 雷登变换反投影重建图像

youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波