python 马赛克还原_「马赛克画」利用Python生成马赛克画,简单两步去除马赛克! - seo实验室...
马赛克画
大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~
马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。
我们的效果图是这样的
原图是这样的
实现的具体思路是这样
第一步:首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。
第二步:将要转换的图片分割成一个一个小方格图片,像下面这样
第三步:对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。
听上去是不是很简单?
我们来看一下具体的实现步骤,下面是一些核心代码。
我们的图片集存在images目录下,下面的代码加载目录下所有的图片,并缩放成统一的尺寸
import re
import os
import cv2
import numpy as np
from tqdm import tqdm
IMG_DIR = "images"
def load_all_images(tile_row, tile_col):
img_dir = IMG_DIR
filenames = os.listdir(img_dir)
result = []
print(len(filenames))
for filename in tqdm(filenames):
if not re.search(".jpg", filename, re.I):
continue
try:
filepath = os.path.join(img_dir, filename)
im = cv2.imread(filepath)
row = im.shape[0]
col = im.shape[1]
im = resize(im, tile_row, tile_col)
result.APPend(np.array(im))
except Exception as e:
msg = "ERROR with {} - {}".format(filepath, str(e))
print(msg)
return np.array(result, dtype=np.uint8)
这里load_all_images函数的参数就是统一后的尺寸,tile_row和tile_col分别对应高和宽。
下面的代码对要转换的图片进行分割
img = cv2.imread(infile)
tile_row, tile_col = get_tile_row_col(img.shape)
for row in range(0, img_shape[0], tile_row):
for col in range(0, img_shape[1], tile_col):
roi = img[row:row+tile_row,col:col+tile_col,:]
我们将要转换的图片分割成一个个小方格,tile_row和tile_col是小方格的高和宽,roi存取小方格中的图片数据。
下面是计算两张图片相似度的函数
from scipy.spatial.distance import euclidean
def img_distance(im1, im2):
if im1.shape != im2.shape:
msg = "shapes are different {} {}".format(im1.shape, im2.shape)
raise Exception(msg)
array1 = im1.flatten()
array2 = im2.flatten()
dist = euclidean(array1, array2)
return dist
im1和im2是两张图片的数据,图片数据是一个三维的numpy数组,这里我们将三维数组转换成一维数组后,比较两者的欧式距离。之后要找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片,去替换原图中的小方格就可以了。
我们再来看一下最终实现的效果
放大图中局部的细节如下
如果对图片的画质不满意,想要更精细的画质,可以考虑在分割的时候把图片分割成更小的方格,不过这样也会增加程序运行的时间。
生成图片的过程比较耗时,考虑到性能原因,原程序中使用多进程的方式并行处理。
那么我们的图片是否可以做到消除水印?
Python 的概念
先别急,先说水印再说马赛克,看到网上有许多消除水印的软件,当然也是要有用的到的朋友才知道吧。
当我们有些美好的回忆被记录在有折痕、污渍以及有水印的图片上时,我们就可以在网上下载相关软件,这知识针对动手能力不强的朋友,或者对Python编程不了解的朋友,因为用Python,你不用超过20行代码就可以做得到。
消除水印,效果如下:
原理:
OpenCV框架标定噪声的特征,再利用噪声附近颜色特征识别欲修改的颜色,达到水印删除效果。
解析:
Python源代码:
逆转马赛克,看片无忧
马赛克长什么样子想来我也是无需多言了,它可以将图片、视频等特定区域的色阶,永久不可逆的细节劣化并造成色块打乱的效果,再强的人、也没有什任何软件可以逆转马赛克,让图像完美恢复到原有效果!即使不能完美修复,但是我们至少要看清还是做得到的。
原理同上去除水印,OpenCV框架
效果:
Python代码:
此文只介绍Python使用方法,不过瘾、不了解Python,自行找谷歌寻求解决方法即可
相关阅读
去马赛克软件哪个好?很多伙伴都喜欢将图片打上马赛克,这总能让人浮想联翩,如果你真的想看的话,可以使用去马赛克软件试一下,相信你会得
前段时间非常流行的东北大花袄马赛克,近日又掀起MLGB马赛克的热潮,明星李晨nic微博晒出自己特色生活照加入了很多奇特的马赛克图案,
打马赛克用什么软件好?大家在晒图的时候,是不是有这样的烦恼?拍照的时候把七七八八的东西拍进镜头里了,而这些东西并不希望给大家看到
马赛克是阻止人类进步的绊脚石,谁来拯救让用户轻松实现去除马赛克呢?我们经常会在一些视频中看到人物画面被打上马赛克,非常影响观看
python 马赛克还原_「马赛克画」利用Python生成马赛克画,简单两步去除马赛克! - seo实验室...相关推荐
- python获取财务数据_「净利润增长率」使用python获取股票“净利润同比增长率”等“上市公司成长能力”数据 - seo实验室...
净利润增长率 证券宝www.baostock.com是一个免费.开源的证券数据平台. 提供大量准确.完整的证券历史行情数据.上市公司财务数据.实时证券行情推送服务等. 通过Python API获取证券 ...
- matlab 等高线数值显示_「matlab等高线」matlab中contour 函数的用法(绘制等高线) - seo实验室...
matlab等高线 原文 contour 矩阵的等高线图 全页折叠 语法 contour(Z) contour(Z,n) contour(Z,v) contour(X,Y,Z) contour(X,Y ...
- 撤销前进快捷键_「撤销快捷键」excel表格撤销快捷键是什么_ctrl+z是吗 - seo实验室...
撤销快捷键 在使用excel工作的时候,我们有时会打错一些字,这时候我们就会用到撤销了.那么撤销的快捷键是什么呢,下面让seo实验室小编为你带来Excel表格撤销的快捷键.希望对你有帮助! excel ...
- python编写赛车_「世界模型」实现,一步步让机器掌握赛车和躲避火球的技能
前段时间,由谷歌大脑研究科学家 David Ha 与瑞士 AI 实验室 IDSIA 负责人 Jürgen Schmidhuber(他也是 LSTM 的提出者)共同提出的「世界模型」让人工智能在「梦境」 ...
- python 修改文件名_【学习分享】利用python批量修改文件名
1 前言 分享一个利用python批量修改文件名的方法,我们以前分享过用DOS命令来批量修改文件名,但是如果要修改多个文件夹内的文件名,用DOS命令就不好处理了,我们就来分享一下如何用python处理 ...
- python3.7卸载不了_「访问升级」No Python 3.7 installation was detected,Python 3.7卸载失败 - seo实验室...
访问升级 No Python 3.7 installation was detected,解决Python 3.7卸载失败问题问题 解决办法 问题 卸载Python 3.7 时,提示No Python ...
- python 分词工具_「分词工具」干货 | 史上最全中文分词工具整理 - seo实验室
分词工具 作者 | fendouai 分词服务接口列表 二.准确率评测: THULAC:与代表性分词软件的性能对比 我们选择LTP-3.2.0 .ICTCLAS(2015版) .jieba(C++版) ...
- python二分法排序_「二分法排序」插入排序之二分法插入排序 - seo实验室
二分法排序 简介 二分法插入排序的思想 对于每次循环,都有left,mid,right3个局部变量做支持. 将要插入的元素同mid位置元素比较,选择left - mid-1还是mid+1 - righ ...
- 编译原理实验语义分析_「编译原理」LL(1)文法分析,简单优先分析
首先我们来介绍一下LL(1)文法分析. LL(1)文法是一种自顶向下的分析方式,是从非终结符到终结符的分析方式,这种方式和我们之前说的LR(0)分析方式是刚好相反的,在我们使用LR(0)分析方式的时候 ...
- pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...
一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...
最新文章
- [转] WINCC教学视频
- 【python】基础知识
- Books Queries(codeforces 1066)
- [html] 如何在页面打开PDF文件?
- Android开发中无处不在的设计模式——动态代理模式
- Spring.NET学习笔记22——整合WCF(应用篇) Level 200
- Arm推出全新Mali多媒体套件,想让机器学习进入中低端智能手机
- mysql——数据库事务(C#代码)
- Asp.net MVP模式介绍
- Lambda表达式与函数式接口详解
- linux系统——窗口管理器和桌面环境的区别
- 小程序 消息推送配置token无效(解决方法)订阅消息
- redmine backlogs的tracker使用
- pvt检查是什么意思_EVT、DVT、PVT是什么意思
- Kubernetes 为何称为 K8s?
- 八年老Android开发谈:垃圾中的战斗机,offer都发了,差点无缘Offer
- 945928-17-6,TAMRA alkyne,5-Carboxytetramethylrhodamine-Alkyne,5-羧基四甲基罗丹明-炔烃
- Gabor滤波器为什么能实现频率域加窗
- 努力学习 努力奋斗 踏步而立
- 微信小程序 - 音频播放进度条和点击拖动的控制,支持自定义音乐播放控件样式布局(wx.createAudioContext)解决各种 InnerAudioContext.onTimeUpdate不执行
热门文章
- vue项目 webpack-dev-server 报错
- CSS3中设置元素转换中心点
- background复合属性顺序_background(css复合写法)
- A Deep Q-Network for the Beer Game: A Reinforcement Learning Algorithm to Solve Inventory Optimizati
- python3刷火车票_Python3实现抢火车票功能(上)
- css样式表的作用和意义,什么是CSS?
- linux安装xbox无线手柄,想不到xbox手柄配对方法居然还有3个【详解】
- coreldraw x5安装视频教程_图形设计必备软件:CorelDRAW
- vue 下载Excel 文件
- 基于jsp+mysql+Spring的SSM在线蛋糕商城销售网站项目设计和实现