python 去除str的引号 去除括号_用python进行图像修复与去除水印
有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~
但是,作为一个新时代的程序猿,我们不能够就这么简单处理对不对。对
于是翻起了课本,发现有一种算法叫做矩阵补全(matrix compltion)可以用来做图像修复,可以把模糊成这样的新垣结衣修复
虽然比原图模糊了一点,但新垣结衣还是美丽好看的(甚至别有一番韵味)。那么其实我们可以想一想噪声其实就是相当于数据缺失,那么水印也是相当于数据缺失,那么矩阵补全可以把图像修复,是不是也可以把水印去掉呢?
首先,我们来了解一下什么是矩阵补全
矩阵补全(matrix completion)
根据字面意思就是有一个矩阵,里面有一些元素是缺失的,我们要想办法把缺失的元素补全,这就是矩阵补全了。
矩阵补全一开始是从Netflix 的一个比赛中流行开来的,悬赏100万美金给能够提高公司现行的matrix completion 算法10%以上的优胜队伍。
以豆瓣为例,就是根据电影的评分系统做推断。但是我们知道,豆瓣的用户千千万,电影的数量千千万,但是每个用户对只会对极少的电影进行评分,那么这个矩阵中大部分的数据是缺失的,我们要根据这个非常稀疏的矩阵,来推断整个用户群对不同电影的评分,这就是矩阵补全的实际应用。
我们这里图像也可以看做是一个矩阵(彩色图像可以看成是三个图像),残缺的图像就相当于缺失的数据,那么通过算法把缺失的数据补上也就是修复图像了。
水印去除
我的思路就是,在有水印的地方,加一块黑色遮罩,模拟数据缺失,然后运用矩阵补全的方式复原,同样用新垣结衣来试验,先用黑色 颜色块遮罩,然后就会惊人的发现
加了黑色色块就好了。。。。根本不用修复,但是我还是不死心的进行了一番操作
发现修复后的图片还不如原来的,因为这次矩阵补全把黑色块附近的裙子给学习过去了。看来有点风险,还是先不用新垣结衣的照片,先用别的测试测试
好吧,我们换一张风景图片,有一块小水印
可以看出,复原图虽然有一点瑕疵,但是已经算是比较成功的把水印去掉了,那么说明这个算法还是比较靠谱的,那么我们还是换上新垣结衣的照片,找了一张好看的,但是没有水印,但是不影响我们的实验,我们假设她有水印,然后我们加上黑色遮罩
不得不说,修复效果很一般,新垣结衣都毁容了!!!!!!
很愤怒,于是乱画一通发泄
一时气愤不由得把新垣结衣乱涂乱画起来,现在后悔不已,那么能不能够复原呢?我们来看一看
结论
综上来看,用矩阵分解的办法来进行图像修复效果还是很不错的,不论是高噪声照片还是被乱涂乱画之后的照片, 可以用于家里照片被熊孩子乱涂乱画之后的修复。
但是对于水印去除呢,部分图片还是可以的,但是部分图片效果还是差强人意。
其实内在含义就是,当数据连续缺失区域不大时,如上图风景照片或者细小的涂鸦笔记,矩阵补全的效果就比较好,但是当数据连续缺失区域较大时,矩阵补全的效果可能就没有那么好,特使是用在如此美丽动人的新垣结衣身上,小小瑕疵就会被放大得更厉害。
下面是具体实现源码:
主要用的算法是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进行图像修复与去除水印相关推荐
- python中花括号_震惊Python的精髓居然是方括号花括号和圆括号
https://m.toutiaocdn.com/i6862197987209118219/?app=news_article×tamp=1597845881&use_new ...
- 图像修复 python_用python进行图像修复与去除水印
有时候我们在看知乎的时候,会突然发现一张很好看的图片,想据为己有,猥猥琐琐的准备长按图片保存,发现图片上居然带了水印,这个时候该怎么办呢?哈哈哈,直接裁剪掉不就好了吗~~~ 但是,作为一个新时代的程序 ...
- python类的属性和对象属性_在python的类中动态添加属性与生成对象
本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...
- python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...
Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...
- 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型
原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...
- python交互式编程入门先学什么_为什么 Python 对于编程入门学习来说,是一门很棒的语言...
在这篇文章里,我会来阐述下为什么我觉得 Python 对于计算机编程入门教学来说是一门很棒的编程语言(对基础编程课程更多观点可以查看这篇文章).这也是从我针对初学者Python 编程教学过程中获得并总 ...
- 手机python编程文件如何转文档_(转)Python之文件读写
原文:https://www.cnblogs.com/huilixieqi/p/6494891.html 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤 ...
- python学生类出不来中文_求教Python中文编码望大神给解答
1.椭圆处定义编码,在pycharm里,有没有什么方便的注释方法或者快捷键,符号太多,写起来不是很方便. 2.长方形里边变量个字符串拼接,就有问题啦,怎么解决. 谢谢! print 后面的括号被认为是 ...
- python程序设计课后答案第三单元_最新Python程序设计课后习题答案-第一单元
精品文档 精品文档习题1 一.选择题 1.Python语言属于().C A.机器语言 B.汇编语言 C.高级语言 D.科学计算语言2.下列选项中,不属于Python特点的是().B A.面向对象 B. ...
最新文章
- 【转载】SQL执行计划
- 《人月神话》(P11)为舍弃而计划
- 数字图像处理基本运算
- C#基础加强(7)之ref与out
- mysql 隔离级别 知乎_TiDB 事务隔离级别
- Debian 9 中设置网络
- Jupyter 常见可视化框架的选择
- python生成一圈数包裹一圈数的数组
- python : os.path 相关操作
- CSS快速入门-基本选择器
- 最近卡脖子的汽车芯片产业链全景图(车规级芯片)
- C++ 对象的内存布局【转】
- 559. N叉树的最大深度
- WinUsbNet: A managed interface to WinUSB.sys
- 等级保护三级测评-----云计算安全扩展要求
- SpringBoot使用Ehcache
- 【服务器】服务器安全防护、防止服务器攻击和保护措施
- 中国研修网计算机培训心得,网络研修培训心得体会
- 《IT时代周刊》:雅虎兵败中国
- 手机qq邮箱html,手机QQ邮箱在哪里找
热门文章
- ffmpeg遇到inttypes.h和UINT64_C
- OSPF中 hello报文的 内容
- PMP-【第3章 项目管理过程】-2021-1-11(61页-87页)
- OpenStack Heat 如何来实现和支持编排
- c 语言字符串转二进制,在C ++中将字符串转换为二进制序列
- Linux脚本自动安装软件,一个快速自动安装Apache及其相关软件的Shell脚本
- l#039;oracle 酒,【金钟庄园副牌干红葡萄酒Carillon de L#039;angelus】价格_年份_评分 - 酒窝网官网...
- cmd指令大全指令_干货 | Linux 超全实用指令大全
- shell date 获取昨天日期
- linux之dup和dup2函数解析