demo:图像处理 matlab实现迭代法全局阈值分割和局部自适应阈值分割

2023-05-16

全局阈值分割

迭代法阈值获取方法:
1)选取一个的初始估计值T(128);
2)用T分割图像。这样便会生成两组像素集合:G1由所有灰度值大于T的像素组成,而G2由所有灰度值小于或等于T的像素组成。
3)对G1和G2中所有像素计算平均灰度值u1和u2。
4)计算新的阈值:T=1/2(u1 + u2)。
重复步骤(2)到(4),直到得到的T值之差小于一个事先定义的参数T0。

先导进来图片

I = imread('rice.png');
[width,height] = size(I);
T0 = 1;%设置门限
T1= 128; %初始阈值T1
%设置G1,G2两个列向量,各自统计<T和>T的值
gray_leval_1 = 1;
gray_leval_2 = 1;

matlab里没有do-while语句,所以用
while 1

break
代替

while 1
    for i = 1:width
        for j = 1:height
            if I(i,j)>T1
                G1(gray_leval_1) = I(i,j); %得到分组G1
                gray_leval_1 = gray_leval_1 + 1;
            else
                G2(gray_leval_2) = I(i,j); %得到分组G2
                gray_leval_2 = gray_leval_2 + 1;
            end
        end
    end
    %计算G1、G2均值
    avg1 = mean(G1);
    avg2 = mean(G2);
    T2 = (avg1 + avg2)/2;
    if abs(T2 - T1)<T0 
        break;
    end
    T1 = T2;
    gray_leval_1 = 1;
    gray_leval_2 = 1;
end
T1
T1=uint8(T1);

T1=130.7
然后画出来

for i=1:width
    for j=1:height
        if(I(i,j)<T1)
            BW1(i,j)=0;
        else 
            BW1(i,j)=1;
        end
    end
end
subplot(1,3,1);imshow(I)
subplot(1,3,2);imshow(BW1);title('阈值分割');

matlab自带的Otus阈值分割方法

T3=graythresh(I)
BW2=imbinarize(I,T3);%Otus阈值分割
subplot(1,3,3);imshow(BW2);title('Otus阈值分割');

I=130.9,差不多哈。
结果
在这里插入图片描述

这个阈值分割方法存在偏差,如果两个峰值数目相差越多,偏差越大
(假设第一次迭代前,T在正确位置,很容易看出来,随着迭代进行,越来越偏离)
在这里插入图片描述
计算的T=93,目测值应该在110-120吧。

多说一句,图像处理,一定要double一下,否则可能出现问题。比如,我想把大米图的直方图暗部拉大(偏向0),以体现这种偏差,就用了个一次函数的变换,结果这样了

在这里插入图片描述

因为先乘k,结果>255的全归于255,以后全错。

自适应阈值分割

1)将整幅图像分成一系列互相之间有50%重叠的子图像;
2)做出每个子图像的直方图;
3)检测各个子图像的直方图是否为双峰,如果是,则采用最佳阈值法确定一个阈值,否则就不进行处理;
4)根据对直方图为双峰的子图像得到的阈值通过插值得到所有子图像(像素点)的阈值。
仨坑
1、怎么割图像啊(这个还好吧,也不算割,设置好步长来就行了)
2、怎么检测单峰还是双峰啊,单峰的话,空缺imresize是不行的。
3、怎么插值啊(主要是老师上课讲的太玄学,按照距离加权,四点平均,把相距很远的点内部全部插满,听懵了。后来想到,matlab直接imresize啊!然后就码下来啦)
1、分割方式设置好矩形大小和步长就行
2、峰值个数没写,matlab统计工具箱里好像有正态拟合图像,而不是plot()这种拟合,plot拟合只是画的圆滑了些还是很多局部峰值
在这里插入图片描述
3、插值方式采用了imresize函数
A=imresize(I,2,‘nearest’);%最近邻插值
B=imresize(I,2,‘bilinear’);%双线性
C=imresize(I,2,‘bicubic’);%双三次

I=imread('rice.png');
T=zeros(15);
for i=0:14
    for j=0:14
        img = imcrop(I,[1+i*16 1+j*16 31 31]);%内核32*32,步长设置为16
        t=255*graythresh(img);%我这里直接用了
        T(j+1,i+1)=t;%这里注意坐标顺序反着
    end
