matlab全局阈值ostu,Otsu的全局阈值处理实现

本文介绍了一种新的图像分割方法,通过结合像素的灰度信息和非局部空间灰度信息,构建二维直方图,并将其应用于Otsu阈值分割,以减少噪声影响,实现更平稳的前景和背景分离。通过实例展示了这种方法在ImageEngineering与ComputerVision领域的应用和效果。
摘要由CSDN通过智能技术生成

基本介绍

为了克服图像噪声对图像分割结果的影响,利用图像中与像素具有相似邻域结构的像素提取当前像素的非局部空间信息,构造了基于像素的灰度信息和非局部空间灰度信息的二维直方图,并将此二维直方图引入到Otsu曲线阈值分割法中,提出了基于灰度和非局部空间灰度特征的二维Otsu曲线阈值分割法。最小时即为分割的最佳阈值(minimizes the weight  within class variance. ) 这个就意味着当取阀值为t时,前景和背景的方差加权和最小,即前景和背景每部分的像素都比较平稳。

参考代码

function th=thresh_md(a);

x=imread(a);

a=rgb2gray(x);

subplot(211);

imshow(a,[]);

[m,n]=size(a);

N=m*n;

L=256;

for i=1:L

count(i)=length(find(a==(i-1)));

f(i)=count(i)/(N);

end

for i=1:L

if count(i)~=0

st=i-1;

break;

end

end

for i=L:-1:1

if count(i)~=0

nd=i-1;

break;

end

end

p=st; q=nd-st;

u=0;

for i=1:q

u=u+f(i)*(p+i-1);

ua(i)=u;

end;

for i=1:q

w(i)=sum(f(1:i));

end;

w=w+0.0001;

d=(u*w-ua).^2./(w.*(1-w));

[y,tp]=max(d);

th=tp+p;

for i=1:m

for j=1:n

if a(i,j)>th

a(i,j)=0;

else

a(i,j)=255;

end

end

end

subplot(212);

imshow(a,[]);输出结果:

0818b9ca8b590ca3270a3433284dd417.png 

0818b9ca8b590ca3270a3433284dd417.png

关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,以下是一个基于二维最大类间法Otsu实现图像阈值分割的Matlab代码示例[^1]: ```matlab clear all; % 清除所有变量 close all; % 关闭所有figure clc; [filename,pathname]=uigetfile({'*.jpg;*.bmp;*.tif;*.png;*.gif','All Image Files';'*.*','All Files'}); tic; t1 = clock; % 读取图像 I = imread([pathname,filename]); % I = imread('F:\matlab2016\bin\pic\lena.jpg'); figure(); subplot(2,3,1); imshow(I),title('原图'); % 将图像转换为灰度图像 I_gray = rgb2gray(I); subplot(2,3,2); imshow(I_gray),title('灰度图'); % 计算图像的直方图 [counts,~] = imhist(I_gray); % 计算类间方差 total_pixels = numel(I_gray); class_variance = zeros(256,1); for k = 1:256 % 计算类间方差 w0 = sum(counts(1:k))/total_pixels; w1 = sum(counts(k+1:end))/total_pixels; u0 = sum((0:k-1)'.*counts(1:k))/sum(counts(1:k)); u1 = sum((k:255)'.*counts(k+1:end))/sum(counts(k+1:end)); class_variance(k) = w0*w1*(u0-u1)^2; end % 找到最大类间方差对应的阈值 threshold = find(class_variance == max(class_variance)) - 1; % 根据阈值进行图像分割 I_binary = imbinarize(I_gray, threshold/255); subplot(2,3,3); imshow(I_binary),title('二值化图'); % 显示分割结果 I_segmented = I; I_segmented(repmat(~I_binary, [1, 1, 3])) = 0; subplot(2,3,4); imshow(I_segmented),title('分割结果'); % 输出阈值 disp(['阈值为:', num2str(threshold)]); toc; t2 = clock; disp(['运行时间为:', num2str(etime(t2,t1)), '秒']); ``` 请注意,这只是一个示例代码,具体的实现可能会根据实际需求进行调整。此代码将图像转换为灰度图像,计算图像的直方图,然后根据最大类间方差找到阈值,并将图像根据阈值进行二值化分割。最后,显示原图、灰度图、二值化图和分割结果,并输出阈值和运行时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值