基于Matlab的图像RGB色彩均值计算
代码如下:
%% 读取图像
clc,clear,close all;
pic = imread('vege2.jpg');
figure;
subplot(2,2,1),imshow(pic),title('原图'); %显示原图
[rows, cols, colors] = size(pic);
pic_gray = zeros(rows, cols);
pic_gray = uint8(pic_gray);
for i = 1:rows
for j = 1:cols
I(i, j) = pic(i, j, 1)*0.30 + pic(i, j, 2)*0.59 + pic(i, j, 3)*0.11;
end
end
subplot(2,2,2),imshow(I),title('平均值灰度化');
%% 检测整个叶片
[~,threshold] = edge(I,'sobel');
fudgeFactor = 0.7;
BWs = edge(I,'sobel',threshold * fudgeFactor);
subplot(2,2,3),imshow(BWs),title('二元梯度掩膜');%显示生成的二元梯度掩膜
%% 膨胀图像
se90 = strel('line',3,90);
se0 = strel('line',3,0);
BWsdil = imdilate(BWs,[se90 se0]);
subplot(2,2,4),imshow(BWsdil),title('膨胀梯度掩膜')
%% 填补内部空隙
BWdfill = imfill(BWsdil,'holes');
figure;
subplot(2,2,1),imshow(BWdfill),title('填充后的图像');
%% 删除边界上的连通对象
BWnobord = imclearborder(BWdfill,4);
subplot(2,2,2),imshow(BWnobord),title('删除边界连通对象');
%% 平滑处理对象
seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
subplot(2,2,3),imshow(BWfinal)
title('平滑后的图像');
%% 求RGB均值
S = sum(sum(BWfinal == 1));%分母
target = find(BWfinal == 0);%确定目标区域
R = pic(:,:,1);
G = pic(:,:,2);
B = pic(:,:,3);
R(target) = 0;
G(target) = 0;
B(target) = 0;
SR = sum(sum(R));
SG = sum(sum(G));
SB = sum(sum(B));
AR = SR/S;
AG = SG/S;
AB = SB/S;
其中aR,aG,aB分别为图像的R,G,B均值。
运行结果如下:
实验所用的图片:
这里可以看到求出来的色彩均值分别是124,122和76.
整个求解过程中最核心的部分就是将所求的图像与背景进行分离,可以看到,从分离图像的代码占据了总代码量的2/3.这里所使用的图像分割技术来源于MathWorks的帮助文档。这里我想重点分享的是完成分离后如何计算图像的RGB色彩分量(请不要嫌我太啰嗦……)
S = sum(sum(BWfinal == 1));%分母
target = find(BWfinal == 0);%确定目标区域
R = pic(:,:,1);
G = pic(:,:,2);
B = pic(:,:,3);
R(target) = 0;
G(target) = 0;
B(target) = 0;
让我们回到代码上,上述代码所完成的最重要的功能就是将目标区域,也就是图片中叶子的部分和背景进行了二值化的区分,其实质也是在对图像进行分割(所以我才会说“整个求解过程中最核心的部分就是将所求的图像与背景进行分离”)。
从图片中我们可以看到,BWfinal此时已经变成了一张logical图,其中叶子部分是白色的(数值1),背景部分是黑色的(数值0),而我们需要做的仅仅是将logical图中的1,映射到原始图片中的RGB通道即可。
S = sum(sum(BWfinal == 1));
就是在求logical图中有多少个1.
target = find(BWfinal == 0);
target所找的就是背景所在的像素位置
R(target) = 0;
G(target) = 0;
B(target) = 0;
这里将背景置为0,然后就可以安心、大胆的计算剩余像素值的和,反正除了我们需要的像素就是0,对计算结果没有影响。
SR = sum(sum(R));
SG = sum(sum(G));
SB = sum(sum(B));
AR = SR/S;
AG = SG/S;
AB = SB/S;
这里就是按照求平均值的公式进行最后的计算了。
这是新手的第一篇Blog,如有纰漏还请各路大神不吝赐教!