2016-11-08 23:21:34 attilax 阅读数 1167

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

 

1.1. 膨胀与腐蚀1

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

1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5

1.4. Photoshop里面的处理5

1.5. 类库的处理,好像没找到jhlabs,6

1.6. Attilax 源码6

 

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, (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;

}

 

 

图像处理之二值膨胀及应用 - 流浪的鱼 - 博客频道 - CSDN.NET.html

图像处理之二值腐蚀 - 流浪的鱼 - 博客频道 - CSDN.NET.html

图像的膨胀与腐蚀、细化 - 公爵女子 - 博客园.html

java,不依赖于第三方jar的图片处理类 - dragonsoar - ITeye技术网站.html

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 

汉字名:艾提拉(艾龙)   EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

Atiend

 

2019-08-03 15:04:52 weixin_43461608 阅读数 51

图像的形态学处理

  • 图像腐蚀:对于确定的结构元素,通过腐蚀运算可以消除小于结构元素的点。同时,若一个目标区域中含有细小的连接部分,可以通过腐蚀处理对区域进行分割。(imerode)
  • 腐蚀结果一定是原目标图像的一个子集,即原图像的收缩。
  • 图像的膨胀:定义一个结构元素,从图像左上角开始,按顺序移动结构元素的位置,当结构元素位于某坐标上时,且此时结构元素与目标图像存在交集,则保留坐标上的像素点,否则删除此坐标上的像素点。(imdilate)
  • 腐蚀和膨胀的性质:对偶性,单调性,递减性,交换率(仅适用于图像膨胀),结合律,集合运算,平移不变性
  • A目标图像,S结构元素
  • 膨胀:A+S;腐蚀:A-S;开运算:(A-S)+S; 闭运算:(A+S)-S
  • 开运算:先腐蚀后膨胀(图像有损),只有附近有完整像素的才会保留,可用于消噪。(I2= imopen(I,SE))
  • 闭运算:先膨胀后腐蚀(图片有损),对目标图像分开的区域进行连接及对图像中的细小缝隙进行填补。(I2= imclose(I,SE))
  • 开运算和闭运算的性质:
  • 对偶性,扩展性,单调性,平移性,等幂性。
  • 其他运算:
  • 击中/不击中运算:可用于目标识别。(I2 = bwhitmiss(I,S1,S2))(S1:击中的结构元素.S2:不击中的结构元素)
  • 细节处理:在保留源图像几何形状的前提下,尽量减少图像所包含的信息量.获得图像的骨架.
  • 算法描述:
    • 计算当前像素领域内8个方向的可见像素数目,如果少于2个像素,则删除此像素会缩短图像骨架长度;若多于6个元素,则删除会改变图像骨架的几何形状.
    • 计算当前像素周围领域内的区域数目,如果多于1 个,那么删除中心像素会将目标图像分解成不同部分.(I2= bwmorph(I,‘thin’,inf))(inf:无穷大)
2012-08-19 21:19:19 w4515217 阅读数 469

void shousuo(void)//收缩达到腐蚀的效果
{
   int i,j;
   for(i=0;i<=ROW_VALUE;i++)//将二值化数组赋给为二值化的数组以减小内存消耗
     for(j=0;j<=Column_value;j++)
       Buff[i][j]=Image[i][j];
   for(i=1;i<ROW_VALUE-1;i++)/*处理内部元素*/
     for(j=1;j<Column_value-1;j++)
       if(Buff[i][j-1]==0||Buff[i][j+1]==0||Buff[i-1][j]==0||Buff[i+1][j]==0)
          Image[i][j]=0;
   for(i=1;i<ROW_VALUE-1;i++)/*处理边界元素*/
   {
      if(Buff[i-1][0]==0||Buff[i+1][0]==0)
           Image[i][0]=0;
      if(Buff[i-1][Column_value-1]==0||Buff[i+1][Column_value-1]==0)
           Image[i][Column_value-1]=0;
   }
   for(j=0;j<Column_value-1;j++)/*处理边界元素*/
   {
      if(Buff[0][j-1]==0||Buff[0][j+1]==0)
          Image[0][j]=0;
      if(Buff[ROW_VALUE-1][j-1]==0||Buff[ROW_VALUE-1][j+1]==0)
           Image[ROW_VALUE-1][j]=0;
   }
   if(Buff[0][1]==0||Buff[1][0]==0)/*以下几条语句处理四个角的元素*/
      Image[0][0]=0;
   if(Buff[0][Column_value-2]==0||Buff[1][Column_value-1]==0)
      Image[0][Column_value-1]=0;
   if(Buff[ROW_VALUE-2][0]==0||Buff[ROW_VALUE-1][1]==0)
      Image[ROW_VALUE-1][0]=0;
   if(Buff[ROW_VALUE-2][Column_value-1]==0||Buff[ROW_VALUE-1][Column_value-2]==0)
      Image[ROW_VALUE-1][Column_value-1]=0;
}

