matlab灰度变换相关的学习笔记

前言

  最近读了《冈萨雷斯 数字图像处理》有关灰度变换部分的相关内容,想借此做个学习笔记。

RGB图像

  matlab中彩色图像通过RGB图像来表示。RGB图像中的RGB分别表示红、绿、蓝三种颜色。可以将RGB图像看成一个M×N×3的三维矩阵,其中M、N分别表示图像的高和宽。若一幅RGB图像的类型为double型,它的取值范围是[0,1];若类型为uint8,它的取值范围是[0,255]。

matlab灰度变换相关的学习笔记

  matlab中提取rgb图像不同颜色分量的代码:

>>fr = rgb_image(:,:,1);
>>fg = rgb_image(:,:,2);
>>fb = rgb_image(:,:,3);

灰度化

  如果在matlab中将rgb图像其中一个颜色的分量单独作为一幅M×N的图像来显示,得到的图像会是怎样的呢?例如将红色分量作为一幅图像,结果会不会是一幅“红色的图像”呢?答案是:不会。显示的图像是一幅类似黑白照片的图像。
  当一幅rgb图像每一个点的三个彩色分量的值都相等,即R=G=B。我们就可以用其中一维来表示这个图片,因为三个分量都相等。这一个过程就叫做“灰度化”,灰度化以后得到的图片矩阵会从3维降至2维,这张图片看起来也是黑白的。
  常用的灰度化方法有分量法、最大值法、均值法、加权平均法。在此着重介绍加权平均法。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。
  加权平均法的表达式:f(i,j)=0.2989R(i,j)+0.5870G(i,j)+0.1140B(i,j)。matlab提供了rgb2gray()函数进行了灰度化,其原理就是加权平均法。

rgbImage = imread('Lena.jpg');
grayImage=rgb2gray(rgbImage);
subplot(1,2,1);imshow(rgbImage);title('RGB图像');
subplot(1,2,2);imshow(grayImage);title('灰度图像');

matlab灰度变换相关的学习笔记

灰度变换背景知识

  RGB灰度变换是一种“空间域”的操作,即直接对图像进行具体的操作。灰度变换的作用就是让图片看起来更加清晰,为二值化和边缘检测等操作打下基础。
  RGB图像经过灰度化以后得到M×N灰度图像。可以将其看成一个定义域离散的二元函数f(i,j),其中i,j分别是M、N之间的正整数;f(i,j)表示灰度值,图像类型不同值域不同。大家可以想象有很多长短不同的牙签紧密插在泡沫塑料板的样子,大概图像如下图。

matlab灰度变换相关的学习笔记

  如果用数学式子表示,即为:g(i,j) = T[f(i,j)];其中g(i,j)是处理后的图像;f(i,j)是处理前的图像;T[ ]是处理手段,这些手段是各种各样的,可以根据需要进行调整。例如,如果您觉得某个区域内的“牙签”太长,可以对其进行“修剪”,于是这个区域的灰度值减少了。或者您觉得某个区域“牙签”长短的差距不明显,其实可通过让长的“牙签”变更长,短的“牙签”变更短的思路实现差距明显化。

灰度变换方法

  如前文提及,灰度变换的本质就是对图像的灰度值进行修改。虽然我们可以逐个逐个像素点进行修改,但是工作量很庞大。以下将介绍一种典型的思路。
  我们知道T[ ]是变换的手段,如果我们想让图片中亮的更亮,暗的更暗,可以将原图像通过一个映射关系得到处理后的图像。这个映射关系就是T[ ]。
  matlab当中常用的灰度变换函数是imadjust(I,[low_in; high_in],[low_out; high_out],gamma)。这个函数的具体参数就不作具体说明了。它的映射关系如下图所示:

matlab灰度变换相关的学习笔记

  gamma的取值不同,曲线的陡峭程度也不同。

matlab灰度变换相关的学习笔记

  以图(c)的曲线为例子进行说明,上图的横坐标为原图像的灰度值,纵坐标为输出图像的灰度值,假设定义域和值域均为[0,255]。

matlab灰度变换相关的学习笔记

  上图是一张需要进行灰度变换的灰度图。先从左上角第一个像素开始,该像素的灰度值为254。对该像素进行图(c)所示的映射,可得254经过变换后得到的值为255。然后下一个像素的灰度值为143,对其进行映射,得到的值是一个比143要少的数。该点实际上变暗了。当gamma小于1的时候,进行的处理就是将原图像变暗。

rgbImage = imread('Lena.jpg');
grayImage=rgb2gray(rgbImage);
J1 = imadjust(grayImage,[0 1],[0 1],2.5);
J2 = imadjust(grayImage,[0 1],[0 1],1.5);
J3 = imadjust(grayImage,[0 1],[0 1],0.67);
J4 = imadjust(grayImage,[0 1],[0 1],0.4);
subplot(1,5,1);imshow(J1);title('gamma=2.5');
subplot(1,5,2);imshow(J2);title('gamma=1.5');
subplot(1,5,3);imshow(grayImage);title('原灰度图像');
subplot(1,5,4);imshow(J3);title('gamma=0.67');
subplot(1,5,5);imshow(J4);title('gamma=0.4');

matlab灰度变换相关的学习笔记

  我们还可以根据自己的需要,将灰度变换曲线定义为如下几种关系。所以说,变换的手段是各种各样的。

matlab灰度变换相关的学习笔记

灰度直方图

  灰度直方图是统计图片灰度分布的图像,其横坐标是灰度值,纵坐标是该灰度值的数量。imhist()函数能绘制灰度直方图。

rgbImage = imread('Lena.jpg');
grayImage=rgb2gray(rgbImage);
subplot(1,2,1);imshow(grayImage);title('原灰度图像');
subplot(1,2,2);imhist(grayImage);title('灰度直方图');

matlab灰度变换相关的学习笔记

  将原灰度直方图和gamma=0.4的灰度直方图进行对比,变换后灰度值较大的像素数量变多,灰度值较小的像素数量变少,图像整体呈现变亮。

matlab灰度变换相关的学习笔记

相关推荐