图像 中位数-均值评估自定义函数 slecValueOfPic (Matlab)

 简介:

        处理多维光谱的图像数据时,常常需要将某一波段的平均反射提取出来,但是图像中本身含有一些噪音和一些关于反射的分布特征(分布的偏度、峰度)。这些噪音去除和分布特征的提取有助于后续模型预测准度提升(这些偏度和峰度也可作为特征喂给机器学习模型)。因此这里给出了一个运用于提取中位数均值或分布特征的matlab函数示例,用于参考。

代码部分:

function [actualaverageValue,actualNum,segama,K,S] = slecValueOfPic(img,range,method)
%SLECVALUEOFPIC
%输入一张(建议预处理:分割后)的灰度图片;根据这这张图片的像素值统计(除零外),取中间range值的范围的内容;并返回这个范围的平均值;
%这个取值的逻辑是取像素值中间的分布,以个数划分,如10个像素取60%取平均,就是取中间值的6个像素的平均;这种方法可以提高图像反射率的数值的鲁棒性,将噪点和背景的反射屏蔽掉一部分;

%   actualavergeValue:最后输出的平均值
%   img:输入的图像
%   range:范围,大小为0-1之间(折合百分数);
%   method:方法 1为中位数法 2为正太分布法 3为平均数法
%   actualnum:为成像面积
%   segama:偏度

segama=0;
K=0;
S=0;
if method==1
    staticD=imhist(img);
    allN=sum(staticD(2:256,1));
    rangeN=ceil(allN*range);
    thresholdNum=ceil((allN-rangeN)/2);

    thresholdValue=0;%初始化
    thresholdValueHigh=0;
    actualNum=0;

    for i=2:256%计算区间,为0的背景不算;
        nowSum=sum(staticD(2:i,1));

        if nowSum>thresholdNum
            if thresholdValue==0
                thresholdValue=i;%获得了最低门槛;
            end
        end
        if nowSum>(thresholdNum+rangeN)
            if thresholdValueHigh==0
                thresholdValueHigh=i;%获得了最高门槛;
            end
        end
    end
    allV=0;
    if thresholdValue~=0
        for j=thresholdValue:thresholdValueHigh%计算这个像素区间的平均值
            repreValue=staticD(j,1)*(j-1);%统计是从零开始统计;
            allV=allV+repreValue;
        end
        actualNum=sum(staticD(thresholdValue:thresholdValueHigh,1));
        actualaverageValue=allV/rangeN;
    else
        actualNum=0;
        actualaverageValue=0;
    end
    
elseif method==2%正太分布估计,此时actualnum为偏度
    [r,c]=find(img);
    [actualaverageValue,segama] = normfit(img(find(img)));
    K=kurtosis(img(find(img)));%峰度
    S=skewness(img(find(img)));%偏度
    [actualNum,~]=size(r);

elseif method==3%平均,正太分布和平均效果一致(如果符合正太分布的话);
    [r,c]=find(img);
    actualaverageValue = mean(img(find(img)),'all');
    [actualNum,~]=size(r);
end

end

运用示例:

        我这里使用一张植物幼苗的灰度图作为示例,你可以另存到自己的电脑进行尝试,使用该函数时时,程序会对图像进行分割(把0值的像素点作为非目标对象,即背景,其不会计入中位数、均值、正态分布的计算范畴),中位数会在此基础上进一步取中间分布像素点的平均值,我给的是20%,而均值和正太分布则考虑100%的目标对象的像素,偏度和峰度的数值也是基于此。

 使用代码示例:

>> pic=imread("025\16_10_12#Multispectral\0008.jpg"); %图片路径
>> [actualaverageValue,actualNum,segama,K,S] = slecValueOfPic(pic,0.2,1) %中位数法


anwser:
actualaverageValue =

   15.8761


actualNum =

      704806


segama =

     0


K =

     0


S =

     0

>> [actualaverageValue,actualNum,segama,K,S] = slecValueOfPic(pic,0.2,2) %分布数据获取

anwser:

actualaverageValue =

   17.8500


actualNum =

     2302681


segama =

    4.1742


K =

    0.0681


S =

    0.2600

MATLAB中,你可以使用内置的imfilter函数结合自定义函数来实现图像均值滤波和中值滤波。这两种滤波都是平滑图像噪声、去除椒盐噪声常用的方法。 1. **均值滤波**: 均值滤波通过每个像素周围指定大小(如4x4)的邻域取平均值来平滑图像。以下是简单的步骤: ```matlab % 定义4x4模板 template = ones(4) / 16; % 自定义函数 (假设img是输入图像) function smoothed_img = mean_filter(img, template) % 使用imfilter函数,第一个参数是输入图像,第二个是模板,第三个是选项 smoothed_img = imfilter(img, template, 'replicate'); end % 调用自定义函数并应用到图像上 filtered_img = mean_filter(original_image, template); ``` 2. **中值滤波**: 中值滤波则是替换每个像素点的值为其周围像素值的中位数,对于抗椒盐噪声更有效。由于中值滤波是排序操作,所以通常需要稍微复杂一些: ```matlab % 自定义函数 (这里可以先创建一个辅助函数计算中值) function median_val = find_median(values) values = sort(values); if mod(length(values), 2) == 0 median_val = (values(end/2) + values(end/2 - 1)) / 2; else median_val = values(end/2 + 1); end end function filtered_img = median_filter(img, kernel_size) % 将4x4窗口转换为向量 kernel = reshape(ones(kernel_size), [kernel_size^2, 1]); % 计算每行和每列的中值 row_meds = cellfun(@find_median, mat2cell(img, ones(1, size(img, 2)), kernel_size)); col_meds = cellfun(@find_median, mat2cell(img', kernel_size, ones(1, size(img, 1)))); % 应用中值滤波 for i = 1:size(img, 1) for j = 1:size(img, 2) filtered_img(i, j) = median_val(row_meds{i, j}, col_meds{j, i}); end end end % 使用中值滤波 filtered_img = median_filter(original_image, 4); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值