运用matlab的灰度识别分析土壤剖面(2)

1.固液气三相在剖面中的面积计算

其实很简单,只要在上一篇文章的代码基础上做一定的增添

%计算不同灰度所占像素
solid = 0;
liquid = 0;
gas = 0;
invalid = 0;
for i = 1:1193
    for j=1:1528
        if (140<= I_gray(i,j))& ( I_gray(i,j)<= 200)%经过试错发现阈值区间不能太小,要更大点
            solid = solid+1;
            %I_gray(i,j) = 0;%将固体区域变为纯黑,检测图像识别是否正确
        else if (90<= I_gray(i,j))& ( I_gray(i,j)<= 130)
                liquid = liquid+1;
                %I_gray(i,j) = 0;%将液体区域变为纯黑,检测图像识别是否正确
        else if (75<= I_gray(i,j))& ( I_gray(i,j)<= 89)
                    gas = gas+1;
        else 
            I_gray(i,j) = 255;
            invalid = invalid+1;
                end
            end
        end
    end
end
solid%输出固相的像素数
liquid%输出液相的像素数
gas%输出气相的像素数
validsum = solid+liquid+gas;
validsum
invalid
%计算识别到的和未识别到的比率rate,作为判断本次识别是否有效的标准
rate = validsum/(1193*1528);%分母是总像素数,可以查看图片尺寸得到
rate

根据图像的比例尺(这个要结合实际样品的尺寸得到),就可以通过像素数换算成实际的尺寸,进一步可以用来计算含水率等参数

2.剥离固相、气相,只保留液相

我的研究需要用到液相的变化,因此需要剥离原图像中的固相和气相,大家可以根据自己的需要修改代码

subplot(111);
imshow(I);
for i = 1:1193
    for j=1:1528
        if (140<= I_gray(i,j))& ( I_gray(i,j)<= 200)
            I_gray(i,j) = 255;%将固体区域变为纯白
        else if (90<= I_gray(i,j))& ( I_gray(i,j)<= 130)
                I_gray(i,j) =0;%将液体区域变为纯黑
        else if (75<= I_gray(i,j))& ( I_gray(i,j)<= 89)
                    I_gray(i,j) = 255;%将气体区域变为纯白
        else 
            I_gray(i,j) = 0;%将未知区域变为纯黑
                end
            end
        end
    end
end
subplot(111)
imshow(I_gray);
figure,imshow(I_gray);
    title('只保留液相的图像')

处理后的图像对比

        这是原图

        

        这是只保留液体后的

        

但这还不是我们想要的,处理后的图像有太多干扰点和水膜,我需要的只是液桥的形态

3.图像优化

        为了优化掉干扰点和水膜,我们可以根据它们尺寸很小的特点,创建循环,判断像素上下左右一定范围内是否有其它黑色像素,是则认为该像素属于液桥,否则认为该像素属于干扰点或是水膜

%删除水膜和干扰点,横向优化
subplot(111);
imshow(I);
for times = 4:-1:1%这既是总循环的次数,也是每次优化时判定范围缩小的值
    for i = (1):(1193)%防止超出索引边界
        for j=(1+times):(1528-times)
            if I_gray(i,j-times) == 255 &&   I_gray(i,j+times) == 255
                I_gray(i,j) = 255;%将无效区域变为纯白
            end
        end
    end
end
subplot(111)
imshow(I_gray);
figure,imshow(I_gray);
    title('一次优化后的图像')

%删除水膜和干扰点,纵向优化
subplot(111);
for times = 4:-1:1%这既是总循环的次数,也是每次优化时判定范围缩小的值
    for i = (1+times):(1193-times)%防止超出索引边界
        for j=(1):(1528)
            if I_gray(i-times,j) == 255 &&   I_gray(i+times,j) == 255
                I_gray(i,j) = 255;%将无效区域变为纯白
            end
        end
    end
end
subplot(111)
imshow(I_gray);
figure,imshow(I_gray);
    title('二次优化后的图像')

优化结果

        

        这回看起来有模有样了,但是成功了吗,我不好说,干扰点删除得七七八八了,但是部分比较厚的水膜还是被保留了下来。噪点删除过多会导致系统误删掉液桥的边角,删除过少则会保留过多的水膜。

        该怎么解决?且待下回分解

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值