2012年12月24日15:51:14 第一次修改
2011-09-10晚上,开始准备些成人高考数学的试题,上网找了半天,发现都是有水印的,于是心头火起,决定想办法把水印干掉。凭着上学期上过的一点数字图像处理,倒腾了两个小时,实现了去水印。
原始图像截图如下,将此截图命名为r.jpg
从上图可见有红色的图案与黑色的“中国教育在线”字样的水印。
一、 相关知识简介
需要处理的图像是RGB图像,为M*N*3。灰度图像为M*N。没有颜色分量,若有8位二进制数表示,则从最暗(黑)到最亮(白)一共可以分为256级(0~255)。
二、 解决方案描述
从RGB图像中抽取一个彩色分量来,则可以得到一个灰度图像。然后,将该图像中满足一定条件的灰度值全部变成白色即可。如灰度>100的地方全部变成白色,因为最终只要得到黑字白底的图像,所以这么做是可取的。
三、 主要步骤与代码描述
3.1 输入图像
使用imread()函数读入一幅带水印的图像,得到描述这个图像的灰度矩阵。
>> r=imread(\'r.jpg\')
得到图像矩阵。
3.2 获取图像维度
用size()函数测量该图像的尺寸,这个尺寸在后面的代码中将会用到。
>> size(r)
结果如下图所示
从上图可见该矩阵有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) %显示去水印后的图像
效果见下图
3.4 修改
用imshow()显示处理后的图像,并根据结果来调整阈值,使得在去掉水印的基础上,所得图像最清晰。从我的经验来看,原始图片中的水印与字体以及白色背景的亮度相差越大的情况下,去水印效果越好。另外,水印偏什么颜色,就抽取什么颜色分量作为灰度矩阵比较好。如本例中的水印图案有红色,那么我抽取的就是红色分量。
3.5 保存去水印后的图像
得到满意的图像后,使用MATLAB的file->print View来设置打印页面,特别注意要选择将页面填充满。因为MATLAB处理后的图像好像不会全尺寸显示,直接打印的话是很小的。设置好后选择打印机为pdfFactroy就将结果保存为PDF格式了。如果直接保存的结果是对的,就不用按上述方法来打印了。
参考资料:
【1】数字图像处理(MATLAB版),电子工业出版社,冈萨雷斯,中文版,阮秋琦等译
PS:本例脚本文件点击以下链接下载