基于Matlab的图像RGB色彩均值计算 您所在的位置:网站首页 MATLAB转换为灰度图像 基于Matlab的图像RGB色彩均值计算

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

2023-05-28 11:47| 来源: 网络整理| 查看: 265

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有