上節MATLAB R2021a 影像處理之旅 — 2我們談到影像中的噪聲會影響二值化影像的規律性,針對這類問題,我們通常會采用預處理和后處理的方式來解決,接下來我們來看看影像處理中預處理和后處理相關的操作,
4 影像預處理與后處理
4.1 影像預處理-降噪
//載入并顯示圖片,可以看出原圖經二值化后,受噪聲的影響很大
I = imread("IMG_007.jpg");
gs = im2gray(I);
gs = imadjust(gs);
BW = imbinarize(gs,"adaptive","ForegroundPolarity","dark");
imshowpair(gs,BW,"montage")
H = fspecial("average",3); //創建一個3x3的均值濾波器,fspecial通常被用來創建濾波片
gssmooth = imfilter(gs,H); //將均值濾波器H應用到影像gs
BWsmooth = imbinarize(gssmooth,"adaptive","ForegroundPolarity","dark");
imshow(BWsmooth);
//直接采用均值濾波,會導致影像邊緣出現黑框,我們可以使用replicate選項填充邊緣像素來消除黑邊
gssmooth = imfilter(gs,H,"replicate"); //使用重復選項填充邊緣像素
BWsmooth = imbinarize(gssmooth,"adaptive","ForegroundPolarity","dark");
imshow(BWsmooth);
//可以看到此時圖片邊緣的黑邊被消除了
4.2 影像預處理-背景去除
使用二值化的方法提取影像中的文字時,經常會被背景圖干擾,可以用形態學的方法去除背景,
膨脹和腐蝕是影像形態學的兩種處理方式,膨脹是選用形態結構中的最大值,腐蝕則是選用形態結構中最小值;MATLAB中使用strel函式創建形態學結構,膨脹和腐蝕也可以結合起來使用,先腐蝕后膨脹被稱為開運算,先膨脹后腐蝕被稱為閉運算,
開運算通常被解釋為“移除小的物體”,有時只看這個解釋會感覺不太容易理解,實際上,這種說法是建立在影像背景色為暗色,前景色為亮色的基礎上,這一點在MATLAB的imbinarize函式中也有體現,
對開運算更一般的解釋是:開運算能夠連接暗區,去除影像中小的亮區,但對大的亮區則沒有影響,同樣的,對閉運算的解釋是:閉運算能夠連接亮區,去除影像中小的暗區,但對大的暗區則沒有影響,另外一點也值得大家注意,經過開閉運算處理后的影像,其陰影部分通常會呈現出與所用的結構相似的形狀,
用一張圖對比來看,開運算(先腐蝕后膨脹)的效果如下:

閉運算(先膨脹后腐蝕)的效果如下:

//載入并顯示圖片,可以看出二值化影像受背景影響很大
I = imread("IMG_001.jpg");
gs = im2gray(I);
gs = imadjust(gs);
H = fspecial("average",3);
gs = imfilter(gs,H,"replicate");
BW = imbinarize(gs,"adaptive","ForegroundPolarity","dark");
imshowpair(gs,BW,"montage");
//為了得到背景,我們先創建一個盤型結構,strel用來創建平面形態學結構元素,進行閉運算
SE = strel("disk",8); //創建盤型結構,注意結構尺寸要大于文字,才能抹去文字,得到背景圖
Ibg = imclose(gs,SE); //進行閉運算
imshow(Ibg); //顯示背景圖
gsSub = Ibg - gs; //使用原圖減去背景圖
imshow(gsSub);
BWsub = ~(imbinarize(gsSub)); //二值化減去背景圖的影像,并對結果取反,即為需要的文字資訊的二值化結果
imshow(BWsub);
上述操作:先對影像進行閉操作,再用原圖減去閉操作處理的結果,便會得到影像中小塊的亮區紋理,在影像處理中經常被用到,這個操作通常被稱為"底帽轉換(bottom-hat transform)",大家也可以直接使用MATLAB中的imbothat函式來進行上述操作,
4.3 影像后處理-二值形態學
//載入圖片并顯示
I = imread("IMG_002.jpg");
gs = im2gray(I);
gs = imadjust(gs);
H = fspecial("average",3);
gs = imfilter(gs,H,"replicate");
SEdisk = strel("disk",8);
Ibg = imclose(gs,SEdisk);
gsSub = Ibg - gs;
BW = ~imbinarize(gsSub);
imshowpair(I,BW,"montage");
//使用形態結構單元處理二值影像
SE = strel("rectangle",[3 25]);
BWstripes = imopen(BW,SE);
imshow(BWstripes);
S = sum(BWstripes,2);
plot(S);
Sbw = sum(BW,2);
hold on;
plot(Sbw);
hold off;

上圖可以看出亮色的紋理也被檢測到了,

使用形態結構處理二值影像,通過開運算將文字連成一體,有利于加強按行求和的數值顯著化,

對比可見,經過對二值影像的形態學處理,有文字的行和曲線(藍色)與無文字的行和曲線(橙色)差異更明顯了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291589.html
標籤:其他
