今天,有人问了一个图片灰度的问题。大体上,他要求解图片中RGB色彩的最小值。我们都知道图片是由三个二维数组组成的,即由RGB等三个二维矩阵组成。所以,我们只需要将这个三维数组分解成三个二维数组,然后分别求解这三个二维数组的最值问题即可。
问题描述
下面,我们开始解决问题:
首先,我们需要读取图片,这里直接使用imread函数即可读取。然后,需要将这个三维矩阵分解成三个二维矩阵,可以使用(:,:,1)、(:,:,2)、(:,:,3),拆分成三个二维矩阵。然后就可以处理我们想解决的问题了。
刚开始,以为要求解RGB的三个二维矩阵中,RGB分别的最小值。这个问题,Matlab有函数处理,即min函数。之前,我们在Matlab求解最小值及最大值问题的文章,已经有过描述。
初次解决
大体上,可以使用如下代码实现:
%%
%清理工作区与命令区
clc
clear
close all
%%
%图片读取
I1 = imread('0827.jpg');
R=I1(:,:,1);
G=I1(:,:,2);
B=I1(:,:,3);
Rmin=min(min(R))
Gmin=min(min(G))
Bmin=min(min(B))
最终解决
后来发现不是求这个最值,而是求解每个像素点的RGB值中的最小值,即我们需要通过一个循环判断每个像素点上RGB三个值中最小的那个值,并将其存储位一个新的二维矩阵,下面直接上代码:
%%
%清理工作区与命令区
clc
clear
close all
%%
%图片读取
I1 = imread('0827.jpg');
figure(1)
imshow(I1)
I2 = rgb2gray(I1);
figure(2)
imshow(I2)
R=I1(:,:,1);
G=I1(:,:,2);
B=I1(:,:,3);
[i,j]=size(R);
for x=1:i;
for y=1:j;
RGB=[R(x,y),G(x,y),B(x,y)];
temp(x,y)=min(RGB);
end
end
temp;
figure(3)
imshow(temp)
上述代码中,我们使用imread将图片存储为一个三维矩阵,imshow显示了原图,使用rgb2gray将图片变为了灰度图,使用(:,:,1)、(:,:,2)、(:,:,3)将三维矩阵变为了三个二维矩阵,使用size求解了二维矩阵的行数及列数(即,一张图片的横向纵向像素个数),利用循环获取了每个像素点上三个RGB值得最小值,最后使用imshow输出这个新得图像。当然,我们也可以利用这种循环编辑一个新得公式,作为自己得灰度转换函数。
这段代码中,需要注意小括号及中括号得不同。大体上,可以认为小括号为元素,中括号为矩阵。
原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/277.html
评论列表(2条)
学习了
@ank:感谢支持