2017-03-20 22:01:09 lz0499 阅读数 17227

1.频率和概率

    直方图每个矩形框的数值描述的是图像中相应灰度值的频率。因此,可以说直方图是一种离散的频率分布。给定一个大小为M*N的图像I,直方图中所有矩形框所代表的数值之和,即为图像中的像素数量,即:

    相对应的归一化直方图表示为:

   0<=i<K 通常被解释为一个随机过程的概率分布或概率密度函数,表示的是图像中像素灰度值为i所出现的概率。i的累积概率值为1,即概率分布p必须满足以下关系:

    与累积概率所所对应的累积直方图H是一个离散的分布函数P(),(通常也称为累积分布函数或cdf):

2.最大熵阈值分割

    熵是信息理论中一个重要的概念,这种方法常用于数据压缩领域。熵是一种统计测量方法,用以确定随机数据源中所包含的信息数量。例如,包含有N个像素的图像I,可以解释为包含有N个符号的信息,每一个符号的值都独立获取于有限范围K(e.g.,256)中的不同灰度值。

   将数字图像建模为一种随机信号处理,意味着必须知道图像灰度中每一个灰度g所发生的概率,即:

  因为所有概率应该事先知道,所以这些概率也称为先验概率。对于K个不同灰度值g=0,…,K-1的概率向量可以表示为:

 上述概率向量也称为概率分布或称为概率密度函数(pdf)。实际数字图像处理应用当中,先验的概率通常是不知道的,但是这些概率可以通过在一幅图像或多幅图像中观察对应灰度值所发生的频率,从而估算出其概率。图像概率密度函数p(g)可以通过归一化其对应的直方图获得其概率,即:

3.最大熵

    数字图像中给定一个估算的概率密度函数p(g),数字图像中的熵定义为:

4.用图像熵进行图像分割

    利用图像熵为准则进行图像分割有一定历史了,学者们提出了许多以图像熵为基础进行图像分割的方法。我们介绍一种由Kapuret al提出来,现在仍然使用较广的一种图像熵分割方法。

给定一个特定的阈值q(0<=q<K-1),对于该阈值所分割的两个图像区域C0,C1,其估算的概率密度函数可表示为:


 同样的,背景熵可以改写为:





5.代码实现及结果

int MakeTable(double *S1,double *S2,double *NormalizeHist,int HistSize)
{	int i;

	double s0 = 0,s1;
	for (i=0;i < HistSize;i++)
	{
		if (NormalizeHist[i]>0)
		{
			 s0 = s0+NormalizeHist[i]*log(NormalizeHist[i]);
		}
		S1[i] = s0;
	}

	s1 = 0;
	for (i = HistSize-1;i >= 0;i--)
	{
		S2[i] = s1;
		if (NormalizeHist[i]>0)
		{
			s1 = s1+NormalizeHist[i]*log(NormalizeHist[i]);
		}
	}
	return 0;
}

int Get_Max_Entropy_Threshold(T_U32 *Hist,DWORD width,DWORD height)
{
	int i,q,HistSize = 256,qMax = -1;
	double NormalizeHist[256] = {0},H01 = 0,H0 = 0,H1 = 0,P1 = 0,P0 = 0, Hmax = -9999 ;
	double S1[256] = {0},S2[256] = {0};

	for (i = 0;i < HistSize;i++)
		NormalizeHist[i] = Hist[i]/(double)(width*height);

	MakeTable(S1,S2,NormalizeHist,HistSize);

	for (q = 0; q < HistSize-1;q++)
	{
		P0 += NormalizeHist[q];
		P1 = 1 - P0;

		if(P0 > 0)
			H0 = -(1*S1[q])/P0+log(P0);
		else
			P0 = 0;

		if(P1 > 0)
			H1 = -(1*S2[q])/P1+log(P1);
		else
			H1 = 0;

		H01 = H0+H1;

		if (H01 > Hmax)
		{
			Hmax = H01;
			qMax = q;
		}

	}
	return qMax;
}
int Max_Entropy_Threshold(IMAGE_TYPE *BMP8_img)
{
	DWORD width,height,i,j,bfsize;
	WORD  biBitCount;
	T_U8 *dst,*bmp,k;
	T_U32 line_byte,Threshold,index,Hist[256] = {0};
	
	BITMAPFILEHEADER bf;
	BITMAPINFOHEADER bi;
	
	FILE *Max_Entropy_ThresholdBMP_fp = fopen("Max_Entropy_Threshold.bmp","wb");
	
	if(NULL == Max_Entropy_ThresholdBMP_fp)
	{
		printf("Can't open IsoData_Threshold.bmp\n");
		return -1;
	}
	bmp = BMP8_img;
	memset(&bf, 0, sizeof(bf));
	memset(&bi, 0, sizeof(bi));
	memcpy(&bf,bmp,14);
	memcpy(&bi,&bmp[14],40);
	
	height = bi.biHeight;
	width  = bi.biWidth;
	bfsize = bf.bfSize;
	biBitCount = bi.biBitCount;
	line_byte = (width * 8 / 8 + 3) / 4 * 4; 
	dst = BMP8_img+54+1024;

	for (i = 0; i < height;i++)
	{
		for (j = 0;j < width;j++)
		{
			Hist[dst[i*line_byte+j]]++;
		}
	}
	

	dst = BMP8_img+54+1024;
	Threshold = Get_Max_Entropy_Threshold(Hist,width,height);
	for(i = 0;i < height;i++)
	{
		for(j = 0;j < width;j++)
		{

			index = i*line_byte+j;
			k = dst[index];
			
			if(k >= Threshold)
				dst[index] = 255;
			else
				dst[index] = 0;
			
		}
	}
	
	fwrite(BMP8_img,bfsize,1,Max_Entropy_ThresholdBMP_fp);
	fclose(Max_Entropy_ThresholdBMP_fp);
	Max_Entropy_ThresholdBMP_fp = NULL;
	
	return 0;

}

