图像处理------ 二值腐蚀

概述:

腐蚀是图像形态学的两个基本操作之一,另外一个是膨胀(Dilate)。二值图像上的腐蚀是腐蚀最典

型的运用,但是腐蚀操作同样可以运用于灰度图像。二值图像腐蚀操作最基本的效果是腐蚀图像

中前景色区域的边缘。使得前景图像区域变小,前景图像内部的背景区域被放大。

 

基本原理:

腐蚀操作要求有待处理的2D图像F(x,y)以及操作数矩阵(类似卷积操作中的Kernel矩阵),常见的

为3X3的操作数矩阵。二值图像腐蚀操作的数学定义如下:

1.      假设X是二值图像中所有像素欧几里德坐标的集合,K为3X3的操作数矩阵

2.       Kx表示操作数处理X的结果,x表示起始像素点

3.      腐蚀操作K对X的所有像素点操作,Kx是X所有像素点的子集。

一个二值图像腐蚀的例子如下,操作数矩阵为3X3,起始点为中心像素点,前景像素表示为1,背

景像素表示为0.图示如下:

当操作数在像素矩阵上移动时,任何一个在操作数之下的输入像素为背景像素时,则设置中心像素

为背景像素0,否则中心像素[0,0]下的输入像素值不变。

 

三:程序效果

四:源代码

[java] view plaincopy

  1. package com.gloomyfish.morphology;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.image.BufferedImage;  
  5.   
  6. public class ErosionFilter extends BinaryFilter {  
  7.     private Color backgroundColor;  
  8.       
  9.     public ErosionFilter() {  
  10.         backgroundColor = Color.WHITE;  
  11.     }  
  12.       
  13.     public Color getBackColor() {  
  14.         return backgroundColor;  
  15.     }  
  16.   
  17.     public void setBackColor(Color forgeColor) {  
  18.         this.backgroundColor = forgeColor;  
  19.     }  
  20.       
  21.     @Override  
  22.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  23.         int width = src.getWidth();  
  24.         int height = src.getHeight();  
  25.   
  26.         if ( dest == null )  
  27.             dest = createCompatibleDestImage( src, null );  
  28.   
  29.         int[] inPixels = new int[width*height];  
  30.         int[] outPixels = new int[width*height];  
  31.         src = super.filter(src, null); // we need to create new one  
  32.         getRGB( src, 0, 0, width, height, inPixels );  
  33.         int index = 0, index1 = 0, newRow = 0, newCol = 0;  
  34.         int ta1 = 0, tr1 = 0, tg1 = 0, tb1 = 0;  
  35.         for(int row=0; row<height; row++) {  
  36.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  37.             for(int col=0; col<width; col++) {  
  38.                 index = row * width + col;  
  39.                 ta = (inPixels[index] >> 24) & 0xff;  
  40.                 tr = (inPixels[index] >> 16) & 0xff;  
  41.                 tg = (inPixels[index] >> 8) & 0xff;  
  42.                 tb = inPixels[index] & 0xff;  
  43.                 boolean erosion = false;  
  44.                 for(int offsetY=-1; offsetY<=1; offsetY++) {  
  45.                     for(int offsetX=-1; offsetX<=1; offsetX++) {  
  46.                         if(offsetY==0 && offsetX==0) {  
  47.                             continue;  
  48.                         }  
  49.                         newRow = row + offsetY;  
  50.                         newCol = col + offsetX;  
  51.                         if(newRow <0 || newRow >=height) {  
  52.                             newRow = 0;  
  53.                         }  
  54.                         if(newCol < 0 || newCol >=width) {  
  55.                             newCol = 0;  
  56.                         }  
  57.                         index1 = newRow * width + newCol;  
  58.                         ta1 = (inPixels[index1] >> 24) & 0xff;  
  59.                         tr1 = (inPixels[index1] >> 16) & 0xff;  
  60.                         tg1= (inPixels[index1] >> 8) & 0xff;  
  61.                         tb1 = inPixels[index1] & 0xff;  
  62.                         if(tr1 == backgroundColor.getRed() && tg1 == tb1) {  
  63.                             erosion = true;  
  64.                             break;  
  65.                         }  
  66.                     }  
  67.                     if(erosion){  
  68.                         break;  
  69.                     }  
  70.                 }  
  71.                   
  72.                 if(erosion) {  
  73.                     tr = tg = tb = backgroundColor.getRed();  
  74.                 } else {  
  75.                     tr = tg = tb = 255 - backgroundColor.getRed();  
  76.                 }  
  77.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  78.             }  
  79.         }  
  80.         setRGB( dest, 0, 0, width, height, outPixels );  
  81.         return dest;  
  82.     }  
  83.   
  84.   
  85. }  
