有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~

但是,作为一个新时代的程序猿,我们不能够就这么简单处理对不对。对

于是翻起了课本,发现有一种算法叫做矩阵补全(matrix compltion)可以用来做图像修复,可以把模糊成这样的新垣结衣修复

新垣结衣原图
加了两次高斯噪声的新垣结衣
修复后的新垣结衣

虽然比原图模糊了一点,但新垣结衣还是美丽好看的(甚至别有一番韵味)。那么其实我们可以想一想噪声其实就是相当于数据缺失,那么水印也是相当于数据缺失,那么矩阵补全可以把图像修复,是不是也可以把水印去掉呢?

首先,我们来了解一下什么是矩阵补全

矩阵补全(matrix completion)

根据字面意思就是有一个矩阵,里面有一些元素是缺失的,我们要想办法把缺失的元素补全,这就是矩阵补全了。

矩阵补全一开始是从Netflix 的一个比赛中流行开来的,悬赏100万美金给能够提高公司现行的matrix completion 算法10%以上的优胜队伍。

以豆瓣为例,就是根据电影的评分系统做推断。但是我们知道,豆瓣的用户千千万,电影的数量千千万,但是每个用户对只会对极少的电影进行评分,那么这个矩阵中大部分的数据是缺失的,我们要根据这个非常稀疏的矩阵,来推断整个用户群对不同电影的评分,这就是矩阵补全的实际应用。

Netflix比赛

我们这里图像也可以看做是一个矩阵(彩色图像可以看成是三个图像),残缺的图像就相当于缺失的数据,那么通过算法把缺失的数据补上也就是修复图像了。

水印去除

我的思路就是,在有水印的地方,加一块黑色遮罩,模拟数据缺失,然后运用矩阵补全的方式复原,同样用新垣结衣来试验,先用黑色 颜色块遮罩,然后就会惊人的发现

加了色块就好了,因为背景就是黑色。。。。

加了黑色色块就好了。。。。根本不用修复,但是我还是不死心的进行了一番操作

修复后的新垣结衣2

发现修复后的图片还不如原来的,因为这次矩阵补全把黑色块附近的裙子给学习过去了。看来有点风险,还是先不用新垣结衣的照片,先用别的测试测试

好吧,我们换一张风景图片,有一块小水印

有水印的图
加了遮罩的图
复原图

可以看出,复原图虽然有一点瑕疵,但是已经算是比较成功的把水印去掉了,那么说明这个算法还是比较靠谱的,那么我们还是换上新垣结衣的照片,找了一张好看的,但是没有水印,但是不影响我们的实验,我们假设她有水印,然后我们加上黑色遮罩

原图
打了码的新垣结衣
修复后的新垣结衣

不得不说,修复效果很一般,新垣结衣都毁容了!!!!!!

很愤怒,于是乱画一通发泄

乱画之后的新垣结衣

一时气愤不由得把新垣结衣乱涂乱画起来,现在后悔不已,那么能不能够复原呢?我们来看一看

再次修复的新垣结衣

结论
综上来看,用矩阵分解的办法来进行图像修复效果还是很不错的,不论是高噪声照片还是被乱涂乱画之后的照片, 可以用于家里照片被熊孩子乱涂乱画之后的修复。

但是对于水印去除呢,部分图片还是可以的,但是部分图片效果还是差强人意。

其实内在含义就是,当数据连续缺失区域不大时,如上图风景照片或者细小的涂鸦笔记,矩阵补全的效果就比较好,但是当数据连续缺失区域较大时,矩阵补全的效果可能就没有那么好,特使是用在如此美丽动人的新垣结衣身上,小小瑕疵就会被放大得更厉害。

下面是具体实现源码:

主要用的算法是LRMC

import numpy as npdef svt(mat, tau):u, s, v = np.linalg.svd(mat, full_matrices = 0)vec = s - tauvec[vec < 0] = 0return np.matmul(np.matmul(u, np.diag(vec)), v)def LRMC(sparse_mat, dense_mat, rho, maxiter):pos_train = np.where(sparse_mat != 0)pos_test = np.where((sparse_mat == 0) & (dense_mat != 0))binary_mat = sparse_mat.copy()binary_mat[pos_train] = 1X = sparse_mat.copy()Z = sparse_mat.copy()T = sparse_mat.copy()rse = np.zeros(maxiter)for it in range(maxiter):Z = svt(X + T / rho, 1 / rho)X = Z - T / rhoX[pos_train] = sparse_mat[pos_train]T = T - rho * (Z - X)rse[it] = (np.linalg.norm(X[pos_test] - dense_mat[pos_test], 2) / np.linalg.norm(dense_mat[pos_test], 2))return X, rse

准备两张图

