灰度值阈值设置matlab,基本全局阈值法(basic global thresholding)MATLAB实现

基本全局阈值分割步骤如下:

(1)设定参数

ea0c2d7b7681da467b8ff73d69d0bc94.png,并选择一个初始的估计阈值

51f427b212dac1a4dfff57f0ec11cad7.png

(2)用阈值

76a4b8939cb4d4ad4a6d90487c503425.png分割图像。将图像分成两部分:

05378bf1119dca5cabf27fea6ddf2e53.png是由灰度值大于

51f427b212dac1a4dfff57f0ec11cad7.png的像素组成,

6e721ef3edf467acea29d33d1558b0d0.png是由灰度值小于或等于

51f427b212dac1a4dfff57f0ec11cad7.png的像素组成。

(3)计算

05378bf1119dca5cabf27fea6ddf2e53.png

6e721ef3edf467acea29d33d1558b0d0.png中所有像素的平均灰度值

07e8c31c08e026c39d2098311f02c557.png

26ddbf0c1fd628989e9dfd7b571d7b3e.png,以及新的阈值

e33471bf3ed4192a545437b90b09a7c0.png

(4)如果

ec1c509c71fea714c88d6245f9061c95.png,则推出

778817460a86de1751991744d29ab6d0.png即为最优阈值;否则,将

4dedc710507192bdfc469af203ad1661.png赋值给

e27ec5cf99baf96f6a31751bb136e5d4.png,并重复步骤(2)~(4),直到获取最优阈值。

其具体实现MATLAB代码如下:

%image_bgt.m

function level =image_bgt(I)

%该函数使用basic global thresholding算法实现二值化

I = im2double(I);          %对图像归一化

[M,N] = size(I);

T0 = 0.001;           %设置门限

T1 = (max(max(I)) +min(min(I)))/2;          %得到初始阈值T1

%定义G1、G2的下标,同时起统计个数的作用

columns1 = 1;

columns2 = 1;

%开始遍历

while 1

for i = 1:M

for j = 1:N

if I(i,j)>T1

G1(columns1) = I(i,j);          %得到分组G1

columns1 = columns1 + 1;

else

G2(columns2) = I(i,j);          %得到分组G2

columns2 = columns2 + 1;

end

end

end

%计算G1、G2均值

ave1 = mean(G1);

ave2 = mean(G2);

T2 = (ave1 + ave2)/2;           %得到新阈值T2

if abs(T2 - T1)break;

end

T1 = T2;

columns1 = 1;

columns2 = 1;

end

level = T2;

end

%DIP_exp4_2.m

%该m文件调用image_bgt函数对图像进行basic global thresholding算法阈值分割

clc;clear;closeall;

I =imread('cameraman.tif');

level =image_bgt(I);            %得到basic global thresholding算法阈值

J = im2bw(I,level);                    %实现图像二值化,即非黑即白

subplot(121),imshow(I);title('原图像');

subplot(122),imshow(J);title('basicglobal thresholding后图像');

运行DIP_exp4_2.m文件得结果如下:

ad6708e694faf8fcf387d1c75da85c4d.png

好的,我会尽力回答。以下是基于迭代阈值实现图像分割的 MATLAB 代码。 ```matlab function [output_img, threshold] = iterative_thresholding(input_img, init_threshold, max_iter, tolerance) % input_img: 输入的灰度图像 % init_threshold: 初始化阈值 % max_iter: 最大迭代次数 % tolerance: 容忍误差 % 获取图像大小 [height, width] = size(input_img); % 初始化阈值和误差 threshold = init_threshold; old_threshold = 0; error = Inf; % 迭代计数器 iter = 0; % 迭代直到误差小于容忍误差或达到最大迭代次数 while abs(threshold - old_threshold) > tolerance && iter < max_iter % 记录旧阈值 old_threshold = threshold; % 计算两个区域的平均灰度值 region1 = input_img(input_img < threshold); mean1 = mean(region1); region2 = input_img(input_img >= threshold); mean2 = mean(region2); % 计算新的阈值 threshold = (mean1 + mean2) / 2; % 计算误差 error = abs(threshold - old_threshold); % 更新迭代次数 iter = iter + 1; end % 将像素值大于等于阈值的像素标记为白色,其余像素标记为黑色 output_img = input_img >= threshold; output_img = uint8(output_img) * 255; end ``` 使用方: 1. 调用 `iterative_thresholding` 函数,传入输入图像、初始化阈值、最大迭代次数和容忍误差。 2. 函数返回二值图像和最终阈值。 3. 可以使用 `imshow` 函数显示二值图像。 例如: ```matlab % 读取图像 input_img = imread('test.jpg'); % 灰度化 input_img = rgb2gray(input_img); % 初始化阈值为 128 init_threshold = 128; % 最大迭代次数为 10 max_iter = 10; % 容忍误差为 0.1 tolerance = 0.1; % 基于迭代阈值进行图像分割 [output_img, threshold] = iterative_thresholding(input_img, init_threshold, max_iter, tolerance); % 显示二值图像 imshow(output_img); ``` 希望这个代码能够帮到你,如果还有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值