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

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


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


9. 图像的马赛克处理

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

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

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


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

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

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

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

(1)以 8 位灰度图像为例,原始图像指定区域像素值为 8 位二进制数 (p7,p6,...,p1,p0)(p_7, p_6,...,p_1,p_0)(p7,p6,...,p1,p0)
(2)用密钥 key 对指定区域像素值加密处理得到 8 位二进制数 (c7,c6,...,c1,c0)(c_7, c_6,...,c_1,c_0)(c7,c6,...,c1,c0)
(3)将加密的像素值右移两位,成为 (0,0,c7,c6,...,c2)(0, 0, c_7, c_6,...,c_2)(0,0,c7,c6,...,c2)
(4)嵌入马赛克块颜色 (b7,b6,0,...0)(b_7,b_6,0,...0)(b7,b6,0,...0) 的前两位,得到结果 (b7,b6,c7,c6,...,c2)(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: 0b11000000roiMosaic = np.zeros(roi.shape, np.uint8)  # ROI 区域np.random.seed(psw)  # 设置随机种子为 pswroiKey = 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)  # 设置随机种子为 pswroiKey = 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.加密马赛克图像处理与解密复原

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小网站asp好还是php好,网站程序是asp好还是php好,哪个更利于优化?

网站程序是asp好还是php好呢&#xff1f;如果我们要做seo优化&#xff0c;哪一个又更利于优化呢&#xff1f;毕竟&#xff0c;现在在网上所看到的程序&#xff0c;是比较多的&#xff0c;选择一个好的网站程序&#xff0c;可以少走很多弯路。如果&#xff0c;大家建一个网站是为…

Java IO深入

IO体系 Java IO 体系种类繁多&#xff0c;感觉很复杂&#xff0c;但其实是 IO 涉及的因素太多了。在进行介绍的时候添加了设计模式等的使用&#xff0c;会让你感觉更加难以理解难以使用这些IO类&#xff0c;在此对java的IO做了一个详细的总结。 IO 类设计出来&#xff0c;肯定…

【OpenCV 例程200篇】222. 特征提取之弗里曼链码(Freeman chain code)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】222. 特征提取之弗里曼链码&#xff08;Freeman chain code&#xff09; 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff…

【OpenCV 例程200篇】224. 特征提取之提取骨架

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】224. 特征提取之提取骨架 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。 特征通常是针…

inuri .php id=,php常用函数(遇见就补充)

preg_match()preg_match(string pattern, string subject [, array matches [, int flags]])在subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。如果提供了 matches&#xff0c;则会被搜索的结果所填充。$matches[0]将包含于整个模式匹配的文本&#xff0c;$match…

【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率 特征通常是针对于图像中的某个目标而言的。 我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。图像分割之后&#xff0c;还要对目标区域进…

Java常见的几种设计模式

单例模式 指一个应用程序中&#xff0c;某个类的实例对象只有一个&#xff0c;你没有办法去new&#xff0c;因为构造器是被private修饰的&#xff0c;一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用&#xff0c;并不是一个新的实例&a…

【OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】227. 特征描述之 LBP 纹理特征算子 特征通常是针对于图像中的某个目标而言的。 针对目标所在区域的特征描述符&#xff08;Region descriptors&#xff09;&#xff0c;称为区域特征描述子。 4.2 纹…

【OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】228. 特征描述之 extendLBP 改进算子 特征通常是针对于图像中的某个目标而言的。针对目标所在区域的特征描述符&#xff08;Region descriptors&#xff09;&#xff0c;称为区域特征描述子。 局部…

【OpenCV 例程200篇】229. 特征描述之 LBP 算子比较(skimage)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】229. 特征描述之 LBP 算子比较&#xff08;skimage&#xff09; 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具…

Java多线程的使用

无论在我们的工作中还是在我们的生活中&#xff0c;我们都会用到多线程的知识&#xff0c;今天就给大家讲一下如何使用多线程。 序幕 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 我们首先要知道进程和线程分别是什么&#xff1f; 进程 - 进…

oracle 存储过程 db,oracle数据库的存储过程是什么?

oracle数据库的存储过程&#xff1a;一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中。存储过程是由流控制和SQL语句书写的过程&#xff0c;这个过程经编译和优化后存储在数据库服务器中&#xff0c;应用程序使用时只要调用即可。存储过程(Stored Procedur…

【OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】230. 特征描述之 LBP 统计直方图 局部二值模式&#xff08;LBP&#xff0c;Local binary patterns&#xff09;是一种用来描述图像局部纹理特征的算子&#xff0c;它具有旋转不变性和灰度不变性的优点…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性&#xff0c;因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源&#xff0c;在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码&#xff0c;测试连接&#xff0c;若通过说明成功&#xff1b;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念&#xff0c;是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用&#xff0c;如模式识别、目标分类、图像编…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵&#xff08;GLCM&#xff09; 4.2.4 灰度共生矩阵&#xff08;GLCM&#xff09; 灰度共生矩阵&#xff08;Gray level co-occurrence matrix&#xff0c;GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下&#xff1a;如果关注数据库的性能&#xff0c;那么当拿到一份AWR报告的时候&#xff0c;最想知道的第一件事情可能就是系统资源的利用情况了&#xff0c;而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正&#xff08;OpenCV&#xff09; 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种基于统计的数据降维方法&#xff0c;又称主…

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获&#xff0c;不得跨协程捕获异常。不仅是应用层throw的Exception&#xff0c;底层的一些错误也是可以被捕获的&#xff0c;如function、class、method不存在下面的代码中&#xff0c;try/catch和throw在不同的协程…