Atitit 图像处理—图像形态学(膨胀与腐蚀)

 

 

1.1. 膨胀与腐蚀

  说概念可能很难解释,我们来看图,首先是原图:

  膨胀以后会变成这样:

  腐蚀以后则会变成这样:

  看起来可能有些莫名其妙,明明是膨胀,为什么字反而变细了,而明明是腐蚀,为什么字反而变粗了。

实际上,所谓膨胀应该指

  较亮色块膨胀。

而所谓腐蚀应该指

较亮色块腐蚀。

 

1.2. 图像处理之二值膨胀及应用

基本原理:

膨胀是图像形态学的两个基本操作之一,另外一个是腐蚀操作。最典型的应用是在二值图像

中使用这两个基本操作,是很多识别技术中重要的中间处理步骤。在灰度图像中根据阈值同

样可以完成膨胀与腐蚀操作。对一幅二值图像f(x,y)完成膨胀操作,与对图像的卷积操作类

似,要有个操作数矩阵,最常见的为3X3的矩阵,与卷积操作不同的,是如果矩阵中的像素

点有任意一个点的值是前景色,则设置中心像素点为前景色,否则不变。

 

形态学运算中腐蚀,膨胀,开运算和闭运算:

1. 腐蚀是一种消除边界点,使边界向内部收缩的过程。


可以用来消除小且无意义的物体。

腐蚀的算法:

用3x3的结构元素,扫描图像的每一个像素

用结构元素与其覆盖的二值图像做“与”操作

如果都为1,结果图像的该像素为1。否则为0。

结果:使二值图像减小一圈


2. 膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。


可以用来填补物体中的空洞。

膨胀的算法:

用3x3的结构元素,扫描图像的每一个像素

用结构元素与其覆盖的二值图像做“与”操作

如果都为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, (xy) -> {

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;

}