標籤:
這幾天很痛苦地去學習了下用 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 endend
對 t3 作同樣的處理,然後兩子圖效果如下:
for i = 1:m for j = 1:n if t3(i,j) >= 20 t3(i,j) = 6; end endend
接下來到 t1 了,因為白色文字的灰階值很接近背景顏色,所以需要很小心地找好邊界值:
for i = 1:m for j = 1:n if t1(i,j) >= 210 t1(i,j) = 200; end endendimshow(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); endendfigure, imshow(t);
合并好的圖效果如下:(嘻嘻,即將成功的感覺~)
最後,把這個經過處理的原圖的一角放回到原圖中:
for i = 1:55 for j = 1:161 I(i + 489, j + 439, 1:3)=t(i, j, 1:3); endendfigure, imshow(I);
最終得出的圖如下:
雖然能看出淡淡的痕迹,但第一次弄這個,感覺就這樣吧 o(* ̄ ▽  ̄*)o
希望高手能指教下~~
初試 Matlab 之去除浮水印