函数
void adaptiveThreshold(InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C)
InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 具体的请看官方的说明,这里不多做解释
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C:在对参数int adaptiveMethod的说明中,我已经说了这个参数的作用,从中可以看出,这个参数实际上是一个偏移值调整量
从上面的说明中可以看出,使用函数adaptiveThreshold的关键是确定blockSize和C的值,明白了这两个值的意义之后,在实际项目中,应该可以根据试验法选出较为合适的值吧!
目的
图像阈值化目的是从灰度图像中分离目标区域和背景区域,仅通过设定固定阈值很难达到理想的分割效果。在实际应用中,我们可以通过某个像素的邻域以某种方法确定这个像素应该具有的阈值,进而保证图像中各个像素的阈值会随着周期围邻域块的变化而变化。在灰度图像中,灰度值变化明显的区域往往是物体的轮廓,所以将图像分成一小块一小块的去计算阈值往往会得出图像的轮廓,固定阈值的方法就不行。
例子
1.进行最大(最小)值滤波初步得到光照图
2.进行均值(或高斯)滤波得到最终的光照分布图
3.原始图像减去光照图,得到前景目标
matlab中自带的rice.png图举例。我们希望能够把大米和背景区分开来,直观的做法是用阈值分割来做成二值图,再对联通区域进行标记,这样就能知道每个大米的大小和中心位置。可是仔细观察大米图会发现摄像时光照不均匀,这样就很难用一个全局阈值去进行分割,如果直接分割的话会导致一部分背景被识别为目标(阈值偏小)或者丢失部分目标(阈值偏大)。如果把光照的不均匀去掉,再做二值化的结果如何呢?
function newIm= DUCO_RemoveBackGround(im,w,isShow)
%im:原始图像;w 滤波窗体大小;isShow 是否显示中间过程
%
%
if isShow==1
figure
imshow(im,[])
end
bk=double(im);
%1.最小值滤波
bk=ordfilt2(bk,1,ones(w,w),'symmetric');
if isShow==1
figure
subplot(2,2,1)
imshow(bk,[]),title('最小值滤波之后的结果'); %显示滤波后的图象
end
%2.均值滤波
h=ones(w,w)/(w*w);
bk=imfilter(bk,h,'replicate');
if isShow==1
subplot(2,2,2)
imshow(bk,[]),title('均值滤波之后的结果'); %显示滤波后的图象
end
%3.减掉亮度不均的结果
newIm=imsubtract(double(im),bk);
if isShow==1
subplot(2,2,3)
imshow(newIm,[]);title('去背景图');
end
%4.二值化分割出目标
th=graythresh(newIm/255);
newIm=im2bw(newIm/255,th);
if isShow==1
subplot(2,2,4)
imshow(newIm),title('二值化的结果'); %显示滤波后的图象
end
end
其实右上的图就是背景的光照分布。最后的二值图中还是存在一些白色的噪声点,可以在小窗体范围内,做一个最小值滤波再做一个最大值滤波,这样既消除了噪声又保证目标的边缘不会被破坏。
来源:CSDN
作者:小魔王降临
链接:https://blog.csdn.net/qq_30460949/article/details/103914362