灰度直方图
通过灰度直方图看到图像的照明效果
灰度阈值分割
假设:图像中的目标区和背景区之间或者不同目标区之间,存在不同的灰度或平均灰度
凡是灰度值包含于z的像素都变成某一灰度值,其他的变成另一个灰度值,则该图像就以z为界被分成两个区域
如果=1和0,分割后的图像为二值图像
确定最佳阈值,使背景和目标之间的差异最大
大津(Otsu)算法
确定最佳阈值,使背景和目标之间的类间方差最大(因为二者差异最大)
算法实现:遍历灰度取值
原始米粒图像
使用Otsu算法进行阈值化结果
区域生长法分割
从种子点开始,按照一定的准则(如相邻像素灰度相似性)向周围扩散,将领域相似像素加入区域中
区域生长实现步骤:
1、对图像顺序扫描,找到第一个还没有归属的像素,设该像素为(x0,y0);
2、以(x0,y0)为中心,考虑(x0,y0)的8领域像素(x,y),如果(x,y)满足生长准则,将(x,y)与(x0,y0)合并,同时将(x,y)压入堆栈;
3、从堆栈中取出一个像素,把它当做(x0,y0)返回到步骤2;
4、当堆栈为空时,返回步骤1;
5、重复步骤1 - 4直到图像中的每个点都有归属时,生长结束。
相关函数
计算灰度直方图
CV_EXPORTS void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,
SparseMat& hist, int dims,
const int* histSize, const float** ranges,
bool uniform = true, bool accumulate = false );
大津算法计算阈值
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
漫水填充(区域生长发)
CV_EXPORTS int floodFill( InputOutputArray image,
Point seedPoint, Scalar newVal, CV_OUT Rect* rect = 0,
Scalar loDiff = Scalar(), Scalar upDiff = Scalar(),
int flags = 4 );