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 thresholdingwarning(message('images:im2bw:binaryInput'))BWp = A;
else % double or singleBWp = (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;
endend

其中,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]。

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

  1. 图像二值化 php im2bw,图像二值化-MATLAB实现

    1.图像二值化代码: A=imread('hw1.chips1.GIF'); %读取到一张图片 %thresh = graythresh(A); %自动确定二值化阈值 I2 = im2bw(A,120 ...

  2. MATLAB图像二值化

    还是老规矩先宣传一下QQ群群: 格子玻尔兹曼救星:293267908. 一切为了早日毕业. 听说可以在PPT作图然后用MATLAB二值化把复杂边界用01矩阵表达出来.上网看了下: I = imread ...

  3. opencv 二值化 matlab,opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  4. matlab 图像二值化 后0、1像素的个数统计

    目标: 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开) 统计二值化之后,各个黑白图像中0.1 的像素点数目 使用折线图的方式,展示出统计的结果 首先进行输入文件夹 与输 ...

  5. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...

  6. opencv 二值化 python_opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用...

    cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下: #ret:暂时就认为是设定的thresh阈值,mask:二值化的图像 ret,mask = cv2.threshold(i ...

  7. matlab 图像二值化_推荐:为图像处理初学者设计的100个问题(含python实现代码)...

    本文整理了图像处理初学者应该需要了解的100个基础问题,涉及读取.显示图像.操作像素.拷贝图像.保存图像.灰度化(Grayscale).二值化(Thresholding).大津算法.HSV 变换.减色 ...

  8. 【MATLAB】图像二值化(imbinarize函数)

    [MATLAB]图像二值化(imbinarize函数) 图像二值化在MATLAB 2019 版中提示:建议不要使用'im2bw'而改用'imbinarize'.所以特意总结im2bw和imbinari ...

  9. python将灰度图像二值化_python实现图像二值化

    1.什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色,二值化就是 ...

最新文章

  1. 冒泡排序 选择排序 快速排序(C语言)
  2. Codeforces 427 D. Match amp; Catch
  3. ppp协议pap验证过程状态转移图_硬核分享|Crust 核心协议栈的设计与实现
  4. Intent的一些用法
  5. 高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
  6. C++:类访问修饰符
  7. WordPress开发暗黑系列流量主收益高清壁纸小程序-可二开-无授权
  8. Dart基础-变量与类型
  9. java版本位数_java 如何查看jdk版本位数
  10. ACE admin 后台管理框架
  11. Python基础知识从hello world 开始(第一天)
  12. [渝粤教育] 天水师范学院 地理信息系统原理与方法 参考 资料
  13. 35岁老年程序员的绝地翻身之路
  14. mes系统和plc通讯案例_MES项目案例分享
  15. 栋的月结 | 第三回合(定期更新、动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇)[含泪总结.. 憋泪分享!]
  16. android模拟器没反应,Android模拟器无法正常工作
  17. Numpy基础(二)——数组转置、计算内积和换轴
  18. PostgreSQL 常用工具
  19. 把Excel批注的“红三角”放在单元格左上角_44个Excel使用技巧:怪不得同事表格类工作那么快完成,学以致用...
  20. 2021华为鸿蒙,2021华为鸿蒙系统什么时候上线 2021华为鸿蒙系统上线时间

热门文章

  1. 【PaddleOCR】一、PaddleOCR安装、测试(Win10)
  2. 洛谷P4394 [BOI2008]Elect 选举 题解
  3. 微信公众号 修改 应用签名 不生效
  4. 黄一老师:财商思维、信用融资能对你有什么帮助?
  5. LabVIEW使用POST调用有道翻译
  6. 【面试】小米公司嵌入式职位面试经验
  7. 输入、输出电阻与带负载能力的总结
  8. MATLAB——根轨迹原理及其Matlab绘制
  9. 无线充电宝当无线充电器哪个品牌好?快充无线充电宝推荐
  10. int型变量占多少个字节?