end
T=uint8(T);
T1=imresize(T,[256 256],'bilinear');%看了下貌似双线性插值最好
%%
for i=1:256
    for j=1:256
        if (I(i,j)<T1(i,j))
            BW(i,j)=0;
        else
            BW(i,j)=1;
        end
    end
end
imshow(BW)

有一个地方要注意,图像[i,j],矩阵得是[j,i]。

阈值图像:
在这里插入图片描述
底部更暗,所以阈值也更低才能滤完整
阈值分割结果
在这里插入图片描述
嗯,上部噪声少了,下部也更完整了
然后试了下这位兄弟博客的图片
这老哥跑的OPENCV中自带的函数,效果一级棒(怎么看着像边缘检测)
我这个…毕竟没字的地方有黑背景有白背景,一加权,也没法搞,不过还阔以吧
在这里插入图片描述

matlab中自带的阈值分割,对大米图还行。全局阈值分割底部大米都割残了,这个方法完整,可是,这跟局部有关系?貌似先调了调灰度,就好分割了

 I=imread('rice.png');
 I=im2double(I);
se=strel('disk',10);%se.Neighborhood:10*10圆盘
ft=imtophat(I,se);% 高帽变换
gt=uint8(255*ft);
Th=graythresh(ft);                       
G=imbinarize(ft,Th);%阈值分割                       
figure,imshow(G),title('局部阈值');

在这里插入图片描述

Otsu算法

matlab自带的阈值分割方法
参考动态阈值–大津法和基于Otsu算法的图像自适应阈值分割,重新打了一下
调用:

[counts x] = imhist(img);
[m n] = size(img);
BW1 = otsu(counts, m*n);
第一个元素为直方图,第二个元素为图片大小
或者:
T=graythresh(I)
BW2=imbinarize(I,T);

原理:
在这里插入图片描述

在这里插入图片描述
让T遍历所有灰度值,找到g的最大值
代码:

