直方图规定化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/D_Katter/article/details/80593247

一种双峰高斯函数的直方图规定化算法

直方图均衡化可以有效达到增强整幅图像的对比度,但是该方法还不能满足特定需求的增强效果,只能得到全局均衡化处理的图像。然而在实际应用中,往往要根据不同的要求得到特定的直方图分布,以有选择地对某灰度范围进行局部的对比度增强。从实现效果上来说,直方图规定化是直方图均衡化的改进和扩展。利用阈值进行图像分割的难点在于找到背景和目标区域阈值分割点,由于直方图均衡化在操作背景的同时,将目标区域也进行了变换,不具有产生阈值点的功能,所以这里选取双峰高斯函数对图像进行直方图规定化处理。双峰高斯函数两峰之间的峰谷将整个图像分为两部分,基于这种思想,根据用户想提取的信息,设计出合适的双峰高斯函数来规定化处理原始图像,这样就能够有效的将处理后的图像作为阈值分割的输入图像,从而输出期望图像的直方图。
这里写图片描述
这里写图片描述
其中n为高斯函数的数学期望值,上图中n值取为50;σ为高斯函数的均方差,上图中σ值取为20。
完成直方图规定化的基本思路是:令{├ r_k }┤和P_r (r)是原图像的灰度和灰度概率密度函数,{├ z_k }┤和P_z (k)是期望图像的灰度和灰度概率密度函数,直方图规定化即是找到一个变换H,有z=H_r。算法过程如下:
(1)首先对{├ r_k }┤和{├ z_k }┤分别做直方图均衡化
s=T(r)=∫_0^r▒〖P_r (r)dr〗 (0≤r≤1)
u=G(z)=∫_0^z▒〖P_z (r)dr〗 (0≤r≤1)
(2)求出G变换的逆变换
z=G^(-1) (u)
灰度级z就是我们期望输出图像的灰度级。。
(3)根据均衡化的概念,s,u的直方图都是常量,由此可以用s替代u进行上述逆变换
z=G^(-1) (u)=G^(-1) (s)
(4)由直方图变换的线性特性,可有G^(-1)和T的复合变换,求出符合变换的H
z=G^(-1) (T(r))=G^(-1) T(r)
H=G^(-1) T
(5)用H对图像做灰度级变换
(6)对于离散图像,相应的规定化表达式为:
〖 P〗_z (Z_k )=n_k/N 0≤z_k≤1 k=0,1,2,…….l-1
u_k=G(Z_k )=∑_(k=0)^(l-1)▒P_Z (z_k)
z_k=G^(-1) (s_k )=G^(-1) ⌊T(r_k)⌋
其中N表示图像中像素的总数,n_k是为某一灰度级出现的频率,L表示灰度级总数。
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
根据上面介绍的图像规定化算法流程,对橘子图像进行了实验,得到3组图像。图3.1为输入图像,输入图像灰度图像直方图和利用Otsu算法阈值分割二值化的图像。从直方图可以看出,原始图像在全区域分布较广,二值化的图像存在明显的缺陷,目标区域橘子只显示了部分图像,存在信息丢失。图3.2为选取的变换双峰函数,这里将峰谷设置在灰度级为120处。图3.3为直方图规定化处理后的图像和当前图像的直方图和二值化的图像。对比图像可知,转换后的图像在直方图上比原始图像明显存在更好的阈值分割特性,从二值化图像也能看出,转换后的图像能够保证信息的完整性。虽然橘子叶还存在期望图像中,但是相对于均衡化处理的图像改进许多。

% clear all;
% close all;
% clc;
img=imread('timg7.jpg');
 img=rgb2gray(img);
[m  n]=size(img);
hist=imhist(img);           %原图直方图
p=hist/(m*n);       
figure;
subplot(121),imshow(img);title('原图');  
subplot(122),plot(hist);title('原图直方图');      

r=127;                              
x=-r:r+1;
sigma=20;
y1=exp(-((x-60).^2)/(2*sigma^2));
y2=exp(-((x+60).^2)/(2*sigma^2));
y=y1+y2;                        %选取具有双峰的高斯函数

y=y/sum(y);         %归一化
figure;
subplot(121),plot(y);title('期望图像直方图');           %期望直方图

G=[];               %函数的累积直方图
for i=1:256
   G=[G sum(y(1:i))]; 
end

s=[];                   %待处理图像的累积直方图
for i=1:256
    s=[s sum(p(1:i))];
end

for i=1:256
    tmp{i}=G-s(i);
    tmp{i}=abs(tmp{i});         %因为要找距离最近的点,所以取绝对值
    [a index(i)]=min(tmp{i});   %找到两个累积直方图距离最近的点
end

imgn=zeros(m,n);
for i=1:m
   for j=1:n
      imgn(i,j)=index(img(i,j)+1)-1;    %由原图的灰度通过索引映射到新的灰度
   end
end

imgn=uint8(imgn);
figure;
subplot(121),imshow(imgn);title('期望图像');  
subplot(122),plot(imhist(imgn)) ;title('期望图像直方图');       %新图的直方图
imwrite(imgn,'11.jpg');
imwrite(img,'18.jpg');
I=im2double(img);
%Otsu阈值分割算法
% w=fspecial('average');
% % h = fspecial('motion', 10, 15);%创建一个滤波器
%  I=imfilter(I,w,'replicate');
T=graythresh(I);
J=im2bw(I,T);
figure,imshow(~J);title('规定化图像阈值分割二值化');

猜你喜欢

转载自blog.csdn.net/D_Katter/article/details/80593247
今日推荐