../主页

关于矩阵在图片处理中的应用

前几天在看到国外一个讲线性代数的网站,里面有一个关于矩阵的小应用,个人觉得非常好玩,所以决定在matlab中试试,然后发到我的博客上,嘻嘻。

原理讲解

图片的构成

这里所说的图片指的是位图,就是用像素点构成的图片,你用放大镜看手机或者电脑屏幕,会看到好多密密麻麻的小点就是像素点,但是同时你也会考到有红绿蓝三种颜色的小点,类似于下面图片所示。图片其实就是这样显示出来的。

这里是像素排列的图片

所以图片就可以看作是许多这样的小像素点,每个像素点由三种颜色组成(其实就是光的三原色,注意不是画画的三原色)。然后我们就可以将每个像素点看作是一个三维向量(Vector3),然后用3x3的矩阵就可以对每个像素点操作,进而对图片进行操作。

矩阵乘法

对像素点操作需要用到矩阵乘法

代码实现

这里语言我选择matlab,毕竟是数学知识嘛

将图片变成黑白图片

% Process picture

clear
P = imread("./flower.png"); % Read Picture
I2 = im2double(P); %Convert uint8 to float ranged with [0, 1]
[m, n, b] = size(I2); %Matrix dimension,m by n by b size matrix
operator = [0.3 0.6 0.1; 0.3 0.6 0.1; 0.3 0.6 0.1]; % op

for i = 1:m
    for j = 1:n
        I2(i,j,:) = reshape(operator*reshape(I2(i,j,:), 3, 1), 1, 1, 3);
        % Multiply every dot with matrix
    end
end

% plot
subplot(1, 2, 1)
imshow(P)
subplot(1, 2, 2)
imshow(I2)

上面是代码,通过改变矩阵operator的值就可以对图片进行处理。

这里operator矩阵有相同的行(row),可以使r, g, b三个值相同,可以想象三个红绿蓝灯泡以相同的亮度亮,出来的颜色就是灰色,当然,灯泡的光强不同就造成了不同灰度的灰色,进而变成灰度图片。

这里是黑白变换的图片

当然改变矩阵每个行向量(row vector)的值可以实现不同灰度的图片,至于怎么改变,以后有机会再研究研究,写个博客。

让图片变红

将operator矩阵的第一行变成0.3, 0.4, 0.3, 其他行全部变成零,就可以将图片的的红色滤出来,矩阵会将第一个分量留下,其他变成零,图片自然就变成红色了。

这里是变换成红色的图片

让图片变成黄昏色

那么怎么将图片变成偏黄色的,相信聪明的你已经直到怎么做了,首先打开ps分析一手黄色有什么光的分量,可以看到,100%的红光,100%的绿光,50%的蓝光。

这里是ps中的黄色

那么矩阵相应的第一个行向量不变为[0.3 0.4 0.3], 第二个行向量变的与第一个一样,表示红光与绿光均为100%。第三个行向量为[0.15 0.2 0.15],表明50%的蓝色光强。Everything is down, let’s do it!

这里是怀旧色变换的图片

可以看到,很成功哈。

当图片碰上单位矩阵

可以得出,乘单位矩阵应该是什么都不会改变,这与单位阵的性质是一致的。不得不说,数学真的很神奇呢。