二维Otsu算法的原理与实现

您所在的位置:网站首页 直方图有什么优点 二维Otsu算法的原理与实现

二维Otsu算法的原理与实现

2024-04-10 12:13| 来源: 网络整理| 查看: 265

1.简介:

       一维Otsu算法有计算简洁、稳定、自适应强等优点,被广泛用于图像分割中。但一维Otsu算法没有考虑图像像素点之间的关系,当图像中有噪声时,会导致分割的效果不理想。因此,刘健庄等人在1993年提出了二维的Otsu算法,提升了算法的抗噪声能力。

2.算法思想:

       同时考虑像素的灰度值分布和它们邻域像素的平均灰度值分布,因此形成的阈值是一个二维矢量,最佳的阈值在一个二维的测度准则下确定最大值时得到。

3.算法过程:

(1)设图像I(x,y),的灰度级为L级,那么图像的邻域平均灰度也分为L级。(2)设f(x,y)为像素点(x,y)的灰度值,g(x,y)为像素点(x,y)为中心的K*K的像        素点集合的灰度平均值。令f(x,y)=i,g(x,y)=j,然后就形成了一个二元组(i,j)。(3)设二元组(i,j)出现的次数为fij,然后求出二元组对应的概率密度Pij,        Pij=fij/N, i,j=1,2,…,L,其中N为图像像素点总数。(4)任意选取一个阈值向量(s,t)选取的阈值向量将图像的二维直方图划分成4个        区域,B、C区域代表图像的前景和背景,A、D区域代表噪声点。

(5)设C、B两个区域对应的概率分别为w1,w2,对应的均值矢量为u1,u2。整个图        片所对应的均值矢量为uT。

4.代码实现(opencv3):

    

#include "opencv.hpp" #include "imgproc.hpp" #include "highgui.hpp" #include "iostream" #include "core.hpp" using namespace cv; using namespace std; int Otsu2D(Mat srcimage); //二维Otsu算法 int main() { Mat srcimage, grayimage, dstimage; srcimage = imread("lena.jpg"); namedWindow("原图", 0); imshow("原图", srcimage); //显示原图 cvtColor(srcimage, grayimage, COLOR_RGB2GRAY); //得到灰度图 double time0 = static_cast(getTickCount()); //记录程序开始时间 int thresholdValue = Otsu2D(grayimage); //调用二维Otsu函数 time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3