目标:
- 批量处理RGB图像,对其进行二值化处理(需要考虑二值化的阈值设置,此处不展开)
- 统计二值化之后,各个黑白图像中0、1 的像素点数目
- 使用折线图的方式,展示出统计的结果
首先进行输入文件夹 与输出目标文件夹的路径定义:
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 - 博客园
创作不易,若有心赞助不胜感激~