基于Matlab的图像RGB色彩均值计算

基于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,如有纰漏还请各路大神不吝赐教!

  • 18
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值