之前做了一个铺垫,拿到了一张图片的rgb中最小的值,接下来还会涉及到几行代码,其中有些语法不太懂,但是发现去百度搜索的一些博客说的不太对,还是谨慎一点,不找野路子,再看看官方文档吧。
首先是:
darkc = min(im_min,[],3); %得到暗通道——im_min[][]r,g,b空间中的的最小值, darkc是一个270*480*1的矩阵,代表每个点的3维的最小值
得到rgb矩阵的最小值——三维缩成了一维。还是举个例子吧——所有的人都不喜欢看文字,看例子,一眼明了:
% 创建三维数组:
d1 = [1,2,3;4,5,6;7,8,9;];
d2 = [4,5,6;7,8,9;1,2,3;];
d3 = [7,8,9;1,2,3;4,5,6;];
im_min(:,:,1) = d1;
im_min(:,:,2) = d2;
im_min(:,:,3) = d3;
im_min
im_min = min(im_min,[],3)
运行结果如下:
接下来,第二行代码
[~, idx] = sort(darkc(:),1,'descend');
首先,darkc(:): Use A(:)
, the column representation of A.
darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;] % (3 * 3)的矩阵
darkc(:) = [ 7; 1; 2; 4; 3; 6; 5; 8; 9;] % (9 * 1)的矩阵
参数1在这里表示就是第一维度的排序。
(注: 在matlab中,一个矩阵从上到下为第一维,从左到右,为第二维。举个例子:
darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;] % (3 * 3)的矩阵
darkc(3)等于5而不是2, drakc(4)等于1而不是4 )
descend这么明显的参数就不用说了
那么idx是什么呢,就是index下标,直接举例子,浅显易懂:
darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]
[SortedDarkC, idx] = sort(darkc(:),1,'descend')
运行结果是:
darkc =
7 1 2
4 3 6
5 8 9
SortedDarkC =
9
8
7
6
5
4
3
2
1
idx =
9
6
1
8
3
2
5
7
4
idx是原来的矩阵元素对应的下标:
SortedDarkC [i] 恒等于 darkc[ idx[i] ];
那么上述语句中的 “~”又是什么鬼呢?应该就是不在乎的变量的意思吧。
再接下来,第三行代码:
sz = size(im); % x, y , 3(rgb)
idx = idx(1:int32(0.001*sz(1)*sz(2)));
sz(1) = 270, sz(2) = 480(图片像素) , 129.6通过in32转成了130
idx只保留了前130个值,注意到我们是降序排序,所以前130个值就是值最大的像素点的坐标。
再来扎心的第四个代码:
im_gray = rgb2gray(im); % 270 * 480 的二维矩阵
[~, idx] = max(im_gray(idx));
得先看看 im_gray(idx) 这个诡异的操作, 二维矩阵A(列向量) 是什么鬼。看个例子就能懂:
darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]
index = [6;5;4;3;2;1;];
Temp = darkc(index)
输出的是:
darkc =
7 1 2
4 3 6
5 8 9
Temp =
8
3
1
5
4
7
也就是说,二维矩阵A(列向量) 通过对应的下标,得到一个新的矩阵(在本例中是一个列向量)
再通过max取列向量中的最大值,也就是一个数字。此时idx就更新成为灰度图中灰度值最大的点在im_gray(idx)的坐标。
第4个代码:
tmp = reshape(im,[],3);
matlab的reshape函数,那么也弄一个例子看看:
d1 = [1,2,3;4,5,6;7,8,9;];
d2 = [4,5,6;7,8,9;1,2,3;];
d3 = [1,1,1;1,1,1;2,2,2;];
im(:,:,1) = d1;
im(:,:,2) = d2;
im(:,:,3) = d3;
im
tmp = reshape(im,[],3)
输出如下:
im(:,:,1) =
1 2 3
4 5 6
7 8 9
im(:,:,2) =
4 5 6
7 8 9
1 2 3
im(:,:,3) =
1 1 1
1 1 1
2 2 2
tmp =
1 4 1
4 7 1
7 1 2
2 5 1
5 8 1
8 2 2
3 6 1
6 9 1
9 3 2
揉成3列的数组。tmp也就是rgb图片按这个方式揉成的矩阵
最后一行代码:
A = double(tmp(idx,:));
tmp(idx,:) 是啥,那么再举一个例子,在上一个示例代码,再加一个操作:
A = tmp(3,:)
输出是:
tmp =
1 4 1
4 7 1
7 1 2
2 5 1
5 8 1
8 2 2
3 6 1
6 9 1
9 3 2
A =
7 1 2
根据之前得到的idx表示一个点的坐标,A就是一个点r , g, b的值!
虽然是这么得出A的值,但是我并不理解为什么A的值可以这么求呢,真奇怪,先放着。