结果:










2014-04-01 23:13:44 xw20084898 阅读数 9911

二维最大熵原理

  近期在做图像处理灰阶分割的研究,发现网上有很多将一维最大熵阈值分割的文章与程序代码,但是二维最大熵的资源相对较小。故本博客的目的就在于此,在学习的过程中记录相关笔记,以便帮助后面的研究者少走些弯路。希望与大家一起进步,共同提高。

1、 基于二维最大熵阈值分割

阈值化是图像分割中一种重要的技术。现有大多数方法都通过图像的一维灰度直方图选择阈值。但是, 当图像的信噪比递减时, 采用这些方法将产生很多的分割错误。近年来, 出现了一些方法开始利用图像的二 维 灰 度 直 方 图———像 素 的 灰 度 值分布及其邻域的平均灰度值分布所构成的直方图 来 进 行 阈 值分割。这些方法由于利用了图像的灰度信息和邻域的空间相关信息, 其效果较传统方法有明显改善

1.1  二维直方图

通常, 图像可看作一个二维灰度函数, 其中包含 N×N 个象素点, G={0, 2, ⋯, L- 1}为灰度取值范围, 这里 L=256。定义位于
坐标( x, y) 象素的灰度值为 f( x, y) 。设 T∈G 为一分割阈值, 则对 图 像 函 数 f( x, y) 以 灰 度 值 T 阈 值 化 的 结 果 即 为 二 值 函 数fT( x, y) :
fT( x, y) =
b0 f( x, y) ≤T
b1 f( x, y) > # T
( 1)
其中: 0≤b0, T, b1≤L- 1。二维阈值化方法同时考虑象素的灰度值 及 其 邻 域 平 均 灰度值。象素( x, y) 处的 n×n 邻域平均灰度值为:
 
其中: n≤N, n 一般取奇数, [n2]表示取整, 本文取 n=3。通过对原图进行邻域平均得到另一“平滑图像”, 由原图像和平滑图像构造出一个二维直方图。因为图像像素与其邻域像素的相关性是相当大的, 所以物体和背景的分布在二维直方图中就会比在一维直方图中更容易区分。一般地, 二维直方图呈双峰或多峰特性。如以灰度、邻域平均灰度值对[f( x, y) , g( x, y) ]来表示图像,并以二维矢量( S, T) 来分割图像, 这里, 0≤S, T≤L- 1。则二维阈值化函数可定义为
则{pij}就是图像的二维灰度直方图, 如图所示。其起始点在左上方, 灰度值从左至右增加, 邻域平均灰度值自上 而 下
增加。二维直方图上共有 L2个点, 每一点的函数值即为 rij。若图像的分割阈值矢量为( S, T) , 则直方图被分成 4 块, 根据同态
性, 在目标和背景处, 象素的灰度值和邻域平均灰度值接近, 在目标和背景的分界邻域, 象素的灰度值与邻域平均灰度值差异较大。因此目标和背景中的象素将出现在对角线周围, 故方块0 和 1 包含了目标类和背景类的分布; 远离对角线的方块 2 和3, 对应边缘和噪声。

