專題研究:毛公鼎內刻銘文辨識 ⑤

這一次主要是延續上次的進度

也就是將我們處理過的毛公鼎文字給抓出來

一個一個地放在格子裡

就好像一個毛公鼎銘文字典一樣

=====================這是分隔線唷~☆=====================

那我們廢話不多說

先來看code吧!

bgm1 = L == 0;
figure, imshow(bgm1);

bgm2 = DL ==3;
figure, imshow(bgm2);

這裡主要是把特定的切割區域給抓出來而已

bgm1是之前那種像格子的watershed,而bgm2則是比較貼近字體的那種watershed

stop=0;
[M,N]=size(bgm2);
for i=1:M
    for j=1:N
    if (bgm2(i,j)==1)
    col=i;
	stop=1;
    break;
	end
    end
	if (stop)
	break;
	end
end 

stop=0;
[M,N]=size(bgm2);
for j=1:N
    for i=1:M
    if (bgm2(i,j)==1)
    row=j;
	stop=1;
    break;
	end
    end
	if (stop)
	break;
	end
end 

It1=~bgm2|bw;
It1=It1&bgm2;
  figure,imshow(It1);
se = translate(strel(1), [(-col+1) (-row+1)]);
J = imdilate(It1,se); 

  fc=J(1:100,1:100);
  figure,imshow(fc);

而這裡就是把字給抓出來的判別方法

大致上就是從邊邊開始找

找到要找的字就停下來這樣

做出來的結果大約就像下面幾張圖

第一章就是把像格子watershed的目標區域找出來

然後再將其膨脹填滿,就會從一個格子變成一小塊區域

watershed目標區域

然後把第二種貼近字形的watershed目標找出來

第二種watershed目標區域

然後將兩者疊合

並做重新切割出來的結果就會像下圖,大致上就會像擺在方格子裡的感覺

最後結果

 

====================這也是分隔線唷~☆====================

這次另外做的

就是把上次老師給的東巴文字壁畫拿來試試看同樣的處理

東巴文字壁畫

恩,不過壁畫又不比銘文拓本

上面的還有磚頭紋路等等雜訊,所以干擾程度嚴重得多

不管怎樣,我們還是先來試試看吧

首先當然是將其轉成灰階圖

再來就是二值化

跟銘文拓本不同的地方是

這裡的文字是黑色的,而拓本則是白色的

如果要依照以前的程序處理,就要將其反轉

到了這裡我們就來先開始處理雜訊吧

簡單一點的方式大概就是把pixel太小的物體給刪掉

像是這樣,bw2 = bwareaopen(bw,500);

下面兩張圖分別是去掉小於1000 及500 pixel的物體的圖片

去掉小於1000 pixel的物體的圖片

去掉小於500 pixel的物體的圖片

可以看出來雖然去掉1000的圖片成功地清掉不少雜訊

不過也把部分的字體給去掉了,所以我們還是選擇後者

跟銘文不同的地方在於,其實壁畫的圖案不太需要膨脹

不然跟旁邊那些亂連起來反而變得麻煩

可以直接進行填洞,然後進行watershed

不過出來的結果卻差強人意

我想還是肇因於旁邊的白邊的問題

因為他與不少文字圖案相連在一起

這一部分是磚頭的紋路,一部分是拍攝時的陰影

會讓利用graythresh做level去二值化的im2bw函數

在判斷時產生一整片的黑色區域(反轉後變成白邊)

所以在下面這個語法中的level部分,我們可能要用graythresh以外的方法,或者還需要去做調整

im2bw( Image, [Level] )

 

另外,MATLAB有另外一種二值化的方法

也就是dither函數,他是透過顏色抖動來達到二值化

用出來的結果大概如下

不過因為它是一個pixel一個pixel這樣去二值化

出來的結果有點像點陣圖

所以不論是要去做open或者膨脹都挺麻煩的,牽一髮動全身啊

不若im2bw方便,結論就是還要朝im2bw的level這方面去著手

發表迴響