文章目录
Matlab统计图片中不同颜色小球个数
有这么一幅照片,需要我们数出图片中蓝色小球、红色小球和绿色小球的个数。
Matlab代码
clc
clear all
close all
%读取照片
I = imread('test.jpg');
figure(1); imshow(I);
%去除上边缘
% figure(2); imshow(I(74:end,:,:));
%去除下边缘
% figure(3); imshow(I(1:end-101,:,:));
%去除左边缘
% figure(4); imshow(I(:,101:end,:));
%去除右边缘
% figure(5); imshow(I(:,1:end-117,:));
%划分区域
II = I(74:end-101,101:end-117,:);
% figure(6); imshow(II);
%找每个球的重点
x = II(30,:,1);
% figure(7);imshow(x);
ind_x = find(x<35);
for i = 1:length(ind_x)-1
det_x(i) = ind_x(i+1)-ind_x(i);
end
y = II(:,1,1);
% figure(8); imshow(y)
ind_y = find(y<200);
for i = 1:length(ind_y)-1
det_y(i) = ind_y(i+1)-ind_y(i);
end
disp('共有小球个数:')
length(ind_x)*length(ind_y)
%判断颜色
red = 0;
green = 0;
blue = 0;
for i = 1:length(ind_y)
for j = 1:length(ind_x)
%进行判断
if (II(ind_y(i),ind_x(j),1)>II(ind_y(i),ind_x(j),2) ...
&& II(ind_y(i),ind_x(j),1)>II(ind_y(i),ind_x(j),3))
red = red+1;
else if(II(ind_y(i),ind_x(j),3)>II(ind_y(i),ind_x(j),1) ...
&& II(ind_y(i),ind_x(j),3)>II(ind_y(i),ind_x(j),2))
blue = blue+1;
else if (II(ind_y(i),ind_x(j),2)>II(ind_y(i),ind_x(j),1) ...
&& II(ind_y(i),ind_x(j),2)>II(ind_y(i),ind_x(j),3))
green = green+1;
end
end
end
end
end
fprintf('红球个数:%d\t',red)
fprintf('绿球个数:%d\t',green)
fprintf('蓝球个数:%d\t',blue)
运行结果
通过Matlab的处理,成功数出图片中三种不同颜色的小球个数。
(没错,我人工数了一遍进行结果检验😊)
设计算法对不同颜色小球个数进行统计
读取照片进行预处理
图片中有黄色的边缘小球,这部分颜色小球的个数不用去计数,为了方便后续其他颜色小球的计数,我人工设置图片的行数和列数,去掉了黄色边缘。
我们先看看预处理后的照片长啥样子的。
没错,长得是介个样子。
放大🔍看看,可以看见每一个小球都是按照某种规律分布滴。
如何精确找出各个小球位置
通过观察上面图片的部分区域放大图,我们可以看见每一个小球都是有边缘范围的并且部分行每一个小球的上边缘范围和部分列每一个小球的左边缘范围都只含有一个像素(以预处理过的图像第30行和第434列为例,我们可以看一下图片的上边缘细节图)
只要我们记录好第30行的蓝色像素点位置和第434列的像素点位置,那么我们就可以确定每一个小球的中心位置,即每一个中点代表着一个小球。
确定小球位置代码
x = II(30,:,1); %行处理
figure(7);imshow(x);
ind_x = find(x<35); %设置阈值判定小球上边缘点
y = II(:,1,1); %列处理
% figure(8); imshow(y);
ind_y = find(y<200); %设置阈值判定小球左边缘点
如何通过计算机识别不同颜色小球
首先我们先来理解计算机对图像处理的过程。
从数字图像获取过程可以知道,一幅图像由M(列)*N(行)个取样点组成,每个取样点是组成图像的基本单位,成为像素(Pixel或Pel)。彩色图像的像素通常由R、G、B这三个分量组成,灰度图像的像素只有一个亮度分量。
由此可知,数字图像在计算机中的表示方法是:会读图像用一个矩阵来表示;彩色图像用一组(一般是三个)矩阵来表示。每个矩阵成为一个位平面。矩阵的行数称为图像的垂直分辨率,列数据称为图像的水平分辨率,矩阵中的元素是像素颜色分量的亮度值,通常它是一个8位至12位的二进制数。
为了对小球进行计数,我们需要将其与背景的白色区域区分开来。
三通道的情况下,红色RGB为[255 0 0],绿色RGB为[0 255 0],蓝色RGB为[0 0 255]。
读取单通道图片情况下黑色为0,白色为255。
上面已经确定了各个小球的中心点,此刻我们需要设置不同通道的相应阈值来判定小球颜色。
对小球颜色进行判别代码
for i = 1:length(ind_y)
for j = 1:length(ind_x)
%进行判断
if (II(ind_y(i),ind_x(j),1)>II(ind_y(i),ind_x(j),2) ...
&& II(ind_y(i),ind_x(j),1)>II(ind_y(i),ind_x(j),3))
red = red+1; %红球判定
else if(II(ind_y(i),ind_x(j),3)>II(ind_y(i),ind_x(j),1) ...
&& II(ind_y(i),ind_x(j),3)>II(ind_y(i),ind_x(j),2))
blue = blue+1; %蓝球判定
else if (II(ind_y(i),ind_x(j),2)>II(ind_y(i),ind_x(j),1) ...
&& II(ind_y(i),ind_x(j),2)>II(ind_y(i),ind_x(j),3))
green = green+1; %绿球判定
end
end
end
end
end
这个实例只是简单的通过像素点的RGB分量来识别小球颜色。
假如图中的小球不规律分布,那么我们该如何找出小球位置,并且对其精准计数呢?这个问题有待大家讨论~
写在最后:
I’m sorry, Kuang Wantong. I let you down. I’m not a passing boyfriend.
–zhh
2020.08.12