2021-07-07

山东大学暑期项目实训(四)

数字图像处理的复习

图像分割算法的寻找和调整

一开始寻找到的就是根据自适应阈值的图像分割算法
比如这篇基于局部统计可变阈值的图像分割算法link
分割过程:
1,灰度图上进行,
2,每个像素点处设一个阈值
3,领域,
4,一般使用领域内标准差,标准差表示对比度
5,全局平均还是领域平均看情况自己选择
6,求标准差、均值前一定要图像转换为float类型,tofloat不是matlab内置
函数,需要自己添加
7,分割结果图均为二值图像

%默认8领域
I=imread('F:\20191214162428.jpg');
I1=rgb2gray(I);
I1=tofloat(I1);
I2=stdfilt(I1);
figure,imshow(I2);
m=imfilter(I1,1/9*ones(3),'replicate');
m2=mean2(I1);
I3=(I1>15*I2)&(I1>0.4*m);
figure,imshow(I3);

function [out,revertclass] = tofloat(inputimage)

% 类型转换
% 单纯的取 x 用的匿名函数句柄(玩的有点花)
identify = @(x) x;
% 将输入转换为单精度的函数句柄
tosingle = @im2single;

table = {'uint8',tosingle,@im2uint8 

         'uint16',tosingle,@im2uint16 

         'logical',tosingle,@logical

         'double',identify,identify

         'single',identify,identify};
% strcmp(s1,s2),输入字符串的数组可以说任意类型组合
% find 找出其中的真值
classIndex = find(strcmp(class(inputimage),table(:,1)));

if isempty(classIndex)

    error('不支持的图像类型');

end
% 找到对应的转换类型
out = table{classIndex,2}(inputimage);
% 记录对应逆转换类型
revertclass = table{classIndex,3};
end

其次我的主要修改是在这篇代码上,想要通过调整参数,使得我们的项目图像处理的结果会比较好看一些。
首先是将图片转换为灰度图像,转变为float类型
然后是几个对比参数图片的生成

I2=stdfilt(I1);

matlab的函数stdfilt()函数,是对领域标准差的一个操作,处理后的图片的数值变成其3*3范围的标准差,那么很明显,边缘等跨度较大的地方在I2中看起来会亮一些。然后这个地方也是我觉得不太符合我的想法的地方。

m=imfilter(I1,1/9*ones(3),‘replicate’);

对I1使用一个3*3全是1/9的矩阵进行滤波,感觉这里的效果就是一个均值滤波,得到的应该是一个平滑的图像

I3=(I1>15I2)&(I1>0.4m);

根据上面得出的两个参数图像来构建阈值对原图像进行二值化分割
那么对这个参数值15和0.4进行修改,以适应对自己的图像的最佳处理。

这其中,值越大,就说明阈值越大,那么超过这个值的像素就会少,0的数量变多,整个二值图图像会更加偏向黑色一点。

一些问题

1,首先很容易发现的,局部阈值的使用,对于目标的内部处理并不是很好,这个8邻域偏小,二值化后的图像大概是个轮廓图,内部因为阈值的问题会出现挺多空缺,所以I3=(I1>15I2)&(I1>0.4m);这里用大于等于可能可以弥补一部分效果,但是仍会存在内部空洞。
这样需要做一些闭操作来弥补,但是除了我们想要提取的部分,仍有很多的小邻域噪声的问题,这样会影响闭操作的效果
2,同样,因为是局部阈值,在目标提取物逐渐增多的同时,会出现很多小黑点,很多的小区域噪声,需要后续方法去除。
3,图像差异很大,对于随机找的图像调整到的参数,用在其他的图像上,效果并不理想。换言之,不同的图片用一个算法不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值