python 马赛克还原_「马赛克画」利用Python生成马赛克画,简单两步去除马赛克! - seo实验室...

马赛克画

大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~

9480d38dce3b2146057a27576c57585c.png

马赛克画是一张由小图拼成的大图,本文的封面就是我们的效果图,放大看细节,每一块都是一张独立的图片,拼在一起组成一张大图,感觉像是用马赛克拼出来的画,所以叫马赛克画。看到网上的一些马赛克画觉得很酷,于是自己用Python实现了一下将一张原图转换成马赛克画。

我们的效果图是这样的

823ccbc1aaeef9b5df5c3c842221daa6.png

原图是这样的

c16e4f764d5704749a667e856f139491.png

实现的具体思路是这样

第一步:首先收集一组图片,这些图片会作为大图中的小方格图片。图片越多,最后生成的图片颜色越接近。

第二步:将要转换的图片分割成一个一个小方格图片,像下面这样

699f28d5543f60714927bcf6e8dc1fb2.png

第三步:对于每一个小方格图片,取图片集里面最接近的图片替换。所有小方格都替换后,就生成了我们最终的马赛克画。

听上去是不是很简单?

我们来看一下具体的实现步骤,下面是一些核心代码。

我们的图片集存在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数组,这里我们将三维数组转换成一维数组后,比较两者的欧式距离。之后要找出最相似的图片,只需遍历图片集中所有的图片,找到距离最短的那张图片,去替换原图中的小方格就可以了。

我们再来看一下最终实现的效果

823ccbc1aaeef9b5df5c3c842221daa6.png

放大图中局部的细节如下

e2c3fc67b722e800cbc80c973c849941.png

如果对图片的画质不满意,想要更精细的画质,可以考虑在分割的时候把图片分割成更小的方格,不过这样也会增加程序运行的时间。

生成图片的过程比较耗时,考虑到性能原因,原程序中使用多进程的方式并行处理。

那么我们的图片是否可以做到消除水印?

Python 的概念

先别急,先说水印再说马赛克,看到网上有许多消除水印的软件,当然也是要有用的到的朋友才知道吧。

当我们有些美好的回忆被记录在有折痕、污渍以及有水印的图片上时,我们就可以在网上下载相关软件,这知识针对动手能力不强的朋友,或者对Python编程不了解的朋友,因为用Python,你不用超过20行代码就可以做得到。

d78bfde9c57ab6854b007689cc02ccdc.png

​消除水印,效果如下:

9b32b514d5642bc484947615109fb114.png

原理:

OpenCV框架标定噪声的特征,再利用噪声附近颜色特征识别欲修改的颜色,达到水印删除效果。

56427ab81ff4b19563c6bbbaa790699d.png

解析:

e4fdbd65a3b0893f8c5482c684932c65.png

Python源代码:

9ebc89840479dc5104a179274d1a53bc.png

逆转马赛克,看片无忧

马赛克长什么样子想来我也是无需多言了,它可以将图片、视频等特定区域的色阶,永久不可逆的细节劣化并造成色块打乱的效果,再强的人、也没有什任何软件可以逆转马赛克,让图像完美恢复到原有效果!即使不能完美修复,但是我们至少要看清还是做得到的。

6980d5f1cadb7a86c5e639f736f65c2e.png

原理同上去除水印,OpenCV框架

效果:

9fc951bd4681f05adfd7c725b6f1e36c.png

Python代码:

7a363561d82a2048afcc1d9d7a7264aa.png

此文只介绍Python使用方法,不过瘾、不了解Python,自行找谷歌寻求解决方法即可

相关阅读

去马赛克软件哪个好?很多伙伴都喜欢将图片打上马赛克,这总能让人浮想联翩,如果你真的想看的话,可以使用去马赛克软件试一下,相信你会得

前段时间非常流行的东北大花袄马赛克,近日又掀起MLGB马赛克的热潮,明星李晨nic微博晒出自己特色生活照加入了很多奇特的马赛克图案,

打马赛克用什么软件好?大家在晒图的时候,是不是有这样的烦恼?拍照的时候把七七八八的东西拍进镜头里了,而这些东西并不希望给大家看到

马赛克是阻止人类进步的绊脚石,谁来拯救让用户轻松实现去除马赛克呢?我们经常会在一些视频中看到人物画面被打上马赛克,非常影响观看

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值