二维Otsu算法的原理与实现 |
您所在的位置:网站首页 › 直方图有什么优点 › 二维Otsu算法的原理与实现 |
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 |