matlab基于亮度均衡校正阈值分割——代码

问题描述:

matlab基于亮度均衡校正阈值分割——代码_第1张图片

       对于同一目标物体来说,在高亮度区和低亮度区的最佳阈值差别很大,因而使用全局阈值分割法很难全部分割成功,而使用局部阈值分割法容易造成局部分割失真。本文分别使用三种方法对照度不均匀的图像进行光照补偿后,观察直方图,并进行otsu分割。

算法:

方法一:基于交互式进行两次对数变换,由于图像左下角光照低,因此第一次拉伸强度大,第二次拉伸处理图像的左半部分,拉伸强度较小。此方法直观可控,但通过观察直方图,对暗部确实有拉伸效果,但是效果不好。

s=c log(1+r)

步骤:

(1)设置交互窗口,框选拉伸的范围;

(2)设置阈值

(3)对所选中的范围进行对数变换;

(4)如前三步,进行第二次对数变换。

注意:所选区域不要超过图像范围

方法二:采用matlab自适应直方图均衡化,直观上增加了图像的对比度,便于人眼的图像分割,但观察直方图,波峰不明显,波谷也不明显,对于计算机图像进行分割效果不充足

方法三:对图像进行了亮度均衡[1],先对图像的背景亮度进行分块并动态地调整,使调整过的图像背景亮度大致处于相同的水平。

(1)求取图像的全局平均亮度;

(2)对图像的每小块进行扫描求取该块的平均亮度,按照每个子块的分布获得子块平均亮度矩阵,图像分块愈小,效果愈好,但影响运算速度;

(3)把子块亮度矩阵中每个值都减去全局平均亮度,获得子块亮度差值矩阵这样高亮度区子块的亮度差值为正,而低亮度子块的亮度差值为负;

(4)把子块亮度差值矩阵扩展到与原图像相同大小,获得全图像亮度差值矩阵;

(5)将原始图像各像素亮度值各自减去全图像亮度差值矩阵中对应的数值,这样使得图像亮度高的区域同时衰减,而亮度低的区域得到增强;

(6) 根据原图像中最低和最高亮度来调节每个子块像素的亮度使之符合整个亮度范围;

注意:复现的是参考文献中的代码

代码:

clc
clear all
I_noise=imread("tblob2.png");
I_noise=im2double(I_noise);

% 对数变换
figure,
imshow(I_noise,[])
p = getrect;  %返回区域位置信息
p = round(p);
%设置阈值
k = 1.6;
img_P=I_noise;
img_P(p(2):p(2)+p(4),p(1):p(1)+p(3)) = k* log(1 + I_noise(p(2):p(2)+p(4),p(1):p(1)+p(3)));
figure,
imshow(img_P)
da = ['k=' num2str(k) '变换后的图像'];
title(da)
p1 = getrect;  %返回区域位置信息
p1 = round(p1);
%设置阈值
k = 1.3;
img_P(p1(2):p1(2)+p1(4),p1(1):p1(1)+p1(3)) = k* log(1 + img_P(p1(2):p1(2)+p1(4),p1(1):p1(1)+p1(3)));

%自适应均衡化
img=adapthisteq(I_noise);

%亮度均衡
%计算全局平均亮度
average=mean(mean(I_noise));
blocksize=64;
[row, col]=size(I_noise);
row_new=uint8(row/blocksize);
col_new=uint8(col/blocksize);
%计算子块的平均亮度矩阵
blockimage=zeros(row_new,col_new);

for r = 1:row_new
    for c = 1:col_new
        rowmin = (r-1) * blocksize+1;
        rowmax = r * blocksize;
        if (rowmax>row)
            rowmax = row;
        end
        colmin = (c-1) * blocksize+1;
        colmax = c * blocksize;
        if (colmax>col)
            colmax = col;
        end
        imageROI = I_noise(rowmin:rowmax , colmin:colmax);
        temaver = mean(mean(imageROI));
        blockimage(r,c) = temaver;
    end
end
%子块亮度插值
blockimage = blockimage - average;
%重构图像
blockimage2 = imresize(blockimage,[row col]);
dst = I_noise - blockimage2;
dst = im2double(dst);
%% 显示亮度均衡化的图像
figure,
subplot(3,3,1)
imshow(img_P);
title("经过两次对数变换")
subplot(3,3,2)
imshow(img);
title("自适应直方图均衡化")
subplot(3,3,3)
imshow(dst);
title("亮度均衡算法")
subplot(3,3,4)
imhist(img_P);
subplot(3,3,5)
imhist(img);
subplot(3,3,6)
imhist(dst);

结果:

matlab基于亮度均衡校正阈值分割——代码_第2张图片

根据直方图来看:

方法一:由于图像左下角光照低,因此第一次拉伸强度大,第二次拉伸处理图像的左半部分,拉伸强度较小。此方法直观可控,但通过观察直方图,对暗部确实有拉伸效果,但是效果不好。

方法二:直观上增加了图像的对比度,便于人眼的图像分割,但观察直方图,波峰不明显,波谷也不明显,对于计算机图像进行分割效果不充足。

方法三:直方图双峰分布明显

 

参考文献:

  1. 彭兴邦,蒋建国.一种基于亮度均衡的图像阈值分割技术[J].计算机技术与发展,2006(11):10-12.

你可能感兴趣的:(图像处理matlab,matlab,开发语言,图像处理,算法)