利用MATLAB去除图片中的水印

2012年12月24日15:51:14 第一次修改

2011-09-10晚上,开始准备些成人高考数学的试题,上网找了半天,发现都是有水印的,于是心头火起,决定想办法把水印干掉。凭着上学期上过的一点数字图像处理,倒腾了两个小时,实现了去水印。

原始图像截图如下,将此截图命名为r.jpg

r

从上图可见有红色的图案与黑色的“中国教育在线”字样的水印。

 

一、 相关知识简介

需要处理的图像是RGB图像,为M*N*3。灰度图像为M*N。没有颜色分量,若有8位二进制数表示,则从最暗(黑)到最亮(白)一共可以分为256级(0~255)。

二、 解决方案描述

 

从RGB图像中抽取一个彩色分量来,则可以得到一个灰度图像。然后,将该图像中满足一定条件的灰度值全部变成白色即可。如灰度>100的地方全部变成白色,因为最终只要得到黑字白底的图像,所以这么做是可取的。

 

三、 主要步骤与代码描述

3.1 输入图像

使用imread()函数读入一幅带水印的图像,得到描述这个图像的灰度矩阵。

>> r=imread('r.jpg')

得到图像矩阵。

 

3.2 获取图像维度

用size()函数测量该图像的尺寸,这个尺寸在后面的代码中将会用到。

>> size(r)

结果如下图所示

2012-12-24_155817

从上图可见该矩阵有203行,935列,3维(R,G,B三种颜色分量各一维)

 

3.3 编写脚本文件

编写M脚本程序,实现将中间灰度值变为255(白色)的功能。因为要修改每一个矩阵元素的值(即各像素的灰度值),这里会用到之前求得的行列数。

脚本文件与注释如下:

r=imread('r.jpg');     %读入图像
rR=r(:,:,1);            %抽取原图像r的R,G,B的其中一维得到灰度矩阵rR。
                           %得到灰度矩阵还可以用函数“rgb2gray()”完成
rg=rR;                   %为灰度矩阵重新命名
a=170;                  %设置阈值
for i=1:203
   for j=1:935         %搜索每一个矩阵元素,这里用到了前面求得的行列数
     if a<rg(i,j)
        rg(i,j)=255;    %如果颜色不够深就代表是水印,将其变为白色
     end
   end
end
imshow(rg)            %显示去水印后的图像

效果见下图

2012-12-24_154716

3.4 修改

用imshow()显示处理后的图像,并根据结果来调整阈值,使得在去掉水印的基础上,所得图像最清晰。从我的经验来看,原始图片中的水印与字体以及白色背景的亮度相差越大的情况下,去水印效果越好。另外,水印偏什么颜色,就抽取什么颜色分量作为灰度矩阵比较好。如本例中的水印图案有红色,那么我抽取的就是红色分量。

 

3.5 保存去水印后的图像

得到满意的图像后,使用MATLAB的file->print View来设置打印页面,特别注意要选择将页面填充满。因为MATLAB处理后的图像好像不会全尺寸显示,直接打印的话是很小的。设置好后选择打印机为pdfFactroy就将结果保存为PDF格式了。如果直接保存的结果是对的,就不用按上述方法来打印了。

 

参考资料:

【1】数字图像处理(MATLAB版),电子工业出版社,冈萨雷斯,中文版,阮秋琦等译

PS:本例脚本文件点击以下链接下载

https://files.cnblogs.com/pingyidou/qushuiyin.rar

posted @ 2011-11-05 21:53  小手牵纸鸢  阅读(5442)  评论(0编辑  收藏  举报