matlab灰度图像一致性校正方法

针对相同场景,不同相机条件,不同环境参数条件下,灰度图像所具有的灰度特征有所不同,对于后续特征识别,特征标定,图像特质分析等后处理均产生了不小的麻烦。在进行图像灰度一致性校正过程中,我通过多种方法的识别测试,最终测试后有以下结果。

整体灰度图像的一致性校正过程,转化为数学模型(本人数学基础较差,多有误错请谅解并指出)。即如何找到两幅图像中对应相同特征的不同灰度值,即在已知定义域和值域条件下,利用图像中的特征取寻找适当的函数关系。

首先本人在研究之初,采用最为简单的,通过灰度直方图,进行灰度出现频率的排序过程,在同样的拍摄内容中,相同特征在图像中的灰度值可能不同,但出现的频率大致相同,通过逐步对各个灰度的出现频率进行分析研究,可得到多幅图像间对应的灰度内容,并通过回归、拟合等方法最终实现图像的一致性校正过程。

 但随着该方法的实际适用,发现仅考虑的图像的灰度变化情况还掺杂着对比度变化,增益变化,噪声变化等等诸多因素。故而该方法适用性较低。并且由于一幅图像中,多数灰度出现频率吧并不会很集中,并且多个灰度出现频率会类似,甚至相同。如下图所示:

matlab灰度图像一致性校正方法_第1张图片

matlab灰度图像一致性校正方法_第2张图片

如上,该两幅图具有完全相同的灰度内容(实际图像并未展示),仅在不同环境下成像过程,导致其对比度分布,增益分布,图像均衡等方面均有所不同,但在灰度直方图分配过程中,整体曲线分布存在差异,无法仅仅通过灰度频率分布实现图像内容的对应识别。同时在图中也可以发现,内容中灰度出现频率最高的灰度值,往往在不同条件下,其灰度频率始终维持在一个较高的位置。故而该方法具有一定的参考性。即可以通过最高频率灰度大致确定最大的特征在图像中的灰度分布情况。

那么在实际求取特征过程中,随着我对灰度特征内容定位所带入了数学模型越复杂,在不考量计算效率的条件下,图像间的变化关系越来越精确具体。但最精确地,图像间的一致性校正理论,即为将整张图像所有坐标点的灰度值一一对应,例如有两张2048*2048的图像,在进行一致性校正时,则可以将2048*2048=4194304个确定像素位置相关的灰度值进行一一对应,如果可以直接将该关系进行求解,则可以确定两张图像各自条件下最佳的变化关系。

但在实际计算时,本人所需求解往往是需要及时性的求解过程,并且往往环境条件并不固定,所以上述理想化方法局限性明显,虽然可以高精确的求解出对应灰度图像间的变化关系,但在更为广泛的条件下,由于其过高的计算量,所以该方法仅在单张图像验证时具有一定的效果。

这是针对该应用的大致前期研究背景,后期本人研究过程将由下三个方面开展:

1.如何用最少的灰度特征,代表一致性处理过程的整张图像特点。

2.如何在整张图像中找到最适合一致性处理的图像特征内容。

3.如何求取适当的计算效率与精度兼容的计算模型。

具体如下内容:

1.如何用最少的灰度特征,代表一致性处理过程的整张图像特点。

本人所需求灰度图像一致性校正,主要有两种目标要求,一个是实现成像的实时校正,通过算法写好界面直接显示校正后的图像内容,而此时图像间一般灰度差异不会太明显,在多张中偶尔出现单证图像灰度值跳闪,亮度拉低等情况。该目标一般用于实现DR过程,即X射线成像时,由于射线源功率无法始终稳定保持,仅用于DR成像过程。

在此需求条件下,如果要找到最少的特征,我所采用了特征识别定位+局部特征提取方法。特征识别定位我主要通过边缘识别,阈值分割对图像中几何形状标注分类,通过区域连通域坐标范围用以进行重合性识别,实现特征定位。下代码为图像中的小球质心识别:

clear 
close all
clc、
%%
Img1=im2double(imread('1.jpg'));%读取图片F:\picture
%Img1=Img1*2;
[mx,my]=size(Img1);
n=graythresh(Img1);
B=im2bw(Img1,0.4);
[height, width]=size(Img1);
for i1=1:2048
    for i2=1:2048
        if Img1(i1,i2)>0.57
        Img1(i1,i2)=1;
        else
        Img1(i1,i2)=0;
        end
    end
    end
