65.9K
CodeProject 正在变化。 阅读更多。
Home

在MatLab中将图像转换为灰度

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016年7月17日

CPOL

3分钟阅读

viewsIcon

41276

简要教程,介绍如何在MatLab中将RGB图像转换为灰度图像

引言

本文是一个关于如何在MatLab中将图像从RGB转换为灰度图像的教程,不使用内置函数。 这将使您了解MatLab如何处理图像层,并了解底层的RGB到灰度转换函数的工作原理……更重要的是,自己编写函数总是更有趣。

背景

将图像转换为灰度图像并了解如何操作有很多好处。 在我看来,将彩色图像转换为灰度图像的主要好处是它占用的空间大大减少。 如果您不熟悉图像在计算机中存储的方式,请让我解释一下。

RGB图像本质上是三个图像叠放在一起;一个红色比例图像,一个绿色比例图像和一个蓝色比例图像,每个像素都是8位(强度值范围为0-255)。 要存储RGB图像的单个像素,您需要为所有三种颜色存储8位,因此每个像素总共需要24位。

当您将此图像转换为灰度图像时,您只需要为灰度值存储每个像素的单个8位值。 您从每个像素的24位减少到8位,因此您的灰度图像将是原始图像的33%大小。

除了节省大量空间外,在许多不同的情况下使用灰度图像更有意义。 灰度图像在各种图像处理应用中更容易处理。 问问自己,对于计算机来说,处理包含三个颜色值层的图像还是包含单个层的图像更容易? 显然,是单层图像。 进一步说,仅处理单层图像时,更容易区分图像的特征。 因此,边缘检测、主成分分析、局部二值模式等过程不仅对计算机处理更容易,而且对您进行编码也更容易。

Using the Code

如果您以前从未接触过MatLab,语法可能会有些令人困惑,但不用担心,它并不难。 下面,您可以查看将RGB图像转换为灰度图像的函数。

function returnedImage = toGrayscale(image)
        i = image;
        R = i(:, :, 1);
        G = i(:, :, 2);
        B = i(:, :, 3);
        newImage = zeros(size(i,1), size(i,2), 'uint8');
        
        for x=1:size(i,1)
           for y=1:size(i,2)
               newImage(x,y) = (R(x,y)*.3)+(G(x,y)*.6)+(B(x,y)*.1);
           end
        end
        
        returnedImage = newImage;
end

第一步是将图像分离成三个不同的R、G和B的二维矩阵。 “R = i(:, :, 1);”的语法意味着您正在创建一个新的矩阵R并将其设置为图像i的第一层的所有行和列(希望这说得清楚)。 然后,您创建一个与原始图像大小相同的所有零的新图像。

之后,您只需循环遍历新图像的每个像素,并将该像素设置为相同位置的R、G和B像素之和乘以指定的权重。 如您所见,我的R乘以.3,G乘以.6,B乘以.1。 然后您返回图像。

您的第一个想法可能是简单地取所有三个像素的平均值并将其设置为灰度图像中的值,但事实证明这太暗了。 权重完全取决于您,您可以根据需要进行更改。 对于我的应用程序,我发现这种加权方案效果最好。

要实现,您可以编写如下代码

myImage = imread('faceplantImage.jpg');

figure
subplot(1,2,1);
imshow(myImage);
title('Original Image');

subplot(1,2,2);
grayScaleImage = toGrayscale(myImage);
imshow(grayScaleImage);
title('Grayscale Image');

从那以后,您可以看到您的完成的灰度图像与您的原始图像进行比较。

关注点

如果您是MatLab新手并有兴趣了解更多信息,这里有一个很棒的资源

© . All rights reserved.