一、数字图像的构成
在matlab
1、首先看一张灰度图
下图使用surf函数将一张随机生成的灰度图立体地展示了出来,可以看到越量的像素点对应的灰度值越大,灰度值在[0-255]之间波动

实际的灰度图就是用一个二维矩阵存储的,每个元素代表了亮暗程度,数值越大表示越量,上图的代码为:
img = round(rand(30, 30)*255);
img = kron(img, ones(20));
x = 1 : size(img, 1);
y = 1 : size(img, 2);
[X, Y] = meshgrid(x, y);
figure, surf(X, Y, img);
shading interp
colormap('gray');
set(gcf, 'color', [1 1 1])
2、再看一张彩色图
彩色图片使用3个二维矩阵存储的,每个矩阵分别代表了R、G和B三个分量的强度,对于uint8类型的图片,RGB矩阵的每个元素取值分为为[0-255],不同的RGB组合可以构成2^24中颜色,使用如下代码可以生成一张随机的彩色图:
img = zeros(500, 500, 3, 'uint8');
img(:, :, 1) = kron(round(255*rand(5, 5)), ones(100, 100));
img(:, :, 2) = kron(round(255*rand(5, 5)), ones(100, 100));
img(:, :, 3) = kron(round(255*rand(5, 5)), ones(100, 100));
figure, imshow(img)
第一行表示生成一个500x500x3的矩阵,用来存储RGB三个分量,类型是uint8;2-4行表示讲随机数赋值给RGB三个分量,kron表示将每个像素点放大100倍,于是我们就可以得到随机的彩色像素图啦:
我们可以使用以下函数,用鼠标点击图像像素点后,按下Enter键显示像素信息:
pixel = impixel(img)
二、图像数据类型
1、灰度图的构成
在数字图像处理中,比较常用的是灰度图,那么灰度图是如何生成的呢,这里给出一个公式:
G
r
a
y
=
R
∗
0.299
+
G
∗
0.587
+
B
∗
0.114
Gray = R*0.299 + G*0.587 + B*0.114
Gray=R∗0.299+G∗0.587+B∗0.114
可以看出绿色占的权重很大,这主要是因为人眼对绿色比较敏感
我们不妨使用上面的公式看看效果,注意在程序中,我们需要保证图像是uint8类型,所以需要对公式进行四舍五入。得到的效果和使用rgb2gray函数的效果完全一样:
img = imread('lena_color_512.tif');
R = double(img(:, :, 1));
G = double(img(:, :, 2));
B = double(img(:, :, 3));
Gray = round(R*299 + G*587 + B*114) / 1000; % 提高计算速度
Gray = uint8(Gray);
figure, imshow(Gray)
2、uint8类型
uint8类型的数据取值范围为[0-255]之间的整数,255表示白色,0表示灰色。如果要将一个double类型(取值范围为0-1)的图像转化为uint8类型,则可以通过以下两种方法实现:
img = uint8(img);
img = round(255 * img);
注意:由于uint8数据仅取整数值,所以需要加一个round函数四舍五入
3、double类型
double类型的图像像素取值范围为[0-1]的小数,0表示黑,1表示白,对图像的处理通常先将图像转化为double类型。
注意:matlab计算得到的图像都是double类型的图像,如果对一个uint8图像处理后直接imshow(),则会发现全白的效果,此时可以先将图像转化为double类型,在进行图像处理
img = imread('xxx.tif'); %uint8
img = im2double(img);
...
imshow(img)
此外,如果没有先进行类型转换,也可以使用 imshow(img, [])
来自动调整图像范围显示图像!
注意,上面使用了 im2double()
函数,im2double函数的功能为把unt8类型数据转化为double类型,相当于对图像每个像素点的值除以255;
如果对double类型数据进行im2double操作,则数据无任何变化!
3、logic类型
logic类型的图像是一种二值图像,数据只能取0和1,0表示黑,1表示白,在matlab中可以使用以下函数将意图图像转化为二值图像:
img = im2bw(img, threshold);
threshold表示阈值,取值范围为[0, 1]之间的浮点数,所以img应该是double类型图像, 当像素点的值大于阈值则为1,小于阈值则得到0,比如:
img = imread('lena_color_512.tif');
img = im2double(img);
img = im2bw(img, 0.6);
figure, imshow(img)
4、mat2gray()函数
mat2gray函数可以将任何一组数据归一化到[0, 1],这里的归一化是值归一化后数据最小为0,组大为1,注意,它和im2double不一样,将图像I归一化后得到img,可以通过下面的公式实现:
i
m
g
(
x
,
y
)
=
I
(
x
,
y
)
−
m
i
n
(
I
)
m
a
x
(
I
)
−
m
i
n
(
I
)
img(x, y) = \frac{I(x, y) - min(I)}{max(I)-min(I)}
img(x,y)=max(I)−min(I)I(x,y)−min(I)
当图像整体偏黑或者整体偏亮的时候,除了均衡化,还可以试试这个函数!
完结 cheers 🍻