這幾天很痛苦地去學習了下用 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:mfor j = 1:nif t2(i,j) >= 20t2(i,j)= 6;
end
end
end
對 t3 作同樣的處理,然后兩子圖效果如下:
for i = 1:mfor j = 1:nif t3(i,j) >= 20t3(i,j)= 6;
end
end
end
接下來到 t1 了,因為白色文字的灰度值很接近背景顏色,所以需要很小心地找好邊界值:
for i = 1:mfor j = 1:nif t1(i,j) >= 210t1(i,j)= 200;
end
end
end
imshow(t1);
效果如下:(感覺還可以~)
然后就是把處理好的 3 個子圖合並起來:
for i = 1:mfor 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:161I(i+ 489, j + 439, 1:3)=t(i, j, 1:3);
end
end
figure, imshow(I);
最終得出的圖如下:
雖然能看出淡淡的痕跡,但第一次弄這個,感覺就這樣吧 o(* ̄ ▽  ̄*)o
希望高手能指教下~~