天天看點

Atitit 圖像處理—圖像形态學(膨脹與腐蝕)

Atitit 圖像處理—圖像形态學(膨脹與腐蝕)

1.1. 膨脹與腐蝕

  說概念可能很難解釋,我們來看圖,首先是原圖:

  膨脹以後會變成這樣:

  腐蝕以後則會變成這樣:

  看起來可能有些莫名其妙,明明是膨脹,為什麼字反而變細了,而明明是腐蝕,為什麼字反而變粗了。

實際上,所謂膨脹應該指:

  較亮色塊膨脹。

而所謂腐蝕應該指:

較亮色塊腐蝕。

1.2. 圖像處理之二值膨脹及應用

基本原理:

膨脹是圖像形态學的兩個基本操作之一,另外一個是腐蝕操作。最典型的應用是在二值圖像

中使用這兩個基本操作,是很多識别技術中重要的中間處理步驟。在灰階圖像中根據門檻值同

樣可以完成膨脹與腐蝕操作。對一幅二值圖像f(x,y)完成膨脹操作,與對圖像的卷積操作類

似,要有個操作數矩陣,最常見的為3X3的矩陣,與卷積操作不同的,是如果矩陣中的像素

點有任意一個點的值是前景色,則設定中心像素點為前景色,否則不變。

形态學運算中腐蝕,膨脹,開運算和閉運算:

1. 腐蝕是一種消除邊界點,使邊界向内部收縮的過程。

可以用來消除小且無意義的物體。

腐蝕的算法:

用3x3的結構元素,掃描圖像的每一個像素

用結構元素與其覆寫的二值圖像做“與”操作

如果都為1,結果圖像的該像素為1。否則為0。

結果:使二值圖像減小一圈

2. 膨脹是将與物體接觸的所有背景點合并到該物體中,使邊界向外部擴張的過程。

可以用來填補物體中的空洞。

膨脹的算法:

如果都為0,結果圖像的該像素為0。否則為1

結果:使二值圖像擴大一圈

3. 先腐蝕後膨脹的過程稱為開運算。

用來消除小物體、在纖細點處分離物體、平滑較大物體的邊界的同時并不明顯改變其面積。

4. 先膨脹後腐蝕的過程稱為閉運算。

用來填充物體内細小空洞、連接配接鄰近物體、平滑其邊界的同時并不明顯改變其面積。

讓我們來看看實際上是怎樣進行膨脹運算的。在圖6.14中,左邊是被處理的圖象X(二值圖象,我們針對的是黑點),中間是結構元素B。膨脹的方法是,拿B的中心點和X上的點及X周圍的點一個一個地對,如果B上有一個點落在X的範圍内,則該點就為黑;右邊是膨脹後的結果。可以看出,它包括X的所有範圍,就象X膨脹了一圈似的。

圖6.13   膨脹的示意圖

圖6.14   膨脹運算

圖6.15為圖6.11膨脹後的結果圖,能夠很明顯的看出膨脹的效果。

粉紅色的方格每次在X/Y前進一個像素方格,就會産生一個新的輸出像素,圖中深藍色的代

表要輸出的像素方格,走完全部的像素方格,就得到了所有輸出像素。

圖中,粉紅色的矩陣表示卷積操作數矩陣,黑色表示源圖像– 每個方格代表一個像素點。

1.3. 測試原理,可以給一個5*5pic,測試膨脹算法

 */

public class ImgGene4test {

public static void main(String[] args) {

BufferedImage dest = new BufferedImage(5,5 ,1);

imgx.setBackgroudColor_White(dest);

dest.setRGB(2, 2, new Color(0,0,0).getRGB());

imgx.save_overwrite(dest, "C:\\00capch\\p5.jpg");

System.out.println("==f");

}

1.4. Photoshop裡面的處理

鍵後有個文字加粗的.不過我想這個應該滿足不了你的要求.你可以先把文字栅格化,然後選擇->修改->擴充選區,再進行填充.直到你想要的效果.建議你先把文字做得比你想要的大一點.再進行此操作,得到你想要效果後再縮小.因為是把選區進行擴充再填充,是以邊邊色起據齒,放大做再縮小這個問題就不會嚴重了.加分加分.

選中文字,在“字元”視窗的左下角,點第一個“T”按鈕,即可變粗,如果還不夠,那就按住ctrl+滑鼠單擊文字圖層=》“選擇”=》修改=》擴充,輸入擴充數字确定=》​​建立​​圖層,填充即可

1.5. 類庫的處理,好像沒找到jhlabs,

1.6. Attilax 源碼

@Override

public BufferedImage filter(BufferedImage src, BufferedImage dest) {

BufferedImage dest2 = imgx.new_BackgroudColor_White(src.getWidth(), src.getHeight());

Matrix mtrx = new Matrix(3, 3).setImg(src);

imgx.trave(src, (x, y) -> {

System.out.println("" + x + ":" + y);

mtrx.fill_and_setMtrx_leftTop_XY(x, y);

boolean mtrx_hasAnyForgeColor = mtrx.hasAnyForgeColor(mtrx_item_color -> {

// dark,,so is forge color.. bkgrd lit..

return (imgx.isDarkColor(imgx.gray(mtrx_item_color)));

});

if (mtrx_hasAnyForgeColor) {

int forgeColor2 = mtrx.getForgeColor();

mtrxCenterXy_inImg = mtrx.getCenterXy();

try {

dest2.setRGB((int) mtrxCenterXy_inImg.get("x"), (int) mtrxCenterXy_inImg.get("y"), forgeColor2);

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("ArrayIndexOutOfBoundsException  x:" + x + ",y:" + y);

return dest2;