• 图像处理之常见二值化方法汇总 图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越 精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满 足大多数图像处理...

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

    图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越

    精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满

    足大多数图像处理的需要。主要本文讨论的方法仅针对RGB色彩空间。

     

    方法一:

    该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的

    像素值设为0(黑色),值大于等于127的像素值设为255(白色)。该方法的好处是计算

    量少速度快。缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的

    像素分布情况与像素值特征。可以说该方法是史最弱智的二值处理方法一点也不为过。

     

    方法二:

    最常见的二值处理方法是计算像素的平均值K,扫描图像的每个像素值如像素值大于K

    像素值设为255(白色),值小于等于K像素值设为0(黑色)。该方法相比方法一,阈值的

    选取稍微有点智商,可以解释。但是使用平均值作为二值化阈值同样有个致命的缺点,

    可能导致部分对象像素或者背景像素丢失。二值化结果不能真实反映源图像信息。

     

    方法三:

    使用直方图方法来寻找二值化阈值,直方图是图像的重要特质,直方图方法选择二值

    化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。

    该方法相对前面两种方法而言稍微精准一点点。结果也更让人可以接受。

     

    方法四:http://en.wikipedia.org/wiki/Thresholding_(image_processing)

    使用近似一维Means方法寻找二值化阈值,该方法的大致步骤如下:

    1.      一个初始化阈值T,可以自己设置或者根据随机方法生成。

    2.      根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。(n为

    行,m为列)

    3.      G1的平均值是m1, G2的平均值是m2

    4.      一个新的阈值T’ = (m1 + m2)/2

    5.      回到第二步,用新的阈值继续分像素数据为对象与北京像素数据,继续2~4步,

    直到计算出来的新阈值等于上一次阈值。

    前面三种在以前的博文中都有涉及,最后一种二值化方法的代码如下:

    package com.gloomyfish.filter.study;
    
    import java.awt.image.BufferedImage;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ThresholdBinaryFilter extends GrayFilter {
    
    	@Override
    	public BufferedImage filter(BufferedImage src, BufferedImage dest) {
    		int width = src.getWidth();
            int height = src.getHeight();
    
            if ( dest == null )
            	dest = createCompatibleDestImage( src, null );
    
            int[] inPixels = new int[width*height];
            int[] outPixels = new int[width*height];
            src = super.filter(src, null); // we need to create new one
            getRGB( src, 0, 0, width, height, inPixels );
            int index = 0;
            int means = getThreshold(inPixels, height, width);
            for(int row=0; row<height; row++) {
            	int ta = 0, tr = 0, tg = 0, tb = 0;
            	for(int col=0; col<width; col++) {
            		index = row * width + col;
            		ta = (inPixels[index] >> 24) & 0xff;
                    tr = (inPixels[index] >> 16) & 0xff;
                    tg = (inPixels[index] >> 8) & 0xff;
                    tb = inPixels[index] & 0xff;
                    if(tr > means) {
                    	tr = tg = tb = 255; //white
                    } else {
                    	tr = tg = tb = 0; // black
                    }
                    outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
            	}
            }
            setRGB( dest, 0, 0, width, height, outPixels );
            return dest;
    	}
    
    	private int getThreshold(int[] inPixels, int height, int width) {
    		// maybe this value can reduce the calculation consume; 
    		int inithreshold = 127;
    		int finalthreshold = 0;
    		int temp[] = new int[inPixels.length];
    		for(int index=0; index<inPixels.length; index++) {
    			temp[index] = (inPixels[index] >> 16) & 0xff;
    		}
    		List<Integer> sub1 = new ArrayList<Integer>();
    		List<Integer> sub2 = new ArrayList<Integer>();
    		int means1 = 0, means2 = 0;
    		while(finalthreshold != inithreshold) {
    			finalthreshold = inithreshold;
    			for(int i=0; i<temp.length; i++) {
    				if(temp[i] <= inithreshold) {
    					sub1.add(temp[i]);
    				} else {
    					sub2.add(temp[i]);
    				}
    			}
    			means1 = getMeans(sub1);
    			means2 = getMeans(sub2);
    			sub1.clear();
    			sub2.clear();
    			inithreshold = (means1 + means2) / 2;
    		}
    		long start = System.currentTimeMillis();
    		System.out.println("Final threshold  = " + finalthreshold);
    		long endTime = System.currentTimeMillis() - start;
    		System.out.println("Time consumes : " + endTime);
    		return finalthreshold;
    	}
    
    	private static int getMeans(List<Integer> data) {
    		int result = 0;
    		int size = data.size();
    		for(Integer i : data) {
    			result += i;
    		}
    		return (result/size);
    	}
    
    }
    

    效果如下:


    学习视频教程 - 《数字图像处理-二值图像分析》

    展开全文
  • 在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样...
  • 什么二值化二值化图像分割的一种最简单的方法。二值化可以把灰度图像转换成二值图像。把大于某个临界灰度值(阈值)的像素灰度设灰度极大值(255),把小于这个值的像素灰度设灰度极小值(0),从而实现二值化...
  • 图像处理二值化图像 2017-06-17 15:48:40
    图像二值化就是将图像上的像素点的灰度值设置0或255,也就是将整个图像呈现出明显的黑白效果。...图像的阈值处理图像处理中是很重要的部分,它为图像二值化提供了依据,使图像的像素更加单一、图像更加简单
  • Matlab图像二值化 2017-03-23 21:17:30
    将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,...
  • 我们对灰度图像进行二值化处理,可以突出一定范围的信息,但是对于A和B的不同取值,二值化的效果会有很大的不同。 下面使用OpenCV和C++实现图像二值化过程。 //对一幅图像进行二值化 #incl...
  • Android数字图像处理二值化 下面blabla一段废话心急的同志们可以跳过。  一幅图像包括目标物体,背景还有噪声,怎样从多值的数字图像中取出目标物体,最常用的方法就是设定某一阈值T,用T将图像的数据分成两大...
  • 图像二值化简单来说就是将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像...
  • 图像预处理(二值化 2018-09-02 15:25:16
    图像预处理(二值化) 本文的实验室主要通过opencv与python3实现,相关的代码可以在GitHub中找到。 1. 图像获取与灰度化 通过摄像头获取到的图像为彩色的图像。彩色图像主要分为两种类型,RGB及CMYK。其中RGB的...
  • 二值化阀值 将256个亮度等级的灰度图像通过适当的阀值选取,所有的灰度大于或等于阀值的像素被判定属于特定物体,其灰度值255...获得的二值化图像仍可以反映图像整体和局部特征。在matlab中二值化图像函数i...
  • 图像处理的灰度化和二值化  (2016-12-07 16:17:07) 转载▼ 标签:  图像处理 分类: 人工智能和大数据  在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示...
  • 图像二值化原理和实现 2006-07-07 00:06:00
    即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是...
  • 图像二值化就是将图像上的像素点的灰度值设置0或255,也就是将整个图像呈现出明显的黑白效果的过程。 A=imread(D:\A); thresh=graythresh(A);%确定二值化阈值 B=im2bw(A,thresh);%对图像二值化...
  • 图像二值化二值图像图像中只有两种颜色的信息,通常是黑色和白色,是将普通图像二值化后得到的图像图像二值化的作用是为了方便提取图像中的信 息。二值图像在进行计算机识别时可以增加识别效率。 比如 需要计算...
  • PIL图像处理-二值化 2019-05-02 10:15:35
    时隔很久才知道原来这种对图像处理方式叫做二值化什么二值化呢?就是把一张图的像素点编程0或255,完全的白或黑。 比如这么一张32*32的小图片(当然他已经是黑白的了) 二值化处理之后,每个像素点上就只有两...
  • 在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。 图像通道。在Photoshop中有一个很重要概念叫图像通道,在RGB色彩模式下就是指那单独的红色、绿色...
  •  将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,...
  • openCV中二值化图像的方法 2018-05-17 15:24:31
    在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。 下面我们来介绍两种二值化的方法 1.threshold首先,我们先来学习一个新函数——threshold(中文...
1 2 3 4 5 ... 20
收藏数 174,273
精华内容 69,709