图像灰度化、二值化理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像灰度化、二值化理解相关的知识,希望对你有一定的参考价值。

参考技术A 图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

  将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。

  所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域

一下程序可以实现图像的二值化:

/**************************************

*

* 函数名:

* cvBinaryEx

* 参 数:

* imgSrc - 进行锐化的图像

* 返回值:

* 成功锐化返回TRUE,否则返回false;

* 说 明:

*

* 对图进行二值化

*

************************************/

bool cvBinaryEx(IplImage *imgSrc)



    IplImage* img = cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,imgSrc->nChannels);

    CvScalar s;

    int sum=0;

    for (int i=0; i < imgSrc->height; i++)

   

        for (int j=0; j < imgSrc->width; j++)

       

            s =  cvGet2D(imgSrc,i,j);

            sum = (s.val[0]+s.val[1]+s.val[2])/3;

            if (sum > 128)

           

                s.val[0]=s.val[1]=s.val[2]=255;

                cvSet2D(imgSrc,i,j,s);

           

            else

           

                s.val[0]=s.val[1]=s.val[2]=0;

                cvSet2D(imgSrc,i,j,s);







return true;



灰度图grayscale

灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的。要表示灰度图,就需要把亮度值进行量化

使用灰度图的好处:

①    RGB的值都一样。

②    图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。

③    因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。

所以,做图像处理时都采用灰度图。

将一幅RGB格式的图像转化为灰度图:

IplImage *src= cvLoadImage("C:\\home.bmp", -1);

IplImage *dest ;

cvCvtColor(Src, dest, CV_RGB2GRAY);

然后将灰度图dest转化为二值化图像(保存在src中),可以直接使用cvThreshold函数:

cvThreshold(dest, src, 1, 255, CV_THRESH_BINARY);

一般先将图像灰度化,然后再二值化,然后在进行边缘处理等操作。。。

灰度化-->二值化--->边缘提取>>>

https://blog.csdn.net/fu6543210/article/details/79926873

图像二值化处理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 }

 

以上是关于图像灰度化、二值化理解的主要内容,如果未能解决你的问题,请参考以下文章

为啥用二值化处理图像之后,还会有其他的灰度值,尤其是在一些边缘的位置。比如opencv里的cvThreshold

二值化处理与边缘检测

图像的自适应二值化

解释一下啥是二值化?

图像二值化处理Java

图像识别入门5 二值化处理