图像的阈值处理

article/2025/9/19 13:31:49

一般情况下,一张图片分为前景和背景,我们感兴趣的一般的是前景部分,所以我们一般使用阈值将前景和背景分割开来,使我们感兴趣的图像的像素值为1,不感兴趣的我0,有时一张图我们会有几个不同的感兴趣区域(不在同一个灰度区域),这时我们可以用多个阈值进行分割,这就是阈值处理。

单个阈值:

两个阈值:

示意图如下:

1.基本全局阈值处理

一般选取阈值就是图像直方图的视觉检测。将区分度大的两个灰度级部分之间进行划分,取T为阈值来分开它们。在此基础上学习一种自动地选择阈值的算法,方法如下:

针对全局阈值选择初始估计值T;

用T分割图像,G1是所有灰度值大于T的像素组成,G2是所有灰度值小于等于T的像素组成;

分别计算G1和G2区域内的平均灰度值m1和m2;

计算出新的阈值,取他们的m1和m2平均值数;

重复步骤2.-4.,直到在连续的重复中,T的差异比预先设定的参数小为止;

使用函数im2bw分割图像:g = im2bw(f,T/den)

代码如下:

clc        %清除命令窗口的内容
close all  %关闭所有的Figure窗口
clear all  %清除工作空间的所有变量origin_ima=imread('Fig.tif');
hist1=imhist(origin_ima);
[seg_ima,T]=Global_threshold(origin_ima,2);
hist2=imhist(seg_ima);subplot(2,2,1);imshow(origin_ima);title('原图像');
subplot(2,2,2);stem(hist1,'.');title('原图直方图');
subplot(2,2,3);imshow(seg_ima);title('全局分割图像');
subplot(2,2,4);stem(hist2,'.');title('全局分割图像直方图');uint8(T)%% 全局阈值分割函数,det_T0为迭代控制参数
function [Result,T0] = Global_threshold(ima,det_T0)
[m,n]=size(ima);
Result = zeros(m,n);value=0;
for x=1:mfor y=1:nvalue=value+double(ima(x,y));end
end
T0=value/(m*n); det_T = T0;while(det_T>det_T0)G1=0;G2=0;count1=0;count2=0;for x=1:mfor y=1:nif(ima(x,y)>T0)G1=G1+double(ima(x,y));count1=count1+1;elseG2=G2+double(ima(x,y));count2=count2+1;endendendm1=G1/count1; m2=G2/count2;T=1/2*(m1+m2);det_T=T-T0; T0=T;
endfor x=1:mfor y=1:nif(ima(x,y)>T0)Result(x,y)=1;endend
end
end

实验结果:  

        本实验是全局阈值是指整幅图像使用同一个阈值做分割处理,适用于背景和前景有明显对比的图像。它是根据整幅图像确定的:T=T(f)。但是这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。从图可以看出,经处理的图像所处的位置以偏离原先位置。虽然两者处理显示的图像形状虽然一致,但是目标图像所在的位置不一致,自动全局阈值化的结果与原始图像一致,而最优阈值化处理结果偏离原始图像。可以看出经阈值处理的图像更加清晰,物体和背景间的分割相当有效。

2.使用Otsu’s方法的最佳全局阈值处理

Otsu’s方法的最佳方法是选择阈值k,最大类间方差σ2(k)来定义的:

当设置的方差越大,则完全分割一幅图像的阈值就会越接近。公式中的k就是我们所要寻找的最佳阈值,当k不唯一时,则将所有的最佳阈值进行取平均值即可。

代码如下:

