MATLAB图像二值化函数im2bw与imbinarize对给定阈值的内部处理细节

文章探讨了MATLAB中im2bw和imbinarize函数在二值化灰度图像时的内部处理,特别是在图像灰度级范围与数据类型不匹配时可能出现的问题。当图像以整形存储但灰度范围超出数据类型范围时,可能导致错误的二值化结果。建议的解决方法包括自编函数、转换数据类型或归一化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MATLAB图像处理工具包中的im2bw函数和imbinarize函数均可以实现灰度图像的二值化功能,且在MATLAB R2018a之后推荐使用imbinarize。但两者在内部处理图像的时候具有一些较为隐晦的预设,尤其是在图像的灰度级范围与图像像素存储的数据类型所具有的数值范围不同时,可能会出现一些预料外的输出。

源码解析

im2bw

im2bw涉及到阈值的源码如下:

range = getrangefromclass(A);

if isinteger(A)
  BWp = (A > range(2) *level);

elseif islogical(A)
  %A is already a binary image and does not require thresholding
  warning(message('images:im2bw:binaryInput'))
  BWp = A;
else % double or single
  BWp = (A > level);
end

其中,A是输入图像,BWp是输出的二值化图像,level为输入的给定二值化阈值(归一化至[0,1])。可以发现,im2bw函数在图像输入类型为整形的情况下,认为图像的灰度级为[0,A数据类型所能存储的最大值],并将level乘以A数据类型所能存储的最大值作为阈值进行二值化。而在其他数据类型的图像输入时则直接以level作为阈值进行二值化。

imbinarize

imbinarize涉及到阈值的源码如下:

function BW = binarize(I,T)

classrange = getrangefromclass(I);

switch class(I)
    case {'uint8','uint16','uint32'}
        BW = I > T*classrange(2);
        
    case {'int8','int16','int32'}
        BW = I > classrange(1) + (classrange(2)-classrange(1))*T;
        
    case {'single','double'}
        BW = I > T;
end

end

其中,I是输入图像,BW是输出的二值化图像,T为输入的给定二值化阈值(归一化至[0,1])。与im2bw不同的是,其对整形和无符号整型进行了区分,其他细节基本相同。在无符号整形时,其仍然认为图像的灰度级为[0,I数据类型所能存储的最大值],并将T乘以I数据类型所能存储的最大值作为阈值进行二值化。

问题

若图像以整形存储,但其灰度级范围并与该数据类型的数值范围不一致(例如图像的灰度级范围为0~128,但图像以uint8存储,数值范围为0~255,与灰度级范围不一致),则可能出现错误的二值化输出,即函数对图像进行二值化的阈值并不是我们期望的阈值

解决方法

目前没有完美的解决办法,暂时想到的几种解决办法如下:

  1. 由于图像二值化的操作较为简单,对灰度级范围并与该数据类型的数值范围不一致的情况可以考虑自行编写函数进行二值化。

  1. 将图像数据类型强制转化为double或float,并采用图像灰度值中位数作为阈值输入,强行使程序进入case {'single','double'} BW = I > T;分支。

  1. 将图像转化为double或float类型后,将其归一化至[0,1]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值