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

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

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

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

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

矩阵补全(matrix completion)

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

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

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

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

水印去除

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

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

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

好吧,我们换一张风景图片,有一块小水印有水印的图加了遮罩的图复原图

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

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

很愤怒,于是乱画一通发泄乱画之后的新垣结衣

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

结论

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

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

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

下面是具体实现源码:

主要用的算法是LRMC

import numpy as np

def svt(mat, tau):

u, s, v = np.linalg.svd(mat, full_matrices = 0)

vec = s - tau

vec[vec < 0] = 0

return 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] = 1

X = 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 / rho

X[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 plt

lena = 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 time

start = time.time()

rho = 0.005

maxiter = 50

mat_hat, rse_svt = LRMC(sparse_lena[:,:,0], lena[:,:,0], rho, maxiter)

print('Running time:%dseconds.'%(end - start))

start = time.time()

mat_hat1, rse_svt1 = LRMC(sparse_lena[:,:,1], lena[:,:,1], rho, maxiter)

print('Running time:%dseconds.'%(end - start))

start = time.time()

mat_hat2, rse_svt2 = LRMC(sparse_lena[:,:,2], lena[:,:,2], rho, maxiter)

print('Running time:%dseconds.'%(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_用python进行图像修复与去除水印相关推荐

  1. python调整图像大小_使用Python调整图像大小

    作者|Nicholas Ballard 编译|VK 来源|Towards Data Science 可以说,每一个"使用计算机的人"都需要在某个时间点调整图像的大小.MacOS的预 ...

  2. Python自制腾讯视频去除水印Chrome插件

    前景提要 前几期写了一篇关于谷歌插件制作的文章,但是因为没有正经的小实战,一直鸽了这么多期文章,这里写一篇比较受关注的腾讯视频的水印去除的文章,方便各位日后爬取腾讯视频的时候总带其水印爬虫. 学习制作 ...

  3. python 图像卷积_[卷积神经网络(CNN)中的卷积核到底是如何提取图像特征的(python实现图像卷积运算)]...

    1.前言 我们知道,卷积核(也叫滤波器矩阵)在卷积神经网络中具有非常重要的作用.说白了,CNN主要作用在于提取图像的各种特征图(feature maps). CNN主要是通过卷积运算来完成特征提取的. ...

  4. python读取图像的exif信息

    python读取图像的exif信息 python 读取图像的exif信息 import exifread PIL函数实现 python 读取图像的exif信息 前几天用PYQT做了一个工具,打开图片发 ...

  5. 基于微软开源深度学习算法,用 Python 实现图像和视频修复

    ‍‍ 作者 | 李秋键 编辑 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 图像修复是计算机视觉领域的一个重要任务,在数字艺术品修复.公安刑侦面部修复等种种实际场景中被广泛应用.图像 ...

  6. python 去除str的引号 去除括号_用python进行图像修复与去除水印

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

  7. 数字图像处理与Python实现-图像信号处理-图像坏点修复

    图像坏点修复 文章目录 图像坏点修复 1.图像坏点介绍 2.图像坏点修复方法 3.图像坏点修复算法实现 3.1 均值滤波修复 3.2 基于梯度滤波修复 1.图像坏点介绍 **Misbehaving p ...

  8. pil对图像加透明 python_关于python:如何使用PIL将透明png图像与另一个图像合并...

    我有一个透明的png图像"foo.png" 我打开了另一张图片 im = Image.open("foo2.png"); 现在我需要的是将foo.png与foo ...

  9. 基于PaddleGAN项目人脸表情动作迁移学习(五)图像补帧上色与超分修复

    学习目标 体验基于PaddleGAN的图像上色.补针.超分等功能,涉及模型包括DAIN.DeOldify.RealSR.DeepRemaster.EDVR.PPMSVSR等. 一.算法原理 1.补帧模 ...

最新文章

  1. seq2seq 序列中的<EOS>是什么意思?
  2. Java 正则表达式源码解析
  3. 长方形纸做容积最大的长方体_儿童手工折纸,童年玩具纸扇子怎么折?一起来回忆下经典折法吧...
  4. linux usb驱动
  5. face_recognition快速入门
  6. 使用OpenCV,Keras和Tensorflow构建Covid19掩模检测器
  7. 一年发表603篇论文、研究被引近3.9万次,学者操纵引文遭质疑
  8. 无法建立跟远程计算机的连接,彻底解决win8、win10系统宽带拨号出现“错误720:不能建立到远程计算机的连接”的问题-网络教程与技术 -亦是美网络...
  9. 10款Flash和Javascript网页音乐播放器
  10. python 运行cmd命令失败怎么办_python manage.py runserver命令在cmd命令框中可以正确执行,但是在pycharm的终端中运行就失败了!...
  11. 深入理解控制反转(IoC)和依赖注入(DI)
  12. 孙鑫-MFC笔记四--文本编程
  13. 【U8+】去掉填制凭证界面金额中的网格
  14. 缺项级数的收敛域求解
  15. java本学期期末学员,本学期期末学员共参加了3门课的考试,即Java,C,SQL,编写方法计算每位学员3门课的平均分,...
  16. mac简体拼音打出来是英文_为什么word打不出拼音 mac的word打字出拼音
  17. Unbuntu下U盘突然权限只读,无法重命名和复制粘贴文件的问题修复
  18. android陀螺仪惯导手机gps,推荐基于陀螺仪惯性导航的智能停车定位导航解决方案...
  19. pta6-1 快速排序
  20. 转行学什么就业前景好

热门文章

  1. 小程序流量主怎么赚钱?小程序流量主怎么变现?
  2. 【数据结构篇03】栈和队列
  3. 三维点云处理06-2D/3DIoU计算
  4. 平面直角系【坐标系旋转】、【点绕坐标系旋转】、【A点绕B点旋转】
  5. 【MySQL】COALESCE( )函数
  6. Python设置Latex公式中显示数学字体STIX
  7. UE 5.1正式发布,有哪些值得一试的新功能?
  8. HDU - 2859 Phalanx (DP)
  9. TXS0102使用说明
  10. 在centos8环境下用asterisk18配置pjsip和webrtc音视频通话教程(一)