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

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

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


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


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


足大多数图像处理的需要。主要本文讨论的方法仅针对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);
  }
 
}

效果如下:

1350305151_4620.png

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

相关文章
什么是阻抗匹配?如何在设计中使用阻抗匹配变压器
如果你是一名 RF 设计工程师或任何使用过无线电的人,那么“阻抗匹配”一词应该不止一次让你印象深刻。该术语至关重要,因为它直接影响传输功率,从而影响我们无线电模块的范围。本文旨在帮助您从基础了解什么是阻抗匹配,并帮助您使用最常用的阻抗匹配变压器设计自己的阻抗匹配电路。所以,一起来了解下吧。
7004 1
什么是阻抗匹配?如何在设计中使用阻抗匹配变压器
|
并行计算 PyTorch 算法框架/工具
anaconda+pytorch+opencv安装及环境配置
anaconda+pytorch+opencv安装及环境配置
1452 0
|
算法 计算机视觉
OpenCV(四十):图像分割—漫水填充
OpenCV(四十):图像分割—漫水填充
809 0
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
4689 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
10月前
|
人工智能 监控 算法
人群计数、行人检测数据集(9000张图片已划分、已标注) | AI训练适用于目标检测任务
本数据集包含9000张已标注、已划分的行人图像,适用于人群计数与目标检测任务。支持YOLO等主流框架,涵盖街道、商场等多种场景,标注精准,结构清晰,助力AI开发者快速训练高精度模型,应用于智慧安防、人流统计等场景。
人群计数、行人检测数据集(9000张图片已划分、已标注) | AI训练适用于目标检测任务
|
7月前
|
编解码 监控 算法
基于 YOLOv8 的二维码智能检测系统 [目标检测完整源码]
本项目基于YOLOv8构建二维码智能检测系统,专为复杂场景(倾斜、遮挡、反光、小目标等)设计。含完整数据集、训练代码、预训练模型及PyQt5图形界面,支持图片/视频/摄像头实时检测,开箱即用,兼具高精度与工程落地性。
390 0
基于 YOLOv8 的二维码智能检测系统 [目标检测完整源码]
|
11月前
|
安全 网络协议 NoSQL
Web渗透-常见的端口及对其的攻击思路
本文介绍了常见网络服务端口及其安全风险,涵盖FTP、SSH、Telnet、SMTP、DNS、HTTP、SMB、数据库及远程桌面等20余个端口,涉及弱口令爆破、信息泄露、未授权访问、缓冲区溢出等典型漏洞,适用于网络安全学习与渗透测试参考。
1969 59
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
3996 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
机器学习/深度学习 数据可视化 机器人
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
1580 17
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
|
机器学习/深度学习 数据采集 数据可视化
基于YOLOv8的PCB缺陷检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8实现PCB缺陷检测,提供一站式解决方案。包含完整训练代码、标注数据集、预训练权重及PyQt5图形界面,支持图片、文件夹、视频和摄像头四种检测模式。项目开箱即用,适合科研、工业与毕业设计。核心功能涵盖模型训练、推理部署、结果保存等,检测类型包括缺孔、鼠咬缺口、开路、短路、飞线和杂铜。项目具备高性能检测、友好界面、灵活扩展及多输入源支持等优势,未来可优化模型轻量化、多尺度检测及报告生成等功能。
基于YOLOv8的PCB缺陷检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!