本来想写一些关于walsh 算法的,但是现在还没有完全搞懂只好延后了,先写写简单的。
一、二值化的定义
从维基百科拿过来的定义:
二值化是图像分割的一种方法。在二值化图象的时候把大于某个临界灰度值的像素灰度设为灰度极大值,把小于这个值的像素灰度设为灰度极小值,从而实现二值化。
根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。
二、 二值化的算法
这里就简单讲一下固定
阈值的算法:
![dst(x,y) = \fork{\texttt{maxValue}}{if $src(x,y) > T(x,y)$}{0}{otherwise}](http://docs.opencv.org/_images/math/1386a2a947bb938eb3f43d01974e600036f120e7.png)
拿最简单的灰度图来说如果大于给定值,则设置为255,如果小于则设置为0
对于自适应阈值的意思,应该是统计出图像中直方图的分布情况,然后取分布比较多的值当做阈值。
三代码
void binImage(Mat input ,Mat &out, int threshold)
{
// accept only char type matrices
CV_Assert(input.depth() != sizeof(uchar));
out.create(input.cols,input.rows,CV_8UC1);
int nRows = input.rows;
int nCols = input.cols;
if (input.isContinuous() && out.isContinuous())
{
nCols *= nRows;
nRows = 1;
}
int i,j;
uchar* p;
uchar* q;
for( i = 0; i < nRows; ++i)
{
p = input.ptr<uchar>(i);
q = out.ptr<uchar>(i);
for ( j = 0; j < nCols; ++j)
{
if( p[j]> threshold)
q[j] = 255;
else
q[j] = 0;
}
}
}
四 效率和效果
效率上面比原始图片还是要差一点的。
![](https://img-my.csdn.net/uploads/201304/09/1365516975_9474.png)
效果上都一致。
原始 | 本文 |
![]() | ![]() |