function level = otsu(histogramCounts, total)%histogramCounts是图像的直方图, total图像的总像素数
sum0 = 0;
w0 = 0;%像素个数
maximum = 0.0;%保存T的最大值
total_value = sum((0:255).*histogramCounts');
for ii=1:256
    w0 = w0 + histogramCounts(ii);%<T像素个数累加
    if (w0 == 0)
        continue;
    end
    w1 = total - w0;
    if (w1 == 0)%遍历结束>T像素=0
        break;
    end
    sum0 = sum0 +  (ii-1) * histogramCounts(ii);%灰度和
    m0 = sum0 / w0;%平局灰度u0
    m1 = (total_value - sum0) / w1;%平局灰度u1
    icv = w0 * w1 * (m0 - m1) * (m0 - m1);
    if ( icv >= maximum )
        level = ii;
        maximum = icv;
    end
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

demo:图像处理 matlab实现迭代法全局阈值分割和局部自适应阈值分割 的相关文章

  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • ros功能包安装

    正确指令 xff1a sudo apt get install ros kinetic dwa local planner 以后安装安装包 xff0c 用sudo apt get install ros kinetic 缺少的PACKAGE
  • vins-mono编译问题--rosrun launch问题

    launch is neither a launch file in package nor is a launch file name解决办法 cd catkin ws source devel setup bash catkin ws
  • 软件工程中的框架是什么?什么是框架?

    IT领域 软件工程中所说的框架是什么 xff1f 1 1 什么是框架 xff1f 软件框架 xff08 software framework xff09 的标准定义 xff1a 通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范
  • Docker容器中远程连接实现GUI图形显示的配置方法

    1 输入xhost 43 没有问题的话会提示 access control disabled clients can connect from any host 2 使用echo DISPLAY查看本地显示器localhost 会打印结果
  • HAL库 串口收发函数解析

    一 UART Receive IT 对于CubeMX生成的代码 xff0c USART1 IRQHandler void 函数为了提高中断效率采用了回调机制 xff08 业务代码可以等中断关闭了再去处理 xff0c 这样中断处理不会占用太多
  • c++调用python

    在我们的生活中 xff0c 如果我们想调用其他程序的话 xff0c 往往会需要一些额外的代码 xff0c 比如说我们要调用 python去执行某些函数 在我们使用 python的过程中 xff0c 为了能够调用其他程序 xff0c 我们往往
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • 关于自制openmv的一些建议

    从接触到openmv开始一直都想制作一块自己的openmv xff0c 包括从硬件 xff0c 到烧录程序 最开始制作的版本是openmv3 xff0c 其实openmv3并不是属于自己制作 xff0c 而是下载的硬件电路城开源的openm
  • vue3创建文件报“组件名称应该总是由多个单词组成“Component name “index“ should always be multi-word

    在项目根目录下的 eslintrc js 文件中添加 vue multi word component names off 没有该文件就创建一个 module span class token punctuation span export
  • STM32和ARM的区别?

    下面先看一张图 xff1a 这张图是我在意大利与法国合资的意法半导体公司 xff08 ST xff0c 世界几大半导体公司之一 xff09 的官网上看到的 这说明 xff0c STM32是意法半导体公司的产品 意法半导体 xff08 ST
  • OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

    OrangePi5 Docker下安装OpenWRT作软路由 xff08 同样适用于树莓派等设备 xff09 说明 本文的软路由作为家中的二级路由 xff0c 用一根网线连接主路由的LAN口和二级路由的WAN口 xff08 当主路由使用配置
  • kubernetes-----k8s入门详解

    目录 docker的编排工具 k8s的介绍 k8s的特性 pod的分类 service 网络 通信 认证与存储 插件 docker的编排工具 docker的第一类编排工具 xff08 docker三剑客 xff09 docker compo
  • ROS机械臂开发:Moveit + Gazebo仿真/Gazebo配置

    一 ROS中的控制器插件 ros control的功能 xff1a ROS为开发者提供的机器人控制中间件 包含一系列控制器接口 传动装置接口 硬件接口 控制器工具箱等等 可以帮助机器人应用功能包快速落地 xff0c 提高开发效率 ros c
  • 匿名飞控openmv寻色块解读

    作者 xff1a 不会写代码的菜鸟 时间 xff1a 2019 7 26 源码 xff1a 匿名TI板飞控源码 43 openmvH4 说明 xff1a 限于本人水平有限 xff0c 并不能写的很详细 xff0c 还望各位能够补充
  • 校验和的计算方法

    实验要求 编写一个计算机程序用来计算一个文件的16位效验和 最快速的方法是用一个32位的整数来存放这个和 记住要处理进位 xff08 例如 xff0c 超过16位的那些位 xff09 xff0c 把它们加到效验和中 要求 xff1a 1 x
  • MT7621路由器芯片/处理器参数介绍

    MT7621路由器芯片包括一个880 MHz MIPS 1004Kc CPU双核 xff0c 一个5端口10 100 1000交换机 PHY和一个RGMII 嵌入式高性能cpu可以很容易地处理高级应用程序 如路由 安全和VoIP等 MT76
  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont
  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在
  • u-boot的启动模式(面试常考)

    交互模式 uboot启动之后 xff0c 在倒计时减到0之前按任意键 xff0c uboot会进入到交互模式 xff0c 此时可以输入各种uboot命令 和uboot进行交互 自启动模式 uboot启动之后 xff0c 在倒计时减到0之前不

随机推荐

  • vins-fusion代码理解

    代码通读了一遍做些总结 xff0c 肯定有很多理解错了的地方 xff0c 清晰起见详细程序都放到引用链接里 从rosNodeTest cpp开始 main函数 ros span class token operator span span
  • vins博客的一部分1

    文章目录 imu callbackimg callback imu callback 从话题中读入各个数据的t x y z g y r xff0c 存放到acc和gry中 span class token comment 从话题读入 spa
  • vins博客的一部分2

    sync process 对两个imgBuf里的图像进行双目时间匹配 xff08 通过判断双目图像时间之差 lt 3ms xff09 xff0c 扔掉匹配不到的老帧 span class token keyword double span
  • vins博客的一部分3

    FeatureTracker trackImage 包含了 xff1a 帧间光流法 区域mask 检测特征点 左右目光流法匹配 计算像素速度 画图 跟踪上一帧的特征点 如果已经有特征点 xff0c 就直接进行LK追踪 xff0c 新的特征点
  • vins博客的一部分4

    processMeasurements 取出数据 将 featureBuf中 xff0c 最早帧的feature取出 xff1a feature 61 featureBuf front 节点的接收IMU的消息再imu callback中被放
  • vins博客的一部分5

    目录 initFirstIMUPose xff08 xff09 processIMU propagate initFirstIMUPose xff08 xff09 得到IUM的Z与重力对齐的旋转矩阵 xff1a IMU开始很大可能不是水平放
  • vins博客的一部分6

    processImage 输入是本帧的特征点 id cam id xyz uv vxvy 包含了检测关键帧 估计外部参数 初始化 状态估计 划窗等等 检测关键帧 选择margin帧 addFeatureCheckParallax 检测和上一
  • vins博客的一部分7

    目录 initFramePoseByPnP frame count Ps Rs tic ric triangulate frame count Ps Rs tic ric initFramePoseByPnP frame count Ps
  • vins博客的一部分8

    目录 optimization slideWindow optimization 优化先验残差 重投影残差 预积分残差 xff08 即要拟合的目标是 xff0c 之前边缘化后的先验值 xff0c 前后帧之间的IMU的预积分值 xff0c 每
  • 以下为WindowsNT下32位 C++程序,请计算sizeof的值

    转帖地址 xff1a http hi baidu com hikeba blog item 68ad9f10a7dd8003213f2ecf html char str 61 34 hello 34 char p1 61 str int n
  • vins博客的一部分9

    目录 IMUFactor xff08 imu约束 xff09 ProjectionTwoFrameOneCamFactor xff08 视觉约束 xff09 marginalize 边缘化约束 IMUFactor xff08 imu约束 x
  • fiesta论文翻译和代码

    论文 体素信息结构 VIS Namemean符号position体素坐标posoccupancy占用概率occESDF到最近障碍物的欧几里得距离disClosest Obstacle Coordinate最近障碍物的体素坐标cocobser
  • ROS中四元数、欧拉角、旋转矩阵等格式转换

    未完 ROS接收到odometry格式消息 xff1a nav msgs span class token operator span Odometry pos msg 具有 xff1a pos msg span class token p
  • lio-sam中雅克比推导

    lio sam做的是scan map xff0c 点变到世界系下 xff0c 优化本帧在是世界系下的位姿 xff0c 和loam有所不同 符号 xff1a 本帧特征点云 xff08 相对机体系 xff09 P s c a
  • Xavier瑞泰载板烧录系统与CUDA环境安装

    实验室瑞泰载板的Xavier刷机过程 xff0c 不可用nvidia官方刷机方法 xff0c 以下部分基本和瑞泰教程类似 xff1a 下载文件 下载前 xff0c 需要注意版本对应关系 xff0c 这里安装L4T 32 4 3 和 JetP
  • xavier nx 安装realsense

    1 安装realsense viewer git clone https github com jetsonhacks installRealSenseSDK cd installRealSenseSDK sudo installLibre
  • 【草稿】已有ubuntu,安装win10遇到的问题记录

    磁盘分区 xff1a 把 home拆分一块安装win10 xff0c 需要在临时系统中分区 xff0c 不然已经挂载的磁盘会带锁 xff0c 没法拆分卷 xff1a 使用ubuntu启动盘启动系统 xff0c try Ubuntu with
  • 欧拉角顺序与转换

    更多转换见 xff1a 基于eigen实现 基于python实现 这里就记录下顺序 xff1a 运算是左乘 xff0c 下面方式记作Z Y X顺序 xff0c 先绕x轴roll 再绕y轴pitch 最后绕z轴yaw xff0c 即为RPY
  • ubuntu20.04 python pycharm使用cv_bridge的问题

    1 终端python运行下面会报错 xff1a from cv bridge boost cv bridge boost import getCvType ImportError lib libgdal so 26 undefined sy
  • demo:图像处理 matlab实现迭代法全局阈值分割和局部自适应阈值分割

    全局阈值分割 迭代法阈值获取方法 xff1a 1 xff09 选取一个的初始估计值T xff08 128 xff1b 2 xff09 用T分割图像 这样便会生成两组像素集合 xff1a G1由所有灰度值大于T的像素组成 xff0c 而G2由