初试 Matlab 之去除水印
这几天很痛苦地去学习了下用 Matlab 来处理图像,其实那些算法我觉得还不算很难理解,可是 Matlab 这种反人类的语法(可能对于我来说是这样吧,毕竟熟悉了 C++ / Java 的语法一时间很难转过来)折磨了我好久。
前些天在网上看到了一张图片:
想 po 上朋友圈,可又觉得右下角的水印被人看着好像不是很好,于是就想能否利用刚学会的一丁点儿的 Matlab 知识来把水印去掉呢?Show you my low code:
首先,读取图片:
>> I = imread('D:\课程文件\图像处理\image\beizi.jpg');
然后,目测下水印在原图中的大概位置,把它提取出来:
>> t = I(490:544, 440:600, 1:3);
imshow(t) 显示出来看看,是这样子的:
然后分别把 t 的 rgb 3 个分量都提取出来:
>> t1 = t(:, :, 1); >> figure, imshow(t1); >> t2 = t(:, :, 2); >> figure, imshow(t2); >> t3 = t(:, :, 3); >> figure, imshow(t3);
分别是这样的:
因为 t2 和 t3 比较相似,而且黑白分明,直接看下两个矩阵里的内容,发现文字部分确实和黑色部分的灰度值相差很大,所以不管三七二十一,直接暴力砍掉那些白色的部分,也就是文字:
[m,n] = size(t2) for i = 1:m for j = 1:n if t2(i,j) >= 20 t2(i,j) = 6; end end end
对 t3 作同样的处理,然后两子图效果如下:
for i = 1:m for j = 1:n if t3(i,j) >= 20 t3(i,j) = 6; end end end
接下来到 t1 了,因为白色文字的灰度值很接近背景颜色,所以需要很小心地找好边界值:
for i = 1:m for j = 1:n if t1(i,j) >= 210 t1(i,j) = 200; end end end imshow(t1);
效果如下:(感觉还可以~)
然后就是把处理好的 3 个子图合并起来:
for i = 1:m for j = 1:n t(i,j,1) = t1(i,j); t(i,j,2) = t2(i,j); t(i,j,3) = t3(i,j); end end figure, imshow(t);
合并好的图效果如下:(嘻嘻,即将成功的感觉~)
最后,把这个经过处理的原图的一角放回到原图中:
for i = 1:55 for j = 1:161 I(i + 489, j + 439, 1:3)=t(i, j, 1:3); end end figure, imshow(I);
最终得出的图如下:
虽然能看出淡淡的痕迹,但第一次弄这个,感觉就这样吧 o(* ̄ ▽  ̄*)o
希望高手能指教下~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端