matlab 图像二值化 后0、1像素的个数统计

这篇博客介绍了如何使用MATLAB批量处理RGB图像,进行二值化处理,并统计每个图像中0和1像素点的数量。通过折线图展示了统计结果,便于观察图像的黑白像素分布。文章提供了完整的代码实现,包括文件路径定义、图像读取、二值化、像素统计和图像保存等步骤。
摘要由CSDN通过智能技术生成

目标:

  1. 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开)
  2. 统计二值化之后,各个黑白图像中0、1 的像素点数目
  3. 使用折线图的方式,展示出统计的结果

首先进行输入文件夹 与输出目标文件夹的路径定义:

input_path = 'E:\test1\';%输入图片文件夹路径
output_path = 'E:\test2\';%输出文件夹路径

批量读取输入文件夹中的图片,对其进行二值化的处理,并保存到目标文件夹

img_path_list = dir(strcat(input_path,'*.jpg'));
img_num = length(img_path_list); % 对应文件夹下.jpg类型图像的数目
if img_num > 0  % 如果文件夹中的图片数目大于0
    for j = 1:img_num
        image_name = img_path_list(j).name; % 利用索引j获取当前图像的文件名,该文件名不包含
        I = imread(strcat(input_path,image_name)); % 根据 路径名 + 文件名 读取图像
        I = rgb2gray(I); %orgb2gray 转换成灰度图
        threshold =  graythresh(I); % 设置二值化图片的阈值
        % threshold = 0.5; % 手动设置阈值
        bw = im2bw(I,threshold); % 根据阈值 对图片I进行二值化操作
        md_name = strcat('md', image_name);  % 修改后的文件名设置,此文件名,不包含路径的文件名
        saved_name = strcat(output_path, md_name); % 修改之后的图片的完整文件名: 路径名 + 文件名
        
        imwrite(bw, saved_name);%将处理后的图片保存到目标文件夹
        [M,N] = size(bw); % 图像大小 M N 表示图像的长和宽
        total(j) = M*N; % 第j个图像的总像素点数目
        zero = 0;  % 第j个图像的像素点为0 的数目
        one = 0; % 第j个图像的像素点为1 的数目
        for m=1:M
            for n=1:N
                if bw(m,n) > 0 % 此处使用二维矩阵的方式访问图像的某一个像素点, 如果对应的位置数值大于0,one 加1
                    one = one + 1;
                else % 如果对应的位置数值等于0,zero加1
                    zero = zero + 1;
                end
            end
        end
    end

处理效果:

为了画图,我们还必须记录统计的数据。可以使用一维数组进行记录。

% zeros = 自己定义一个数组,用于存储每一张图片 像素值为0的数目
total_zeros = zeros(1, img_num);
% ones = 自己定义一个数组,用于存储每一张图片 像素值为1的数目
total_ones = zeros(1, img_num);
total = zeros(1, img_num);
x_labels = 1:img_num;
img_names = [];

并在统计的过程中,对数组的数值进行更新

        [M,N] = size(bw); % 图像大小 M N 表示图像的长和宽
        total(j) = M*N; % 第j个图像的总像素点数目
        zero = 0;  % 第j个图像的像素点为0 的数目
        one = 0; % 第j个图像的像素点为1 的数目
        for m=1:M
            for n=1:N
                if bw(m,n) > 0 % 此处使用二维矩阵的方式访问图像的某一个像素点, 如果对应的位置数值大于0,one 加1
                    one = one + 1;
                else % 如果对应的位置数值等于0,zero加1
                    zero = zero + 1;
                end
            end
        end
        total_zeros(j) = zero;
        total_ones(j) = one;

最后,根据统计的结果进行画图。总的代码汇总如下:

clear;
clc;
input_path = 'E:\test1\';%目标图片文件夹路径
output_path = 'E:\test2\';%输出文件夹路径
img_path_list = dir(strcat(input_path,'*.jpg'));
img_num = length(img_path_list); % 对应文件夹下.jpg类型图像的数目

% zeros : 定义一个数组,用于存储每一张图片 像素值为0的数目
total_zeros = zeros(1, img_num);
% ones : 定义一个数组,用于存储每一张图片 像素值为1的数目
total_ones = zeros(1, img_num);
% total : 定义一个数组,用于存储每一张图片 总像素值的数目
total = zeros(1, img_num);

x_labels = 1:img_num; % 横坐标的范围
img_names = []; % 存储修改之后图像的名称
if img_num > 0  % 如果文件夹中的图片数目大于0
    for j = 1:img_num
        image_name = img_path_list(j).name; % 利用索引j获取当前图像的文件名,该文件名不包含
        I = imread(strcat(input_path,image_name)); % 根据 路径名 + 文件名 读取图像
        I = rgb2gray(I); %orgb2gray 转换成灰度图
        threshold =  graythresh(I); % 设置二值化图片的阈值
        % threshold = 0.5; % 手动设置阈值
        bw = im2bw(I,threshold); % 根据阈值 对图片I进行二值化操作
        md_name = strcat('md', image_name);  % 修改后的文件名设置,此文件名,不包含路径的文件名
        img_names{j} = md_name;
        saved_name = strcat(output_path, md_name); % 修改之后的图片的完整文件名: 路径名 + 文件名
        
        imwrite(bw, saved_name);%将处理后的图片保存到目标文件夹
        [M,N] = size(bw); % 图像大小 M N 表示图像的长和宽
        total(j) = M*N; % 第j个图像的总像素点数目
        zero = 0;  % 第j个图像的像素点为0 的数目
        one = 0; % 第j个图像的像素点为1 的数目
        for m=1:M
            for n=1:N
                if bw(m,n) > 0 % 此处使用二维矩阵的方式访问图像的某一个像素点, 如果对应的位置数值大于0,one 加1
                    one = one + 1;
                else % 如果对应的位置数值等于0,zero加1
                    zero = zero + 1;
                end
            end
        end
        total_zeros(j) = zero;
        total_ones(j) = one;
    end
        
    % 这边是你需要把zeros\ones 这两个数组 画成折线图的形式。
    % 打印名称
    disp(total_zeros);
    disp(total_ones);
    disp(total);
    disp(img_names);
    disp(x_labels);
    
    figure
    plot(x_labels,total_zeros,'-*',x_labels, total_ones,'-o', x_labels, total, '-<');
    % 设置折线上面的数值
    for i = 1:img_num
        text(i,total_zeros(i),num2str(total_zeros(i)));  
        text(i,total_ones(i),num2str(total_ones(i)));  
        text(i,total(i),num2str(total(i)));  
    end
    % 设置图例的名称
    legend('count of 0', 'count of 1', 'total');
    % 设置坐标轴的名称
    ylabel('像素点的数目');
    xlabel('图像名称');
    grid on;
    % 设置横坐标的数值
    set(gca,'xtick', x_labels);
    % 设置横坐标数值对应的标签
    set(gca,'xticklabel',img_names);
end 

统计结果:参考参考                                

参考文献:

[1] matlab读取文件夹下jpg图片并计算每个图片白色像素点数量_百度知道

[2] matlab画图,标注数据点的数值,自定义坐标轴_风云色变_新浪博客

[3] MATLAB的PLOT函数线型设置及横坐标为字符串的代码实例 - mat_wu - 博客园

创作不易,若有心赞助不胜感激~

 

  • 25
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C__Try

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值