图像的阈值处理

news/2024/11/29 12:37:50/

一般情况下,一张图片分为前景和背景,我们感兴趣的一般的是前景部分,所以我们一般使用阈值将前景和背景分割开来,使我们感兴趣的图像的像素值为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://www.ppmy.cn/news/662984.html

相关文章

Python 图像处理教程:如何提高图像细节清晰度

Python 是一种广泛应用于图像处理的编程语言,它提供了丰富的图像处理库,例如 Pillow 和 OpenCV 等。在进行图像处理时,有时候我们需要提高图像的细节清晰度,以便更好地观察和分析图像。本教程将介绍一些 Python 图像处理技巧&…

数字图像处理——图像锐化

图像增强是图像处理的一个重要环节,早期的图像处理就是从图像增强开始的,人们研究对质量低的图像进行处理以获得改善质量后的图像。现今的图像增强还为后续的图像处理,如图像信息提取、图像识别等,提供更高识别度的图像。 从图像处理技术来看,图像的摄取、编码、传输和处理…

OpenCV图像处理----图片卷积

图片卷积 图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理&…

数字图像处理-基本知识总结

1、图像及图像处理概念 图像是使用各种传感器手段观测客观世界获得,可以直接或间接作用于人眼产生视觉的实体。主要包括: 1)各类图片,如可见光照片、X光片、遥感图片; 2)各类光学图片,如电视…

数字图像处理之图像模糊

图像模糊是数字图像处理过程中经常用到的,主要包括以下几个方面: 导入库 import numpy as np import matplotlib.pyplot as plt import cv2 as cv图片显示函数 def show(img):if img.ndim 2:plt.imshow(img,cmapgray)else:plt.imshow(cv.cvtColor(im…

【python】数字图像处理

目录 基本概念图像增强整体代码线性变换分段线性变换对数变换幂律变换直方图 图像滤波平滑图像锐化图像 基本概念 数字图像定义:对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴…

Python图像处理【1】图像与视频处理基础

图像与视频处理基础 0. 前言1. 在 3D 空间中显示 RGB 图像颜色通道1.1 图像表示1.2 在 3D 空间中绘制颜色通道 2. 使用 scikit-video 读/写视频文件2.1 scikit-video 库2.2 读/写视频文件2.3 提取视频文件属性2.4 读取并保存视频 3. 使用 OpenCV 从相机捕获实时视频4. 实现 Got…

图像智能处理黑科技,让图像处理信手拈来

图像智能处理黑科技,让图像处理信手拈来 0. 前言1. 图像智能处理简介2. 图像切边增强3. PS 检测4. 图像水印去除5. 图像矫正6. 图像去屏幕纹7. 调用图像智能处理 API小结 0. 前言 计算机视觉 (Computer Vision, CV) 通过研究如何令机器“看懂”世界,构建…