import imageio
import matplotlib.pyplot as pltlena = imageio.imread('z6.bmp')/255.0
sparse_lena=imageio.imread('z6ss.bmp')/255.0
print('The shape of the image is {}.'.format(lena.shape))dim1, dim2,dim3 = lena.shape
mask = np.round(np.random.rand(dim1, dim2,dim3))  # Generate a binary mask.
mask1 = np.round(np.random.rand(dim1, dim2,dim3))
# mask2 = np.round(np.random.rand(dim1, dim2))plt.figure(figsize=(15,12))
plt.imshow(lena)
plt.title('The original Lena')
plt.axis('off')plt.figure(figsize=(15,12))
plt.imshow(sparse_lena)
plt.title('The incomplete Lena')
plt.axis("off")plt.show()

因为是彩色图片,所以需要将图片分成三原色再分别进行修复

import timestart = time.time()
rho = 0.005
maxiter = 50
mat_hat, rse_svt = LRMC(sparse_lena[:,:,0], lena[:,:,0], rho, maxiter)
print('Running time: %d seconds.'%(end - start))
start = time.time()
mat_hat1, rse_svt1 = LRMC(sparse_lena[:,:,1], lena[:,:,1], rho, maxiter)
print('Running time: %d seconds.'%(end - start))
start = time.time()
mat_hat2, rse_svt2 = LRMC(sparse_lena[:,:,2], lena[:,:,2], rho, maxiter)
print('Running time: %d seconds.'%(end - start))#修复完把三张图拼接在一起
c=[]
for i in range(dim1):c.append([])for j in range(dim2):c[i].append([mat_hat[i][j],mat_hat1[i][j],mat_hat2[i][j]])

显示修复后的图片

plt.figure(figsize=(20,15))
# plt.imshow(mat_hat)
plt.imshow(c)
# plt.imshow(mat_hat2)
plt.savefig("lbk.png")
plt.axis('off')
plt.show()

python 去除str的引号 去除括号_用python进行图像修复与去除水印相关推荐

  1. python中花括号_震惊Python的精髓居然是方括号花括号和圆括号

    https://m.toutiaocdn.com/i6862197987209118219/?app=news_article&timestamp=1597845881&use_new ...

  2. 图像修复 python_用python进行图像修复与去除水印

    有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~ 但是,作为一个新时代的程序 ...

  3. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  4. python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...

    Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...

  5. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  6. python交互式编程入门先学什么_为什么 Python 对于编程入门学习来说,是一门很棒的语言...

    在这篇文章里,我会来阐述下为什么我觉得 Python 对于计算机编程入门教学来说是一门很棒的编程语言(对基础编程课程更多观点可以查看这篇文章).这也是从我针对初学者Python 编程教学过程中获得并总 ...

  7. 手机python编程文件如何转文档_(转)Python之文件读写

    原文:https://www.cnblogs.com/huilixieqi/p/6494891.html 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤 ...

  8. python学生类出不来中文_求教Python中文编码望大神给解答

    1.椭圆处定义编码,在pycharm里,有没有什么方便的注释方法或者快捷键,符号太多,写起来不是很方便. 2.长方形里边变量个字符串拼接,就有问题啦,怎么解决. 谢谢! print 后面的括号被认为是 ...

  9. python程序设计课后答案第三单元_最新Python程序设计课后习题答案-第一单元

    精品文档 精品文档习题1 一.选择题 1.Python语言属于().C A.机器语言 B.汇编语言 C.高级语言 D.科学计算语言2.下列选项中,不属于Python特点的是().B A.面向对象 B. ...

最新文章

  1. 【转载】SQL执行计划
  2. 《人月神话》(P11)为舍弃而计划
  3. 数字图像处理基本运算
  4. C#基础加强(7)之ref与out
  5. mysql 隔离级别 知乎_TiDB 事务隔离级别
  6. Debian 9 中设置网络
  7. Jupyter 常见可视化框架的选择
  8. python生成一圈数包裹一圈数的数组
  9. python : os.path 相关操作
  10. CSS快速入门-基本选择器
  11. 最近卡脖子的汽车芯片产业链全景图(车规级芯片)
  12. C++ 对象的内存布局【转】
  13. 559. N叉树的最大深度
  14. WinUsbNet: A managed interface to WinUSB.sys
  15. 等级保护三级测评-----云计算安全扩展要求
  16. SpringBoot使用Ehcache
  17. 【服务器】服务器安全防护、防止服务器攻击和保护措施
  18. 中国研修网计算机培训心得,网络研修培训心得体会
  19. 《IT时代周刊》:雅虎兵败中国
  20. 手机qq邮箱html,手机QQ邮箱在哪里找

热门文章

  1. ffmpeg遇到inttypes.h和UINT64_C
  2. OSPF中 hello报文的 内容
  3. PMP-【第3章 项目管理过程】-2021-1-11(61页-87页)
  4. OpenStack Heat 如何来实现和支持编排
  5. c 语言字符串转二进制,在C ++中将字符串转换为二进制序列
  6. Linux脚本自动安装软件,一个快速自动安装Apache及其相关软件的Shell脚本
  7. l#039;oracle 酒,【金钟庄园副牌干红葡萄酒Carillon de L#039;angelus】价格_年份_评分 - 酒窝网官网...
  8. cmd指令大全指令_干货 | Linux 超全实用指令大全
  9. shell date 获取昨天日期
  10. linux之dup和dup2函数解析