clc        %清除命令窗口的内容
close all  %关闭所有的Figure窗口
clear all  %清除工作空间的所有变量origin_ima=imread('Fig.tif');
hist1=imhist(origin_ima);p=Histogram(origin_ima);
[seg_ima1,T]=Global_threshold(origin_ima,2);[seg_ima,T] = Optimal_threshold(origin_ima,p);
hist2=imhist(seg_ima);subplot(2,2,1);imshow(origin_ima);title('原图像');
subplot(2,2,2);stem(hist1,'.');title('原图直方图');
subplot(2,2,3);imshow(seg_ima1);title('全局分割图像');
subplot(2,2,4);imshow(seg_ima);title('Otsu方法分割图像');T%% 计算图像概率直方图
function p = Histogram(ima)
[m,n]=size(ima);
p=zeros(256,1);
for x=1:mfor y=1:np(ima(x,y)+1)=double( p(ima(x,y)+1)+1 );end
end
p=p/(m*n);
end%% 进行最优阈值分割,输入原图像和概率直方图,返回分割图像和最优阈值
function [seg_ima,T] = Optimal_threshold(ima,p)mG=0;
for k=0:255mG = mG + k*p(k+1);
endP1=zeros(256,1);
for k=0:255for j=0:kP1(k+1) = P1(k+1)+p(j+1);end
endm=zeros(256,1);
for k=0:255for j=0:km(k+1) = m(k+1)+j*p(j+1);end
endvar=zeros(256,1);
for k=1:256var(k) = ( mG*P1(k)-m(k) )^2 / ( P1(k)*(1-P1(k)));
endmax=0;count=0;T=0;
for k=1:256if(var(k))>maxmax=var(k);end
endfor k=1:256if(var(k))==maxcount=count+1;T=T+k-1;end
end
T=T/count;[a,b]=size(ima);
seg_ima=zeros(256);
for x=1:afor y=1:bif(ima(x,y)>T)seg_ima(x,y)=1;endend
end
end%% 全局阈值分割函数,det_T0为迭代控制参数
function [Result,T0] = Global_threshold(ima,det_T0)
[m,n]=size(ima);
Result = zeros(m,n);value=0;
for x=1:mfor y=1:nvalue=value+double(ima(x,y));end
end
T0=value/(m*n); det_T = T0;while(det_T>det_T0)G1=0;G2=0;count1=0;count2=0;for x=1:mfor y=1:nif(ima(x,y)>T0)G1=G1+double(ima(x,y));count1=count1+1;elseG2=G2+double(ima(x,y));count2=count2+1;endendendm1=G1/count1; m2=G2/count2;T=1/2*(m1+m2);det_T=T-T0; T0=T;
endfor x=1:mfor y=1:nif(ima(x,y)>T0)Result(x,y)=1;endend
end
end

实验结果: 

        Otsu’s方法的最佳方法是选择阈值k,当设置的方差越大,则完全分割一幅图像的阈值就会越接近。公式中的k就是我们所要寻找的最佳阈值,当k不唯一时,则将所有的最佳阈值进行取平均值即可。

        可以看出,用基本全局阈值处理时细胞的分割效果并不是很好,没有能够分割清楚,是由于前景和背景的灰度级比较相近而不能够完全分离开,因此当使用了Otsu算法进行分割时,可以完全将前景和背景分割开来。尽管分离度的度量值比较低,但是还是可以准确地从背景中提取细胞。


http://chatgpt.dhexx.cn/article/A34k36px.shtml

相关文章

神经网络阈值是什么意思,神经网络的权值和阈值

神经网络权值怎么确定? 神经网络的权值是通过对网络的训练得到的。如果使用MATLAB的话不要自己设定,newff之后会自动赋值。也可以手动:{};{}。一般来说输入归一化,那么w和b取0-1的随机数就行。 神经网络的权值确定的目的是为了让…

opencv c++ 二值图像、阈值计算方法、全局阈值、自适应阈值

1、图像定义: 彩色图像 :三通道,像素值一般为0~255; 灰度图像:单通道,像素值一般为0~255; 二值图像:单通道,像素值一般为0(黑色)、255&#xff08…

图像分割 - 阈值处理 - 全局阈值处理

目录 1. 介绍 2. 代码实现 3. 代码讲解 1. 介绍 当目标和背景像素的灰度分布非常不同的时候,可以对整个图像使用全局阈值 在大多数的应用中,图像之间通常存在足够的变化,全局阈值是一种合适的办法。所以,需要一种对图像做阈值…

硬阈值 软阈值

1 定义 1.1 硬阈值 硬阈值的定义如下: 相当于 1.2 软阈值 软阈值的定义如下: 相当于 1.3 二者对比(可视化解释) 这是一张很经典地表述软阈值和硬阈值区别的图,其中软阈值是蓝色的线,他没有突变&#xff1…

神经网络阈值是什么意思,神经网络阈值怎么设置

BP神经网络中初始权值和阈值的设定 1、首先需要了解BP神经网络是一种多层前馈网络。2、以看一下在matlab中BP神经网络的训练函数,有梯度下降法traingd,弹性梯度下降法trainrp,自适应lr梯度下降法traingda等。 3、在matlab中命令行窗口中定义输入P&…