时间: 2024-08-03 16:20:16

图像处理------ 二值腐蚀的相关文章

图像处理------ 二值膨胀及应用

基本原理: 膨胀是图像形态学的两个基本操作之一,另外一个是腐蚀操作.最典型的应用是在二值图像 中使用这两个基本操作,是很多识别技术中重要的中间处理步骤.在灰度图像中根据阈值同 样可以完成膨胀与腐蚀操作.对一幅二值图像f(x,y)完成膨胀操作,与对图像的卷积操作类 似,要有个操作数矩阵,最常见的为3X3的矩阵,与卷积操作不同的,是如果矩阵中的像素 点有任意一个点的值是前景色,则设置中心像素点为前景色,否则不变.   程序效果:(上为源图,下为膨胀以后效果) 程序原理: 首先把一幅彩色图像转换为灰度

图像处理------常见二值化方法汇总

图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多.越 精准的方法计算量也越大.本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理的需要.主要本文讨论的方法仅针对RGB色彩空间.   方法一: 该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的 将像素值设为0(黑色),值大于等于127的像素值设为255(白色).该方法的好处是计算 量少速度快.缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的 像素分布情况与

图像处理-如何用C语言将一个二值图(只有黑白)转换成一个01数字矩阵?

问题描述 如何用C语言将一个二值图(只有黑白)转换成一个01数字矩阵? 最近做课程设计,关于图像处理的问题,将一个二值图(只有黑白)转换成一个01数字矩阵. 解决方案 http://www.w2bc.com/Article/49290

图像处理------基于Otsu阈值二值化

一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值,然后根据阈值将图像分为前景(白色) 或者背景(黑色).假设有6x6的灰度图像,其像素数据及其对应的直方 图如下图: 阈值寻找方法首先假设是为T=3,则背景像素的比重.均值.方差的计算 结果如下: 根据前景像素直方图,计算比重.均值.方差的过程如下: 上述整个计算步骤与结果是假设阈值T=3时候的结果

图像处理-(C++编程)已经将图像二值化将ROI区拿出来了,怎么样将其对应到原图当中去呢

问题描述 (C++编程)已经将图像二值化将ROI区拿出来了,怎么样将其对应到原图当中去呢 已经将图像二值化将ROI区与背景分离出来了,怎么样将其对应到原图当中去呢,因为接下来我只想对原图当中的ROI区的原始数据做处理,求思路,有代码更好,拜托拜托 解决方案 http://www.linuxidc.com/Linux/2013-01/78173.htm 解决方案二: http://blog.csdn.net/icvpr/article/details/8515596 解决方案三: 读进表格,从表格

图像处理-matlab中怎么检测一幅二值图中的线是直线还是曲线?

问题描述 matlab中怎么检测一幅二值图中的线是直线还是曲线? 一幅二值图中有几条线,怎么判断出它是直线还是曲线? 解决方案 有没有误差范围delta?

c#图像灰度化、灰度反转、二值化

图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些.灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征.图像的灰度

求java对二值图片中的独立块切割,并存成新的独立图片。

问题描述 求java对二值图片中的独立块切割,并存成新的独立图片. 例如:将类似下图中有5个小块块,则存成5个文件.谢谢! 解决方案 或者能得到这几个不规则块的中心坐标也可以,其他的我自己能解决. 解决方案二: 自己找到办法了,用imageJ解决了.

验证码识别原理浅谈--图像二值化

二值化实现方法有 1.1图像灰度化-中值滤波等,同时可以实现背景的去除 1.2图像灰度化-根据灰度值 1.3根据图像色系范围进行二值化处理 图像二值化的意思就是将图像的有效点给分离出来,然后将图片用0和1两个值进行表 示,因为我们没必要知道他们的具体色值,我们的目的就是要知道他们的具体形状,他们 的特征 譬如说淘宝的验证码,和盛大的验 证码, 他们的有效点无非就是U3FM和YPZ7等字符所占据的空间,我们不用管他们是黑色还是红色 ,我们将所有他们所占据的位置都给置为1,其他位置都给置为0 然后我