基本思想:利用点灰度和区域灰度均值的二维直方图,根据熵最大原则寻找最佳阈值。

做法:首先以原始灰度图像(L个灰度级)中各象素及其4邻域组为一个区域,计算出区域灰度均值图像(L个灰度级),这样原始图像中的每个象素都对应一个点灰度-区域灰度均值对,这样的数据对存在L×L种可能的取值。

ni,j为图像中点灰度为i及其区域灰度均值为j的象素点数,pi,j为点灰度-区域灰度均值对(i,j)发生的概率,则


则{pi,j,i,j=0,1,……L-1}就是该图像关于点灰度-区域灰度均值的二维直方图

结论:

1.在强噪声干扰下,一维直方图是单峰的二维直方图利用了图像邻域的相关信息,目标和背景的双峰仍然明显;

2. 点灰度-区域灰度均值的概率高峰主要出现在XOY平面的对角线附近,并且在总体上呈现双峰和一谷的状态;

这是由于图像的所有象素中,目标点和背景点所占比例最大,而目标区域和背景区域内部象素灰度级比较均匀,点灰度及其区域灰度均值相差不大,所以都集中在对角线附近,两个峰分别对应于目标和背景;远离XOY平面对角线的坐标处,峰的高度急剧下降,这部分所反映的是图像中的噪声点、边缘点和杂散点。

3. 应该在A区和B区上用点灰度-区域灰度均值二维最大熵法确定最佳阈值,使真正代表目标和背景的信息量最大。

这是由于图像的所有象素中,目标点和背景点所占比例最大,而目标区域和背景区域内部象素灰度级比较均匀,点灰度及其区域灰度均值相差不大,所以都集中在对角线附近,两个峰分别对应于目标和背景;远离XOY平面对角线的坐标处,峰的高度急剧下降,这部分所反映的是图像中的噪声点、边缘点和杂散点。


2018-08-18 09:54:37 u012366767 阅读数 2168

    图像最大熵阈值分割的原理:使选择的阈值分割图像目标区域、背景区域两部分灰度统计的信息量为最大。

    具体描述:

1. 根据信息熵定义,计算原始图像的信息熵H0,选择最大、最小灰度灰度的均值为初始阈值T0;

2. 根据T0将图像分割为G1和G2两个区域,均值分别为M1和M2,更新阈值为T2=0.5*(M1+M2);

3. 计算G1和G2的信息熵Hd和Hb,比较Hd+Hb与H0的大小,如果相等或在规定的范围内,或者达到最大迭代次数,则将T2最为最终阈值输出,否则T0=T2,H0=Hd+Hb,重复第2步直到满足条件。

function ThreshValue = My_MaxEntropy(Imag)
% 最大熵计算阈值
% 输入:
%    Imag:二维数组,数值表示灰度;
% 输出:
%    ThreshValue:阈值
[X, Y] = size(Imag);
V_max = max(max(Imag));
V_min = min(min(Imag));
T0 = (V_max + V_min) / 2;      % 初始分割阈值
h = My_imhist(Imag);              % 计算图像的直方图
grayp = h/(X*Y);                      % 求图像像素概率
% 计算初始熵
H0 = 0;
for i = 1 : 256
    if grayp(i) > 0
        H0 = H0 - grayp(i)*log(grayp(i));
    end
end
% 开始迭代计算
cout = 100;                            % 设置最大迭代次数
while cout > 0
    Tmax = 0;          % 初始化
    T1 = T0;   
    A1 = 0;              % 分割区域G1的点数
    A2 = 0;              % 分割区域G2的点数
    B1 = 0;              % 分割区域G1的灰度总和
    B2 = 0;              % 分割区域G2灰度总和
    for i = 1 : X        % 计算灰度平均值
        for j = 1 : Y
            if(Imag(i, j) <= T1)
                A1 = A1 + 1;
                B1 = B1 + Imag(i, j);
            else
                A2 = A2 + 1;
                B2 = B2 + Imag(i, j);
            end
        end
    end
    M1 = B1 / A1;              % 分割区域G1的平均灰度
    M2 = B2 / A2;              % 分割区域G2的平均灰度
    T2 = (M1 + M2) / 2;     % 更新阈值
    TT = floor(T2);
    grayPd = sum(grayp(1 : TT));    % 计算分割区域G1的概率和
    if grayPd == 0
        grayPd = eps;
    end
    grayPb = 1 - grayPd;
    if grayPb == 0
        grayPb = eps;
    end
    % 计算分割后区域G1和G2的信息熵
    Hd = 0;
    Hb = 0;
    for i = 1 : 256
        if i <= TT
            if grayp(i) > 0
                Hd = Hd - grayp(i)/grayPd*log(grayp(i)/grayPd);
            end
        else
            if grayp(i) > 0
                Hb = Hb - grayp(i)/grayPb*log(grayp(i)/grayPb);
            end
        end
    end
    H1 = Hd + Hb;      % 总的熵
    % 退出条件
    if abs(H0 - H1) < 0.0001 
        Tmax = T2;
        break;
    else 
        T0 = T2;
        H0 = H1;
    end
    cout = cout - 1;