void pengzhang(void)//达到膨胀效果程序
{
   int i,j;
   for(i=0;i<=ROW_VALUE;i++)//将二值化数组赋给为二值化的数组以减小内存消耗
     for(j=0;j<=Column_value;j++)
       Buff[i][j]=Image[i][j];
   for(i=1;i<ROW_VALUE-1;i++)
     for(j=1;j<Column_value-1;j++)
       if(Buff[i][j-1]==1||Buff[i][j+1]==1||Buff[i-1][j]==1||Buff[i+1][j]==1)
            Image[i][j]=1;
   for(i=1;i<ROW_VALUE-1;i++)
   {
      if(Buff[i-1][0]==1||Buff[i+1][0]==1)
         Image[i][0]=1;
      if(Buff[i-1][Column_value-1]==1||Buff[i+1][Column_value-1]==1)
          Image[i][Column_value-1]=1;
   }
   for(j=0;j<Column_value-1;j++)
   {
      if(Buff[0][j-1]==1||Buff[0][j+1]==1)
          Image[0][j]=1;
      if(Buff[ROW_VALUE-1][j-1]==1||Buff[ROW_VALUE-1][j+1]==1)
          Image[ROW_VALUE-1][j]=1;
   }
   if(Buff[0][1]==1||Buff[1][0]==1)
      Image[0][0]=1;
   if(Buff[0][Column_value-2]==1||Buff[1][Column_value-1]==1)
      Image[0][Column_value-1]=1;
   if(Buff[ROW_VALUE-2][0]==1||Buff[ROW_VALUE-1][1]==1)
      Image[ROW_VALUE-1][0]=1;
   if(Buff[ROW_VALUE-2][Column_value-1]==1||Buff[ROW_VALUE-1][Column_value-2]==1)
      Image[ROW_VALUE-1][Column_value-1]=1;
}
///先膨胀再腐蚀为闭运算,反之为开运算,这个程序效果不错,是做飞思卡尔摄像头的,才做的图像处理,虽然实际小车跑时效果不怎么样当是作为分析还是很有效的

2011-04-18 20:03:00 swustshan 阅读数 409

1、形态学处理

    结构元素:所谓结构元素是指据有某种特定形状的基本结构元素。

    腐蚀:腐蚀是一种消除边界点,使边界向内部收缩的过程。在去除小颗粒噪声以及消除目标物之间的粘连是非常有效的。

    腐蚀的含义是当结构元素S的原点移动到(x,y)位置,如果S完全包含在X中,则在腐蚀后的图像上该点为1,否则为0。

    膨胀:膨胀就是将与目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张的处理。膨胀通常是用以连接间段的线或因二值化处理,使原本应该连在一起的区域被间断的区域重新连接时采用。

    膨胀的含义是当结构元素S的原点移动到(x,y)位置,如果S中包含至少一个像素值为1的点,则在膨胀后图像上该点为1,否则为0。 

    经过腐蚀和膨胀运算后的目标面积会有较大的变化,为了使处理后的目标面积基本保持不变,提出了开运算和闭运算。

    开运算是先腐蚀再膨胀,即:膨胀-膨胀-腐蚀-腐蚀,不是交替执行。

    闭运算是先膨胀再腐蚀,即:腐蚀-腐蚀-膨胀-膨胀,不是交替执行。

    开运算与腐蚀类似,闭运算与膨胀类似,不同之处在于保持面积基本不变。

2、梯度

梯度方向是方向导数取得最大值的方向,梯度的模是方向导数的最大值。方向导数描述的是函数值随距离变化的剧烈程度。梯度方向还是等高线的的法线方向。在图像中梯度方向是边缘的法向量。

2019-09-03 17:06:00 Ibelievesunshine 阅读数 180

膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。通过膨胀,可以填充图像中的小孔及在图像边缘处的小凹陷部分。结构元素B对图像A进行膨胀,记作A  B

腐蚀和膨胀是对偶操作。腐蚀是一种消除边界点,使边界向内部收缩的过程。利用腐蚀操作,可以消除小且无意义的物体。集合A被结构元素B腐蚀,记作A\ThetaB

这里为了简化起见,被膨胀和腐蚀图像我们处理成二值图像:

matlab 中

膨胀函数 IM2 = imdilate(IM,SE)   对图像IM进行膨胀,采用的结构元素为SE,SE为函数strel()得到的结构元素

腐蚀函数 IM2 = imerode(IM,SE)  对图像IM进行腐蚀,其他同上

以膨胀为例代码如下:

close all;clear all;clc;
I = imread('ceshi1.jpg');
I = im2bw(I);
I = ~I;
se1 = strel('square',3);  %方形膨胀元素
se2 = strel('line',5,90);   %线性膨胀元素
%se3 = strel('ball',5,10);   %球形膨胀元素  不能用于二值图像
se4 = strel('disk',11);     %磁盘膨胀元素
se5 = strel('rectangle',[20 30]);  %矩形膨胀元素
A = imdilate(I,se1);
B = imdilate(I,se2);
%C = imdilate(I,se3);
D = imdilate(I,se4);
E = imdilate(I,se5);
figure;
subplot(231);imshow(I);title('origin');
subplot(232);imshow(A);title('square');
subplot(233);imshow(B);title('line');
%subplot(234);imshow(C);title('ball');
subplot(235);imshow(D);title('disk');
subplot(236);imshow(E);title('rectangle');

strel结构元素说明:

 Examples
    --------
        se1 = strel('square',11)      % 11-by-11 square
        se2 = strel('line',10,45)     % line, length 10, angle 45 degrees
        se3 = strel('disk',15)        % disk, radius 15
        se4 = strel('ball',15,5)      % ball, radius 15, height 5

注意:这里球形结构元素不能用于膨胀操作,腐蚀操作类似,只需要修改imdilate函数为imerode函数

程序执行后输出如下:

形态学处理

阅读数 4495

没有更多推荐了,返回首页