图像二值化处理Java

二值化基本概念:通俗的讲就是把一副彩色图像处理成一副黑白图像,一般是作为后续复杂图像处理操作的预处理。

二值化算法思路:遍历图像的所有像素点,计算每个像素点的灰度值。通过迭代法收敛得到一个最佳阈值,灰度值大于最佳阈值的像素点设为白色,灰度值小于最佳阈值的像素点设为黑色。(我这里的二值化处理结果是,背景是白色,前景是黑色)

迭代法获取最佳阈值思路:

1.设最小灰度值为Gmin,最大灰度值为Gmax,阈值初始化为T(0)=(Gmin+Gmax)/2。

2.以阈值T(k)将图像分割为前景和背景,求出整个前景像素的平均灰度值Gf和整个背景像素的平均灰度值Gb,此时阈值T(k)=(Gf+Gb)/2 (k=0,1,2...);

3.若此时T(k)=T(k+1),那么此时收敛,得到最佳阈值。否则回到步骤2,直到阈值收敛到某一个值。

 1 public class Binary {
 2     public static int[] getBinaryImg(int w, int h, int[] inputs) {
 3         int[] gray = new int[w * h];
 4         int[] newpixel = new int[w * h];
 5         for (int index = 0; index < w * h; index++) {
 6             int red = (inputs[index] & 0x00FF0000) >> 16;
 7             int green = (inputs[index] & 0x0000FF00) >> 8;
 8             int blue = inputs[index] & 0x000000FF;
 9             gray[index] = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11);
10         }
11         //求出最大灰度值zmax和最小灰度值zmin
12         int Gmax = gray[0], Gmin = gray[0];
13         for (int index = 0; index < w * h; index++) {
14             if (gray[index] > Gmax) {
15                 Gmax = gray[index];
16             }
17             if (gray[index] < Gmin) {
18                 Gmin = gray[index];
19             }
20         }
21
22         //获取灰度直方图
23         int i, j, t, count1 = 0, count2 = 0, sum1 = 0, sum2 = 0;
24         int bp, fp;
25         int[] histogram = new int[256];
26         for (t = Gmin; t <= Gmax; t++) {
27             for (int index = 0; index < w * h; index++) {
28                 if (gray[index] == t)
29                     histogram[t]++;
30             }
31         }
32
33         /*
34         * 迭代法求出最佳分割阈值
35         * */
36         int T = 0;
37         int newT = (Gmax + Gmin) / 2;//初始阈值
38         while (T != newT)
39         //求出背景和前景的平均灰度值bp和fp
40         {
41             for (i = 0; i < T; i++) {
42                 count1 += histogram[i];//背景像素点的总个数
43                 sum1 += histogram[i] * i;//背景像素点的灰度总值
44             }
45             bp = (count1 == 0) ? 0 : (sum1 / count1);//背景像素点的平均灰度值
46
47             for (j = i; j < histogram.length; j++) {
48                 count2 += histogram[j];//前景像素点的总个数
49                 sum2 += histogram[j] * j;//前景像素点的灰度总值
50             }
51             fp = (count2 == 0) ? 0 : (sum2 / count2);//前景像素点的平均灰度值
52             T = newT;
53             newT = (bp + fp) / 2;
54         }
55         int finestYzt = newT; //最佳阈值
56
57         //二值化
58         for (int index = 0; index < w * h; index++) {
59             if (gray[index] > finestYzt)
60                 newpixel[index] = Color.WHITE;
61             else newpixel[index] = Color.BLACK;
62         }
63         return newpixel;
64     }
65 }
时间: 2024-12-20 22:47:59

图像二值化处理Java的相关文章

图像处理之积分图应用四(基于局部均值的图像二值化算法)

图像处理之积分图应用四(基于局部均值的图像二值化算法) 基本原理 均值法,选择的阈值是局部范围内像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作: pixel = (pixel > (mean - c)) ? object : background 其中默认情况下参数C取值为0.object表示前景像素,background表示背景像素. 实现步骤 1. 彩色图像转灰度图像 2. 获取灰度图像的像素数据,预计算积分图 3. 根据输入的参数

C# 指针操作图像 二值化处理

/// <summary> /// 二值化图像 /// </summary> /// <param name="bmp"></param> /// <returns></returns> private static unsafe Bitmap Binaryzation(Bitmap bmp) { BitmapData dstData = bmp.LockBits(new Rectangle(0, 0, bmp.W

基于直方图的图像二值化算法实现

引言 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.在过去年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在分类方法中,基于直方图的全局二值算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点:简单.算法容易实现和执行速度快. 算法代码 第一种方法Huang L.-K et al.参考代

一种超级快速的图像二值化技术

在计算机视觉中,对图像进行二值化恐怕是最常见的操作了.为了检测目标,可能需要对每一帧图像的每一个像素点进行运算.如果能提升二值化的速度,那么,你的算法的效率就会大大的提高.本文,将介绍一种超级快速的图像二值化技术. 要解决的问题: 如上图所示,需要把彩色图像中, (1) R通道介于(smoevalue1, somevalue2)(2) G通道介于(somevalue3, somevalue4)(3) B通道介于(somevalue5, somevalue6)当图像中某个像素点同时满足上面3个条件

数学之路-python计算实战(8)-机器视觉-图像二值化

二值化 hreshold Applies a fixed-level threshold to each array element. C++: double threshold(InputArray src, OutputArray dst, double thresh, doublemaxval, int type) Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst C: double cvThresh

opencv2对读书笔记——图像二值化——thresholded函数

opencv中的图像二值化函数threshold函数 其结构 double cv::threshold( //二值化函数 const CvArr* src, //原始图像 CvArr* dst, //输出图像 double threshold, //阈值 double max_value, //最大值 int threshold_type//阈值类型 ); 实例代码 #include "cv.h" #include "highgui.h" int main() {

MATLAB:图像二值化、互补图(反运算)(im2bw,imcomplement函数)

图像二值化.反运算过程涉及到im2bw,imcomplement函数,反运算可以这么理解:原本黑的区域变为白的区域,白的区域变为黑的区域. 实现过程如下: close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; J=imread('rice.png');% 读取灰度图像,赋值给J J1=im2bw(J);%将灰度图像转换成二值图像,赋值给J1 J2=imcomplement(J);%求灰度图像的补,即对图像进行求反运算,赋值给J2 J

图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)

OSTU法图像二值化 [算法说明] Ostu法又叫做最大类间方差法,是一种常用的图像分割算法.基本算法思想是根据初始阈值把图像分为两类,然后计算两类之间的方差,更新阈值,重新计算类间方差,当满足类间方差最大时的阈值,即为所求最佳阈值,具体过程如下: 1,初始化一阈值Th,将图像f(x,y)分为A,B两类: 2,分别计算A,B两类像素集合的均值ua和ub,公式如下: 其中,Na和Nb分别表示集合A,B中的像素个数. 3,计算A,B两类的类间方差,公式如下: 4,将Th从0到255循环,分别计算A,

Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化

原文:Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化  [函数名称] 简单统计法图像二值化 WriteableBitmap StatisticalThSegment(WriteableBitmap src) /// <summary> /// Statistical method of image segmention. /// </summary> /// <param name="src">The source im