end
% 返回阈值
ThreshValue = floor(Tmax);
end

% 灰度直方图
function h = My_imhist(Imag)
h = zeros(256, 1);
for k = 1 : 256
    h(k) = 0;
    for i = 1 : size(Imag, 2)
        for j = 1 : size(Imag, 2)
            if Imag(i, j) == k - 1
                h(k) = h(k) + 1;
            end
        end
    end
end
end

 

2019-10-16 10:11:32 LilyZJ 阅读数 11

二值化方法

  • 最大类间方差法(Otsu)
  • 直方图双峰法
  • 均值法
  • 最大熵阈值法

参考:
常见的二值化方法
图像二值化方法中的阈值法

图像拼接

特征提取与匹配

  • 基于SIFT的图像拼接:SIFT计算量很大,因此在速度要求很高的场合下不适用
  • 基于SURF的图像拼接:相比SIFT,提高了速度,但精确性和稳定性不如SIFT
  • 基于ORB的图像拼接:

SIFT特征描述子

构造尺度空间

利用高斯差分算子获得高斯差分空间,基于变换后的图提取特征

非极值抑制

在尺度空间中寻找极大极小值点作为初步特征点。

精确定位极值点

用泰勒展开找到亚像素级的特征点,消除低于阈值的点。

选取特征点的主方向

统计邻域的梯度方向直方图,将直方图中最大的bin作为主方向,同时大于最大bin 80%的方向也可以同时作为主方向,即一个特征点可以有多个主方向。

构造特征描述子

取一个邻域,划分成4*4个子邻域,对每个邻域计算一个八方向梯度直方图,16个邻域获得1个128维向量,即SIFT特征描述子。

参考:
特征点检测学习_1(sift算法)

SURF特征描述子

构造高斯金字塔尺度空间

先对原图进行滤波,再获取每个像素的Hessian矩阵行列式的近似值图,然后基于变换后的图提取特征。

SURF构造高斯金字塔不同的octave通过采用不同的高斯模板尺寸来获得不同的尺度(模糊程度),同一个octave中的各个图片的高斯模板尺度也不同,不需要下采样,提高了速度。

利用非极大值抑制初步确定特征点

在变换后的图上,将每个像素点与其3维邻域的26个点进行比较,若为最大值或最小值,则保留,作为初步的特征点。

采用线性插值精确定位极值点

采用线性插值得到亚像素级的特征点,同时去掉小于阈值点。

选取特征点的主方向

统计特征点邻域内的harr小波特征。(SIFT则是在特征点邻域内统计梯度直方图)

构造特征描述子

在特征点周围选取一个区域,将该区域划分为4*4的子区域,每个子区域计算1个4维向量,分别是相对于主方向的水平方向值之和,水平方向绝对值之和,垂直方向之和,垂直方向绝对值之和。最终16个子区域获得一个64维的向量,即为SURF特征描述子。

参考:
特征点检测学习_2(surf算法)

特征描述子的比较

  • SIFT采用DOG(高斯差分算子)图像,SURF先进行高斯滤波,再构造Hessian矩阵。
  • SIFT在原图的DOG图上寻找特征点,SURF在原图每个像素的Hessian矩阵行列式近似值图像上寻找特征点
  • SURF通过改变高斯模板的尺寸来改变尺度,相比SIFT节省了下采样过程,提升了速度

特征点匹配

对于特征点集合B中的特征点,去寻找A中最相似的点,sift特征点匹配采用kd-tree,能更快速地找到匹配点。

kd-tree主要思想是对搜索空间进行划分,查找的时候kd-tree相当于一棵二叉查找树,因此大大减小了搜索空间。

图像配准

得到两幅待拼接图像的匹配点集后,进行图像的配准,即将两张图像转换为同一坐标下

图像拷贝

图像融合

两幅图像的拼接处因光照或其他原因过度不自然,可以采取加权融合,使得图像平缓过度。

参考:
OpenCV探索之路(二十四)图像拼接和图像融合技术

没有更多推荐了,返回首页