图像处理--阈值处理

图像二值化 图像二值化就是将图像上的像素点的灰度值设置为两个值,一般为0(表示黑色)和255(表示白色),可以将整个图像呈现出明显的黑白效果。 最常用的方法就是先将图像灰度处理,然后设定一个阈…

两种划分阈值的方法

风险等级划分的时候可以降低主观性的一些系统方法 方法一:分层聚类法 凝聚层次聚类/分裂层次聚类 重点:确定层次聚类的簇数,画出树状图,基本就能得到你的区间范围,但数据量大的时候还是得再用代码跑 方法二&#xf…

“阀值”与“阈值”的区别

真相请看下图红色框里内容(手动微笑) 啥??你跟我说没看懂,好吧,说的再明白点,“阀(f)值”是一个错误的用词,其正确用法是“阈(y)值”。…

【p116】

#查询score表中为196004,课程号为1201的学生成绩 #查询student表中姓周的学生情况 #查询数学成绩第2~5名的信息 #查询通信专业最高分的学生的情况 #查询1004课程的最高分,最低分,平均成绩 #查询至少有3名学生选修且以4开头的课程号和平均分数 #将计算机专…

《JDK学习》使用JDK的keytool生成p12证书

由于前段时间在研究itext技术中的签章技术中遇到了数字签名的问题,需要用到p12证书,因此就撰写一篇用我们jdk自带的keytool 工具生成p12证书的方法供各位交流。 keytool 简介 keytool 是java 用于管理密钥和证书的工具. 其功能包括: 创建并管…

日志 P11,P12

日志: 复制一个04.内容与03是一样的. 标准日志文件: 在mybatis-config.xml中写入setting设置,配置日志文件(注意setting只能放在properties与typeAliases的中间)。 setting中参数的内容可以在mybatis官方文档查找。…

xcode ios 怎么导入p12证书

注意:在哪台电脑上生成的根证书才能在哪台电脑上导出p12,在另外的电脑上是没有导出p12的选项的(或者是灰的点不了) 1.双击p12文件,将其导入到钥匙串,或者直接把p12文件拖入到钥匙串里 2.如下图,…

iOS证书(.p12)和描述文件(.mobileprovision)申请

原文链接 : iOS证书(.p12)和描述文件(.mobileprovision)申请 如果你从事过iOS开发,大概都会了解到iOS有两种证书和描述文件: 证书类型使用场景开发(Development)证书和描述文件用于开发测试,在 HBuilderX 中打包后可在真机环境调试发布(Dist…

java工具keytool生成p12数字证书文件

最近做毕设的时候需要用到数字证书,于是就用java来生成 Keytool是用于管理和证书的工具,位于%JAVA_HOME%/bin目录** 首选找到keytool.exe 然后在上面的路径显示框中输入CMD,然后回车 进入后输入以下代码 keytool -genkeypair -alias serv…

P12:Sequential的使用

1、CIFAR10 model的结构: 2、定义网络: class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.conv1 Conv2d(3, 32, 5, stride1, padding2)self.maxpool1 MaxPool2d(kernel_size2)self.conv2 Conv2d(32, 32, kernel_size5,…

仅使用p12文件和mobileprovision文件打包

前言:iOS发展到现在,必须使用开发者账号才能运行,打包;但有时候跟别人合作开发,别人不会把开发者账号密码给你,只给了一个P12证书和mobileprovision描述文件(如下图) 我们需要利用这两个文件打包。 1.双击…

P12 JWindow 窗口

P12 JWindow 窗口 1.概述2.JWindow 代码实例3.效果演示4.实现鼠标拖动 JWindow 窗口5.效果演示 系统:Win10 Java:1.8.0_333 IDEA:2020.3.4 Gitee:https://gitee.com/lijinjiang01/JavaSwing 1.概述 JWindow:一个容器&…

p12文件和provision profile文件作用

一:p12 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了 一般在我们的证书界面中应该只有一个开发证书…

职级P1到P12等级体系详解

人力资源管理中,职级是一项非常重要的概念,对于企业的薪资管理、晋升制度以及人才培养都有着至关重要的作用。而职级p1到p12则是常见的职级等级体系。 一、职级的含义 职级是指职位在企业内部的等级,通常是按照工作职责、技能要求、工作经验…