bw=Img1;
bbw=bw;
bw=1-bw;
bw = bwareaopen(bw,9000);
bw = bwareaopenbig(bw,20000);
% figure(20),imshow(bw);
se = strel('disk',2);
bw = imclose(bw,se);
% figure(30),imshow(bw);
% bw = imfill(bw,'holes');
% figure(40),imshow(bw);
[B,L] = bwboundaries(bw,'holes');
figure(50)
imshow(label2rgb(L,@jet,[.5 .5 .5]))
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end
stats = regionprops(L,'Area','Centroid');
threshold = 0.94;
% loop over the boundaries
for k = 1:length(B)
  % obtain (X,Y) boundary coordinates corresponding to label 'k'
  boundary = B{k};
  % compute a simple estimate of the object's perimeter
  delta_sq = diff(boundary).^2;    
  perimeter = sum(sqrt(sum(delta_sq,2)));
  % obtain the area calculation corresponding to label 'k'
  area = stats(k).Area;
  % compute the roundness metric
  metric = 4*pi*area/perimeter^2;
  % display the results
  metric_string = sprintf('%2.2f',metric);
  % mark objects above the threshold with a black circle
  if metric > threshold
    centroid = stats(k).Centroid;
    plot(centroid(1),centroid(2),'ko');
  end
  text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
       'FontSize',14,'FontWeight','bold')
end
title(['Metrics closer to 1 indicate that ',...
       'the object is approximately round']);
%%
[L,num]=bwlabel(bw,4);
plot_x=zeros(1,num);%%用于记录质心位置的坐标
plot_y=zeros(1,num);

for k=1:num  %%num个区域依次统计质心位置
    sum_x=0;sum_y=0;area=0;
    for i=1:height
    for j=1:width
       if L(i,j)==k
        sum_x=sum_x+i;
        sum_y=sum_y+j;
        area=area+1;   
       end
    end
    end
    plot_x(k)=fix(sum_x/area);
    plot_y(k)=fix(sum_y/area);
end
for i=1:num
hold on
plot(plot_y ,plot_x, '*');
% text(real(1,i) ,real(2,i),[num2str(i)],'color','b');
end

代码中bwareaopen函数,主要负责对二值化后连通域的面积大小进行限定,bwareaopenbig函数同理,该函数改编方法本人仅参考,来源于csdn上很多大神程序的片段,我这里具体修改的是:

bwareaopen函数本身matlab自带,bwareaopenbig函数则是:

idxToKeep = CC.PixelIdxList(area <= p);
idxToKeep = vertcat(idxToKeep{:});

此处修改后,bwareaopen用于保证连通域面积下限,bwareaopenbig用于保证连通域面积上限。通过整体图像大小,特征圆面积大小即可进行识别。

同时上代码本人在具体实现时,根据灰度图像的不同特点,可线性化灰度特征,提高对比度以实现更好的边缘识别能力。除了圆形,同样可以根据需求,面积大小不同,尽可能识别各类不同参数的特征。

识别特征主要是用于图像的一致性校正特征的定位过程,在进行一些特征的定位后,我们可以首先围绕特征坐标区域范围进行灰度拟合进行校正,及在上述代码中,可围绕质心区域范围坐标内的多幅图像进行灰度拟合校正过程。

同时在上述代码的基础上,还可以消除对连通域面积的判断,从而直接按照面积大小寻找面积最大和最小的连通域,面积最大的连通域一般是背景区域,故而在确定背景区域后,可以按规律提取等间隔坐标范围的点集,进行拟合。

取得图像中一致性校正特征的方法主要内容如上。

2.如何在整张图像中找到最适合一致性处理的图像特征内容。

按照第一步,我们可以按照不同的方法,得到特征内容灰度区域的坐标位置,但在多种各类特征中,如何找到最适合一致性校正的特征内容,对后续处理的算法效率至为关键。不同的特征,在灰度上体现即为频率,灰度值,坐标范围。综合分析一下,图像一致性问题的来源,即由于环境不同,成像设备参数不同两方面造成。

环境因素:主要导致图像的整体亮度有偏差,整体图像的对比度不同。

成像设备:成像设备造成的影像内容相对较多,包含图像噪声,成像清晰度,边缘锐化程度等等。

由于环境因素所造成的 ,本人所采集得到的图像一般显现出的特点为图像亮度,对比度等整体特性异同;而成像设备差异或不稳定性造成的除了类似于环境因素的全局变化特性,也会出现噪点,局部图像特性变化等特征,所以在不同条件下,针对不同的影像因素需要有针对性的解决方法。

针对图像亮度及对比度处理过程,本人考虑到算法效率等影响,仅采用一次函数拟合,对整张图像进行均匀取点,然后线性拟合,以此对整张图像进行亮度及对比度的调整。取点方法采用灰度值等间隔中位数取点过程。如下:

[m,n]=size(img1);
k=1;
for i=1:10:m
    for j=1:10:n
s(k)=median(img1(i,j));
k=k+1;
    end
end

即等10间隔取中位数,求得图像代表性灰度值点。在图像中对该点集进行坐标记录,在不同图像间找到同坐标灰度值,进行拟合即可得到变化关系。

对于成像设备成像区别,一般在图像中局部区域出现图像不一致性时,本人采用长短帧均值方法,用以保持整体系统的区别差异。

你可能感兴趣的:(matlab,计算机视觉,图像处理)